繁体   English   中英

如何使用JMS基于Activemq消息调用externalApplication

[英]How can I call externalApplication based on Activemq message using JMS

我构建了3个应用程序,每个应用程序都需要20多分钟才能进行评估。我在以下目录中放置了3个文件

 ProjectcContextPath/WEB-INF/classes/PackageName/ExternalFileProcess.class

 ProjectcContextPath/JSPFiles/index.jsp

ProjectcContextPath/WEB-INF/classes/AnotherFile.class

我想基于message-head从另一个Java文件名MessageConsumer.java调用这3个应用程序。这些消息是从Activemq获取的。

我不想一次获取所有消息。 一旦完成以前的任务,则只有MessageConsumer.javaActivemq获取另一条消息。

为了使您更好地理解,我制作了一些模型,请检查它们,检查后您会明白的。

工作流程:

在此处输入图片说明

Xml数据结构。

在此处输入图片说明

我做了什么:

  1. 我建立了最后3个应用程序,它们工作正常。

  2. 我编写了一个函数,如果您将xmlfilepath和Message-head值作为参数传递,那么它将返回相应的ApplicationRealPath标记值。

我想做的事:

  1. 我想从Activemq获取消息

  2. 从消息中查找消息头

  3. 将message-head和xml文件路径传递给另一个函数。获取相应的ApplicationRealPath值。

  4. 并触发该应用程序。

  5. 一旦先前触发的应用程序过程完成,即可从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服务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM