簡體   English   中英

帶有Spring Boot,發送器和接收器的JMS位於同一軟件包上:它的用途是什么?

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

我正在使用Spring Boot學習JMS ,並且很高興知道Spring Boot附帶了嵌入式Active MQ JMS代理。

我從春季頁面開始,了解如何實現這一目標,它的工作原理就像魅力一樣。 現在,我更進一步,創建了兩個單獨的spring boot應用程序,一個包含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;
      }

但是現在發件人正在成功發送消息,而收件人卻無所事事。 我在stackoverflow上搜索並查看thisthis 他們說:

如果要在生產中使用JMS,避免使用Spring Boot嵌入式JMS代理並將其單獨托管會更明智。 因此,對於PROD,首選3節點設置。

所以我的問題是:1.將jms發送者和接收者放在同一應用程序上的目的是什么? 有沒有實際的示例2。是否真的不可能使用spring boot嵌入式JMS來通信兩個單獨的應用程序。

如果請求以突發方式到達,並且在服務器崩潰的情況下希望將它們保存在某個地方,然后處理它們,則可能在同一應用程序中具有發送方和接收方。 通常,您通常不會使用嵌入式代理。

嵌入式代理通常僅用於測試。

但是,您可以運行可從外部訪問的嵌入式代理。 只需BrokerService啟動BrokerService即可,但另一個應用程序需要連接tcp://...地址,而不是vm://...

編輯

應用1:

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

}

顯然,對於這樣的簡單應用程序,您可以僅在第一個應用程序中運行監聽器。

但是,由於使用此配置沒有消息的持久性,因此您可能會將外部代理用於生產應用程序(或啟用持久性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM