gpt4 book ai didi

java - JMSTemplate 生产者是否为每条消息打开一个线程?

转载 作者:行者123 更新时间:2023-11-30 10:01:41 26 4
gpt4 key购买 nike

我正在使用 Spring Boot 2.1.6 构建 REST API 应用程序。我想在我的应用程序中使用 JMS 消息传递和 Active MQ 包 (org.apache.activemq)。我有 MyEventController 类,它通过 http 请求接收各种事件。然后,我想将有关事件的信息作为 JMS 消息发送到主题,以便消息使用者使用来自事件的信息更新数据库。

我想在这里使用 JMS 的原因是不保留处理 http 请求的 Spring 线程,并让消费者打开一个单独的线程来对数据库进行潜在的大量耗时更新。但是我想知道 JMSTemplate 是否始终保持一个线程。因为如果为每个 http 请求打开一个新线程,那么该解决方案的可扩展性就不是那么好。

这是我的生产者代码:

@RestController
public class MyEventController {
@Autowired
private DBHandler db;

@Autowired
private JmsTemplate jmsTemplate;

@RequestMapping(method=GET, path=trackingEventPath)
public ResponseEntity<Object> handleTrackingEvent(
@RequestParam(name = Routes.pubId) String pubId,
@RequestParam(name = Routes.event) String event) {

jmsTemplate.convertAndSend("topic1", "info@example.com");
return new ResponseEntity<>(null, new HttpHeaders(), HttpStatus.OK);
}

消费者:

@Component
public class JSMListener {
@JmsListener(destination = "topic1", containerFactory = "topicListenerFactory")
public void receiveTopicMessage(String event) {
// do something...
}
}

最佳答案

JmsTemplate 没有后台线程或异步发送的概念。这是一个类设计,用于简化 java.jms.Session 的使用并将其嵌入到常用的 Spring 概念中,例如使用 @Transactional 的声明式事务管理。

在您的示例中,convertAndSend() 将作为请求处理线程的一部分执行。该方法将阻塞,直到 JMS 代理响应消息已添加到目标队列的应用程序,或者在出现问题时抛出异常,例如队列已满。

关于java - JMSTemplate 生产者是否为每条消息打开一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57298228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com