Spring JMS: восстановление приемника сообщений JMS при перезапуске JMS Broker (Wildfly HornetQ) - PullRequest
0 голосов
/ 10 июля 2019

У меня работает прослушиватель сообщений 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...