#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