gpt4 book ai didi

java - spring boot 和 BlockingQueue 监听器

转载 作者:行者123 更新时间:2023-11-30 06:15:36 25 4
gpt4 key购买 nike

我已经用spring boot实现了jms,我正在使用@JmsListener来监听主题

  @Component
public class AMQListner {
BlockingQueue<MessageBO> queue = new ArrayBlockingQueue<>(1024);
@JmsListener(destination = "${spring.activemq.topic}")
public void Consume(TextMessage message) {
try {
String json = message.getText();
MessageBO bo = ObjectMapperConfig.getInstance().readValue(json, MessageBO.class);
queue.add(bo);
} catch (JMSException e) {
e.printStackTrace();
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

现在我想要一个监听器来监听该阻塞队列,如果它有 value ,则进行处理。我们可以在 Spring Boot 中使用注释来实现这一点吗?

最佳答案

首先,正确的方法是创建一个处理程序 bean,而不是在接收器类中添加一个带有消息队列的成员。

public interface MessageHandler extends Consumer<MessageBO> {
public default void handle(MessageBO msg) { accept(msg); }
}

@Component
public class AMQListener {
@Resource("multiplexer")
MessageHandler handler;

@JmsListener(destination = "${spring.activemq.topic}")
public void Consume(TextMessage message) {
try {
String json = message.getText();
MessageBO bo = ObjectMapperConfig.getInstance().readValue(json, MessageBO.class);
handler.handle(bo);
} catch (Exception e) {
e.printStackTrace();
}
}
}

然后,您将在处理程序 bean 中拥有队列

@Component("multiplexer")
public class MessageMultiplexer implements MessageHandler {
@Autowired
MessageHandler actualConsumer;

ExecutorService executor = Executors.newFixedThreadPool(4);
public void accept(MessageBO msg) {
executor.submit(msg -> actualConsumer.handle(msg));
}
}

在这种情况下,执行器几乎就是队列。

警告:通过这种方式,您没有 1024 的限制。您可以通过使用 ThreadPoolExecutor 构造函数并向其传递有限队列来实现此目的。

关于java - spring boot 和 BlockingQueue 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49273962/

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