3

我想编写用于从中提取消息的代码Activemq。我不想Activemq一次提取所有消息,因为我的要求是每当我的 Java 应用程序收到来自 1 条消息时Activemq,根据消息正文,我会找到相应HTTP Link的并转发到那个关联。对于这整个逻辑,我写了 2 个.java文件名是

消息消费者.java

MyListener.java

MessageConsumer.java 文件仅用于建立连接。对应的代码如下。

 package PackageName;
 import java.io.IOException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.jms.*;
 import org.apache.activemq.ActiveMQConnectionFactory;
 public class MessageConsumer extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
    throws ServletException, IOException {
    try {
      //creating connectionfactory object for way
      ConnectionFactory connectionFactory=new        
      ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617");
     //establishing the connection b/w this Application and Activemq
     Connection connection=connectionFactory.createConnection();
     Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     Queue queue=session.createQueue("MessageTesing");
     javax.jms.MessageConsumer consumer=session.createConsumer(queue);
     //fetching queues from Activemq
     MessageListener listener = new MyListener();
    consumer.setMessageListener(listener);
    connection.start();
    System.out.println("Press a key to terminate");
    }
  catch (Exception e) {
    // TODO: handle exception
}
 }
}

MyListener.java 文件用于触发相应的 Applications.code 在下面

package PackageName;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class MyListener implements MessageListener {
public void onMessage(Message msg) {
    try {
        TextMessage msg1=(TextMessage)msg;
        //just for your understanding I mention dummy code
        System.out.println(msg1.getText());
        if (msg1.getText()=="Google") {
            System.out.println("Forwarding http link to Google");
        }
        else {
            System.out.println("Forwarding http link to Facebook");
        }
    } catch (JMSException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

在我的帖子中,我触发了 Google 和 Facebook 链接。但就我的要求而言,我将调用我自己的应用程序。每个应用程序需要 20 多分钟。所以我想一个接一个地提取消息。一旦之前的消息过程完成,那么只有它将收到来自 的另一条消息Activemq

但是知道我一次收到所有消息。我该如何解决这个问题。我看过程序。我Activemq-Hellowworld不明白。

对不起,我是Java技术新手。谁能帮助我。

谢谢。

4

2 回答 2

5

如果您使用的是MessageListener,那么您实际上是在异步接收消息(在另一个线程中)。

你可能正在寻找同步消息接收,所以在你的主线程中试试这个:

final QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueConnection.start();

while (true) {
  Message message = queueReceiver.receive();
  // Process your message: insert the code from MyListener.onMessage here

  // Possibly add an explit message.acknowledge() here, 
  // if you want to make sure that in case of an exception no message is lost
  // (requires Session.CLIENT_ACKNOWLEDGE, when you create the queue session)

  // Possibly terminate program, if a certain condition/situation arises
}

没有MessageListener.

receive() 阻塞直到消息可用,因此您的主线程(以及您的程序)在该receive方法中等待。如果消息到达,它将接收并处理它。

更新

如果你使用

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

那么你应该打电话

message.acknowledge()

消息处理完毕后。

而如果Session.AUTO_ACKNOWLEDGE消息立即从队列中删除(因此丢失,如果程序在处理消息时终止)。

于 2013-08-09T08:48:52.290 回答
0

MessageListener您可以使用对象receive()中的方法来代替使用MessageConsumer。这样,您每次调用该receive()方法时只会收到一条消息。

MessageConsumer consumer = session.createConsumer(destination); 
Message message = consumer.receive(1000);
于 2013-08-09T08:43:38.233 回答