以下是我在java中接收来自活动mq的消息的代码
public void main(){
try{ // Create a ConnectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("myurl");
// Create a Connection
connection = connectionFactory.createConnection();
connection.start();
// System.out.println(connection.toString());
//connection.setExceptionListener(this);
// Create a Session
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// Create the destination (Topic or Queue)
Destination destination = session.createQueue("myqueuename");
consumer = session.createConsumer(destination);
while (true)//never ending loop
{
message = consumer.receive(); //System would wait here to read the message from the queue
if (message instanceof TextMessage)
{
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println(text);
message.acknowledge();
session.commit();
}
}
}
finaly{
closeallconnection();
}
由于while条件为true,循环将继续运行,message.receive将等待,直到有新消息。所以,这里的问题是我从apache tomcat运行它并且它运行成功,但是当我关闭tomcat时,即使我关闭了tomcat,这个代码也会运行。 如果我再次启动tomcat,即使现有代码存在,也会有另一个运行相同的服务。 所以,我需要的帮助是如何连续接收消息并等待新消息,当我关闭tomcat时如何关闭这个jms监听器。因为,我不知道队列中会有多少消息以及何时收到消息。任何帮助和建议都会很棒。
答案 0 :(得分:0)
我不认为这是最好的方法。它无法扩展。
你不想要一个听众/处理器;你想要一个他们的池。当消息落在队列上时,将从池中检出一个监听器,处理该消息,并在完成后返回池中。
这将扩展,因为多个侦听器可以处理繁重的负载。每个请求一条消息。
答案 1 :(得分:0)
您展示的不是生产级代码。虽然做一个接收循环并不是一个坏主意,但你需要在场景背后使用一些样板逻辑,比如将代码放在可配置数量的线程中,处理异常和重新连接,并整合到你的应用程序生命周期中。
您通常需要一些Web应用程序框架,例如spring来帮助完成这些任务。
在Spring的最新版本中,您甚至可以使用注释来完成任务,这使得它非常简单。使用spring boot,您不需要繁重的配置,只需要在属性文件中使用简单的连接字符串。
@Component
public class MessageListener {
@JmsListener(destination = "my.queue")
public void receiveMessage(String msg) {
System.out.println("Received :" + msg);
}
}