我想编写用于从Activemq
提取消息的代码。我不想一次从Activemq
提取所有消息,因为我的要求是每当我的Java应用程序从Activemq
,根据邮件正文,我会找到相应的HTTP Link
并转发到该链接。对于这整个逻辑,我写了两个.java
文件名是
MessageConsumer.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链接。但是就我的要求而言,我将调用我自己的Applications.each应用程序花费超过20分钟。所以我想逐个拉消息。完成之前的消息处理已完成然后它只会收到来自Activemq
的其他消息。
但是知道我一次收到所有邮件。我怎么能解决这个问题。我看过Activemq-Hellowworld
程序。我不明白。
抱歉,我是Java
tech的新手。任何人都可以帮助我。
感谢。
答案 0 :(得分: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
的情况下,消息立即从队列中删除(因此如果程序终止处理消息,则会丢失)。
答案 1 :(得分:0)
您可以使用MessageListener
对象中的receive()
方法,而不是使用MessageConsumer
。这样,每次调用receive()
方法时,您只会收到一条消息。
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive(1000);