[英]How do the Sender know that the Receiver isn't available in JMS using Spring Boot?
[英]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上搜索並查看this和this 。 他們說:
如果要在生產中使用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.