1

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

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

 ProjectcContextPath/JSPFiles/index.jsp

ProjectcContextPath/WEB-INF/classes/AnotherFile.class

我想从另一个Java文件名中调用这 3 个应用程序MessageConsumer.java,基于消息头。这些消息是从Activemq.

我不想一次获取所有消息。一旦上一个完成,那么只有它MessageConsumer.java从中获取另一条消息Activemq

为了您更好地理解,我做了一些模型。检查它们。检查后你们会清楚地理解。

工作流程:

在此处输入图像描述

xml数据结构。

在此处输入图像描述

我做了什么:

  1. 我构建了最后的 3 个应用程序,它们运行良好。

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

我想做的事:

  1. 我想从中获取消息Activemq

  2. 从消息中查找消息头

  3. 将消息头和 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新手,你能用代码解释清楚吗?

谢谢。

4

1 回答 1

2

基于这些要求

  • 当数据库中的数据发生更改时,将在队列中发布一条消息。
  • 根据消息内容,您可以动态调用另一个服务。
  • 该服务会进行一些计算,但其结果并不适用于最终用户。需要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 访问(servlets/JSP 就是这种情况),那么您可以将它们实现为Web 服务

于 2013-08-09T14:32:21.793 回答