#ignite
#воспламенить
Вопрос:
Не уверен, существует ли java.util.concurrent.Реализация CompletionService обеспечивается Ignite, как и в Infinispan (org.infinispan.distexec.DistributedExecutionCompletionService),
Редактировать:
Вот пример кода, который не работает при запуске в распределенном режиме (в трех терминалах)
public void run(boolean isMaster, final String nodeName) throws Exception {
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setGridName(nodeName);
Ignite ignite = Ignition.start(cfg);
if (isMaster) {
CompletionService<String> service = new ExecutorCompletionService<String>(ignite.executorService());
for (int i = 0; i < 10; i ) {
service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("Executing ");
return String.valueOf(new Random().nextInt(10));
}
});
}
for (int i = 0; i < 10; i ) {
Future<String> f = service.take();
System.out.println(f.get());
}
}
System.out.println("Ctrl D/Ctrl Z to stop.");
}
Терминал #1
mvn test-compile exec:java -Djava.net.preferIPv4Stack=true -Dexec.mainClass="com.github.dexecutor.ignite.Node" -Dexec.classpathScope="test" -Dexec.args="s node-A"
Вывод
[22:29:59] Topology snapshot [ver=3, servers=3, clients=0, CPUs=4, heap=5.3GB]
Executing
Executing
Executing
Завершающий #2
mvn test-compile exec:java -Djava.net.preferIPv4Stack=true -Dexec.mainClass="com.github.dexecutor.ignite.Node" -Dexec.classpathScope="test" -Dexec.args="s node-B"
Вывод
[22:29:59] Topology snapshot [ver=3, servers=3, clients=0, CPUs=4, heap=5.3GB]
Executing
Executing
Executing
Терминал # 3: Мастер
mvn test-compile exec:java -Dexec.classpathScope="test" -Djava.net.preferIPv4Stack=true -Dexec.mainClass="com.github.dexecutor.ignite.Node" -Dexec.args="m node-C"
Вывод
[22:29:59] Topology snapshot [ver=3, servers=3, clients=0, CPUs=4, heap=5.3GB]
Executing
Executing
6
2
Executing
4
Executing
3
Он должен напечатать еще 6 случайных целых чисел, однако он блокируется навсегда
Вот весь проект, следуйте инструкциям в классе узла
Примечание: я смог получить функцию CompletionService, используя ‘igniteCompute.call’ и ‘igniteCompute.future ().listen(newListener ());’, однако я не думаю, что это эффективно. Обратитесь к этому, например
Ответ №1:
Ignite обеспечивает реализацию ExecutorService
, поэтому вы можете использовать ExecutorCompletionService
включенный в JDK.
CompletionService<Object> service =
new ExecutorCompletionService<>(ignite.executorService());
Комментарии:
1. @valetin, я обновил вопрос с более подробной информацией, надеюсь, это поможет
2. Можете ли вы поделиться своим тестовым проектом?
3. Похоже
ExecutorCompletionService
, реализован очень странным образом и не может использоваться в распределенных средах. Я создал тикет для реализации в Ignite: issues.apache.org/jira/browse/IGNITE-4093 . Не стесняйтесь подбирать его, это должно быть хорошим вкладом в Ignite и не должно быть очень сложным.4. Мы должны убедиться, что в реализации используется распределенная очередь блокировки … в противном случае реализация снова будет нарушена… Это относится к Infinispan… В настоящее время не предоставляется один (распределенная очередь блокировки), Hazelcast предоставляет один, но он действительно не распространяется.