具有 spring 引导、发送方和接收方的 JMS 在同一个包中:它有什么用?

JMS with spring boot, sender and receiver on same package: what is its use?

我正在学习 JMS 使用 spring 引导,很高兴知道 spring 引导带有嵌入的 Active MQ JMS 代理。

我从 spring page 开始了解如何实现这一目标,它非常有效。现在我更进一步创建了两个单独的 spring 启动应用程序,一个包含 jms 发送器代码,另一个包含接收器代码。

我尝试启动但应用程序失败,因为两个应用程序都使用相同的 JMS 端口。我通过将其包含在一个应用程序中来解决此问题

@Bean
      public BrokerService broker() throws Exception {
          final BrokerService broker = new BrokerService();
          broker.addConnector("tcp://localhost:61616");
          broker.addConnector("vm://localhost");
          broker.setPersistent(false);
          return broker;
      }

但现在发件人成功发送消息,但收件人什么也没做。我在 Whosebug 上搜索并查看 and 。他们说:

If you want to use JMS in production, it would be much wiser to avoid using Spring Boot embedded JMS brokers and host it separately. So 3 node setup would be preferred for PROD.

所以我的问题是: 1. 将 jms 发送方和接收方放在同一个应用程序中的目的是什么?有实际例子吗 2. 真的不能使用spring boot embedded JMS 来通信两个独立的应用程序吗?

如果请求突然到达并且您希望在处理它们之前将它们保存在某个地方,以防服务器崩溃,您可能在同一个应用程序中有发送者和接收者。您通常仍然不会为此使用嵌入式代理。

嵌入式代理通常仅用于测试。

但是,您可以 运行 一个可从外部访问的嵌入式代理;只需像您一样启动 BrokerService,但其他应用需要连接 tcp://... 地址,而不是 vm://....

编辑

App1:

@SpringBootApplication
@RestController
public class So52654109Application {

    public static void main(String[] args) {
        SpringApplication.run(So52654109Application.class, args);
    }

    @Bean
    public BrokerService broker() throws Exception {
        final BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.setPersistent(false);
        broker.start();
        return broker;
    }

    @Autowired
    private JmsTemplate template;

    @RequestMapping(path = "/foo/{id}")
    public String foo(@PathVariable String id) {
        template.convertAndSend("someQueue", id);
        return id + ": thank you for your request, we'll send an email to the address on file when complete";
    }

}

应用程序 2:

application.properties

spring.activemq.broker-url=tcp://localhost:61616

@SpringBootApplication
public class So526541091Application {

    public static void main(String[] args) {
        SpringApplication.run(So526541091Application.class, args);
    }

    @JmsListener(destination = "someQueue")
    public void process(String id) {
        System.out.println("Processing request for id");
    }

}

显然,对于像这样的简单应用程序,您可能只是 运行 第一个应用程序中的侦听器。

但是,由于此配置没有消息持久性,您可能会为生产应用程序使用外部代理(或启用持久性)。