如何使用Spring Boot收听动态目的地?

我们有一个使用Spring

Boot及其JMS工具的应用程序。在运行时,我们有不同的生产者在线跳转,并告诉我们的应用程序主题名称或要收听的队列。现在,我们有:

@JmsListener(destination = "helloworld.q")

public void receive(String message) {

LOGGER.info("received message='{}'", message);

}

当我们向该helloworld.q主题发送消息时,该方法有效。问题是,直到运行时,我们才知道主题的名称,并且JmsListener似乎想要一个常量表达式。

消息生产者将进入我们的ActiveMQ实例,并广播一条消息,告诉我们我们需要开始收听他们的主题,例如“ Wasabi”,“ WhitePaper”,“

SatelliteMajor”,“ 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

回答:

您可以将属性占位符用作目标名称

@SpringBootApplication

public class So56226984Application {

public static void main(String[] args) {

SpringApplication.run(So56226984Application.class, args);

}

@JmsListener(destination = "${foo.bar}")

public void listen(String in) {

System.out.println(in);

}

@Bean

public ApplicationRunner runner(JmsTemplate template) {

return args -> template.convertAndSend("baz", "qux");

}

}

然后设置属性,例如在Spring Boot应用程序的application.yml中设置,或者在启动JVM时设置命令行属性

-Dfoo.bar=baz

您可以使侦听器bean成为原型并调整环境属性。

@SpringBootApplication

public class So56226984Application {

public static void main(String[] args) {

SpringApplication.run(So56226984Application.class, args).close();

}

@Bean

public ApplicationRunner runner(JmsTemplate template, JmsListenerEndpointRegistry registry,

ConfigurableApplicationContext context) {

return args -> {

Scanner scanner = new Scanner(System.in);

String queue = scanner.nextLine();

Properties props = new Properties();

context.getEnvironment().getPropertySources().addLast(new PropertiesPropertySource("queues", props));

while (!"quit".equals(queue)) {

System.out.println("Adding " + queue);

props.put("queue.name", queue);

context.getBean("listener", Listener.class);

template.convertAndSend(queue, "qux sent to " + queue);

System.out.println("There are now " + registry.getListenerContainers().size() + " containers");

queue = scanner.nextLine();

}

scanner.close();

};

}

@Bean

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public Listener listener() {

return new Listener();

}

public static class Listener {

@JmsListener(destination = "${queue.name}")

public void listen(String in) {

System.out.println(in);

}

}

}

以上是 如何使用Spring Boot收听动态目的地? 的全部内容, 来源链接: utcz.com/qa/412804.html

回到顶部