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

时间:2019-05-20 19:24:19

标签: java spring-boot spring-jms

我们有一个使用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使所有这些东西自动被调用,我们不知道在何处以及如何为该方法提供端点需要侦听的主题/队列的名称。同样,消息监听器似乎从未被调用过,但这是一个单独的问题。我敢肯定,如果我们至少可以发送自定义主题或排队让其收听,就可以解决。

我们正在使用Spring2。 x

1 个答案:

答案 0 :(得分:1)

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

%set_env PYTHONPATH=/project/pylib/src:/env/python

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

@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");
    }

}

编辑

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

-Dfoo.bar=baz