不断收到Active MQ的消息

时间:2018-01-25 19:45:02

标签: java tomcat jms activemq

以下是我在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监听器。因为,我不知道队列中会有多少消息以及何时收到消息。任何帮助和建议都会很棒。

2 个答案:

答案 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);
    }
}