java-如何使用JMS基于Activemq消息调用externalApplication
作者:互联网
我构建了3个应用程序,每个应用程序都需要20多分钟才能进行评估.我在以下目录中放置了3个文件
ProjectcContextPath/WEB-INF/classes/PackageName/ExternalFileProcess.class
ProjectcContextPath/JSPFiles/index.jsp
ProjectcContextPath/WEB-INF/classes/AnotherFile.class
我想根据消息头从另一个Java文件名MessageConsumer.java调用这3个应用程序.这些消息是从Activemq获取的.
我不想一次获取所有消息.一旦完成以前的操作,则只有MessageConsumer.java从Activemq获取另一条消息.
为了使您更好地理解,我制作了一些模型,请检查它们,检查后您会明白的.
工作流程:
Xml数据结构.
我做了什么:
>我建立了最后3个应用程序,它们运行良好.
>我编写了一个函数,如果您将xmlfilepath和Message-head值作为参数传递,那么它将返回相应的ApplicationRealPath标记值.
我想做的事:
>我想从Activemq获取消息
>从消息中查找消息头
>将message-head和xml文件路径传递给另一个函数.获取相应的ApplicationRealPath值.
>并触发该应用程序.
>从Activemq中获取另一条消息,一旦完成先前触发的应用程序过程
我真的是从3天开始尝试的,但仍然没有弄清楚.我尝试了以下代码.它不起作用
package PackageName;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 request, HttpServletResponse response)
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();
QueueSession session=(QueueSession) connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Queue queue=session.createQueue("MessageTesing");
final QueueReceiver queueReceiver =session.createReceiver(queue);
connection.start();
while (true) {
Message message = queueReceiver.receive();
message.acknowledge();
TextMessage textmsg=(TextMessage) message;
if (textmsg.getText()=="TestMessage35") {
RequestDispatcher rd=request.getRequestDispatcher("servletName");
rd.forward(request, response ) ;
System.out.println(textmsg.getJMSDestination());
}
}
}
catch (Exception e) {
// TODO: handle exception
}
}
}
我是java的新手,可以用代码清楚地解释一下.
谢谢.
解决方法:
根据这些要求
>更改数据库中的数据时,将在队列上发布一条消息.
>根据消息内容,您可以动态调用另一个服务.
>该服务进行了一些计算,但结果并不适合最终用户.需要20分钟.
您可以实现一个独立的应用程序,以这种方式同步接收消息(伪代码):
while (true) {
Message message = queueReceiver.receive();
TextMessage textmsg = (TextMessage) message;
if (textmsg.getText().equals("service1")) {
new Service1().execute();
} else if (textmsg.getText().equals("service2")) {
new Service2().execute();
} else {
// Show error
}
message.acknowledge();
}
该作业连续运行.
您的建议的不同之处
>使用独立程序(具有main方法)而不是servlet. servlet不适合(因为它不能连续运行)
>将服务实现为普通的Java类;调用JSP或servlet进行处理是没有用的.它们旨在实现表示层
更新
如果您的服务只能通过HTTP访问(servlet / JSP就是这种情况),那么您可以将它们实现为Web服务.
标签:java,jms,activemq,java-ee-6 来源: https://codeday.me/bug/20191014/1912551.html