簡體   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