Запустить java.util.concurrent.Реализация CompletionService

#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 предоставляет один, но он действительно не распространяется.