Я настраиваю надежного потребителя тем JMS, используя SpringBoot и activeMQ. Я смог заставить все работать (успешно работает как надежный потребитель), используя аннотацию весенней загрузки @JmsListener. Но поскольку я хотел бы динамически создавать прослушиватели, я пытаюсь создать их с использованием интерфейса JmsListenerConfiguraion.
Используя приведенный ниже код, получатель темы успешно создан и использует сообщения. Но проблема в том, что созданный им потребитель не долговечен. Я устанавливаю clientId, для setSubscriptionDurable значение true, а для setPubSubDomain устанавливается значение true на заводе. Чего мне не хватает?
@Configuration
@EnableJms
public class ListenerConfigurer implements JmsListenerConfigurer {
@Autowired
private List<JmsListenerConfig> listenerConfigs;
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
for(JmsListenerConfig jmsListenerConfig : listenerConfigs) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId(jmsListenerConfig.getEndpointName());
endpoint.setDestination(jmsListenerConfig.getEndpointName());
endpoint.setMessageListener(message -> {
TextMessage txtMessage = (TextMessage) message;
try {
jmsListenerConfig.getMessageReceiveHandler().handle(txtMessage.getText());
}catch (JMSException e){
e.printStackTrace();
}
});
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
factory.setClientId(jmsListenerConfig.getClientUid());
DefaultMessageListenerContainer container = factory.createListenerContainer(endpoint);
endpoint.setupListenerContainer(container);
registrar.registerEndpoint(endpoint, factory);
registrar.setContainerFactory(factory);
}
}
}