У меня работает прослушиватель сообщений Spring JMS. Но как только я перезапускаю JMS-брокер (используя здесь Wildfly), слушатель не может восстановиться, я получаю много предупреждений, подобных этому:
DefaultMessageListenerContainer: Не удалось настроить вызывающий прослушиватель сообщений JMS для пункта назначения my_queue - попытка восстановления. Причина: HQ119001: не удалось создать сеанс
Я подозреваю, что JNDI ConnectionFactory стал недействительным при перезапуске сервера Wildfly, но я не знаю, как "обновить" bean-компонент ConnectionFactory.
Я использую следующую конфигурацию:
@Configuration
public class ConnectionFactoryConfig {
// ... fields here
@Bean
public InitialContext initialContext() throws NamingException {
final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, namingIntitalContextFactory);
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, jnpProviderUrl);
env.put(Context.SECURITY_PRINCIPAL, jmsUsername);
env.put(Context.SECURITY_CREDENTIALS, jmsPassword);
return new InitialContext(env);
}
@Bean
public SingleConnectionFactory connectionFactory(InitialContext initialContext) throws NamingException {
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup(jmsConnectionFactory);
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(connectionFactory);
userCredentialsConnectionFactoryAdapter.setUsername(jmsUsername);
userCredentialsConnectionFactoryAdapter.setPassword(jmsPassword);
return new SingleConnectionFactory(userCredentialsConnectionFactoryAdapter);
}
}
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
}
@Configuration
@RequiredArgsConstructor
public class JmsListenerConfig implements JmsListenerConfigurer {
private static final String RESPONSE_QUEUE_NAME = "my_queue";
private final JmsInterface jmsInterface;
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
SimpleJmsListenerEndpoint endpointListener = new SimpleJmsListenerEndpoint();
endpointListener.setId(RESPONSE_QUEUE_NAME + "endpoint");
endpointListener.setDestination(RESPONSE_QUEUE_NAME);
endpointListener.setMessageListener(jmsInterface);
registrar.registerEndpoint(endpointListener);
}
}
Слушатель должен иметь возможность восстановиться после перезапуска Wildfly и продолжить получать сообщения JMS.