У нас есть приложение, использующее Spring Boot и его средство JMS. Во время выполнения у нас есть разные производители, которые подключаются к сети и сообщают нашему приложению название темы или очереди для прослушивания. Прямо сейчас у нас есть:
@JmsListener(destination = "helloworld.q")
public void receive(String message) {
LOGGER.info("received message='{}'", message);
}
, который работает, когда мы отправляем сообщение в тему helloworld.q
. Проблема в том, что мы не будем знать, каким будет название темы до времени выполнения, а JmsListener
, похоже, хочет иметь постоянное выражение.
Производители сообщений подключатся к нашему экземпляру ActiveMQ и передадут сообщение, сообщающее нам, что нам нужно начать слушать их темы, такие как «Васаби», «Белая бумага», «Спутник-майор», «BigBoosters» и т. Д. чтобы знать во время выполнения, какие темы нам нужно начать слушать.
Я прочитал документацию Spring, которая объясняет, как слушать темы / очереди во время выполнения (вроде):
@Configuration
@EnableJms
public class ReceiverConfig implements JmsListenerConfigurer {
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId("myJmsEndpoint");
endpoint.setDestination("anotherQueue");
endpoint.setMessageListener(message -> {
// processing
});
registrar.registerEndpoint(endpoint);
}
// other methods...
}
Я добавил это в нашу конфигурацию Receiver в качестве теста, и он вызывается, когда мы отправляем сообщение. Проблема в том, что Spring заставляет все эти вещи вызываться автоматически, и мы не знаем, где и как дать этому методу имя темы / очереди, которую конечная точка должна прослушивать. Кроме того, слушатель сообщения, кажется, никогда не вызывается, но это отдельная проблема; Я уверен, что мы сможем решить эту проблему, если мы хотя бы сможем отправить пользовательскую тему или очередь для прослушивания.
Мы используем Spring 2. x .