Не удается установить управляемый контекст hazelcast при использовании Jet.bootstrappedInstance()

#spring #hazelcast #hazelcast-jet

Вопрос:

Я хочу запустить hazelcast-jet встроенное в мое приложение spring (т. Е. кластер находится в процессе / НЕ удален). Я также хочу, чтобы мои задания jet могли получать доступ к компонентам spring из ApplicationContext (см. Документы jet/spring). Я не хочу настраивать путь к классу для каждого задания jet, я хочу использовать путь к классу начальной загрузки JVM.

Я думаю, что мне нужно использовать Jet.bootstrappedInstance() , чтобы получить a JetInstance , но это НЕ позволяет мне установить значение ManagedContext на базовом HazelcastInstance . В документах Jet.bootstrappedInstance() подробно описано, как я хочу взаимодействовать с Jet

Когда вы отправляете задание экземпляру Jet, который выполняется локально в вашей JVM, в нем будут доступны все классы зависимостей

Я пробовал это:

 @Bean
public ManagedContext managedContext() {
   return new SpringManagedContext();
}
@Bean
public JetInstance jet(ManagetContext managedContext, List<Pipeline> pipelines) {   ​
   JetInstance jet = Jet.bootstrappedInstance();
   jet.getHazelcastInstance().getConfig().setManagedContext(managedContext);
   ...
   return jet;
}
 

Но я получаю следующее исключение

 Caused by: java.lang.UnsupportedOperationException: Unsupported operation
    at com.hazelcast.internal.dynamicconfig.DynamicConfigurationAwareConfig.setManagedContext(DynamicConfigurationAwareConfig.java:981)
 

Пожалуйста, обратите внимание, что обычный способ вызова setManagedContext(…) выглядит следующим образом

    JetConfig config = new JetConfig();
   config.configureHazelcast(hz -> hz.setManagedContext(managedContext));
   JetInstance jet = Jet.newJetInstance(config);
 

Я не могу найти способ сочетаться Jet.bootstrappedInstance() с Config.setManagedContext(ManagedContext)

В качестве обходного пути я скопировал код из JetBootstrap.createStandaloneInstance() (частного метода) и добавил hzConfig.setManagedContext(managedContext)

   JetConfig config = ConfigProvider.locateAndGetJetConfig();
  Config hzConfig = config.getHazelcastConfig();
  
  // turn off all discovery to make sure node doesn't join any existing cluster
  hzConfig.setProperty("hazelcast.wait.seconds.before.join", "0");
  hzConfig.getAdvancedNetworkConfig().setEnabled(false);
  hzConfig.setManagedContext(managedContext);
  
  JoinConfig join = hzConfig.getNetworkConfig().getJoin();
  join.getAutoDetectionConfig().setEnabled(false);
  join.getMulticastConfig().setEnabled(false);
  join.getTcpIpConfig().setEnabled(false);
  join.getAwsConfig().setEnabled(false);
  join.getGcpConfig().setEnabled(false);
  join.getAzureConfig().setEnabled(false);
  join.getKubernetesConfig().setEnabled(false);
  join.getEurekaConfig().setEnabled(false);
  join.setDiscoveryConfig(new DiscoveryConfig());
  JetInstance jet = Jet.newJetInstance(config);  
 

Ответ №1:

Я хочу запустить hazelcast-jet, встроенный в мое приложение spring (я не хочу отправлять задания в удаленный кластер jet).

В этом случае использование bootstrapInstance() не имеет смысла. Он был разработан для работы с bin/jet submit командой, в которой создается экземпляр клиента в соответствии с config/hazelcast-client.yaml или автономным экземпляром для тестирования из вашей среды разработки.

Для использования Jet embedded вы можете использовать конфигурацию на основе аннотаций или, в качестве альтернативы, вы можете использовать загрузочный стартер Hazelcast Jet Spring.

Комментарии:

1. Я использую аннотации spring для настройки своих компонентов (см. Код выше). Если я использую JetInstance логику из вашей ссылки, каждый раз, когда я отправляю задание, я должен убедиться, что в нем есть правильные классы (через JobConfig.addClass(...) или JobConfig.addPackage(...) и т. Д.). Я хочу использовать JetBootstrap.createStandaloneInstance() логику (см. Мой обходной путь), которая означает, что мне не нужно настраивать путь к классам для каждого задания, вместо этого задание имеет доступ к пути к классам начальной загрузки

2. Итак, вы отправляете работу из приложения или извне?

3. Я делаю все внутри, я в основном пытаюсь использовать jet аналогично apache-camel или spring-integration

4. Если вы отправляете задание из той же JVM, вам не нужно добавлять какие-либо классы или пакеты, они просто находятся в пути к классам.

5. Неверно, я получаю ClassNotFoundExceptions