关于ZAKER 融媒体解决方案 合作 加入

java- 如何使用 JMS 基于 Activemq 消息调用 externalA.

CocoaChina 10-14

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

ProjectcContextPath/WEB-INF/classes/PackageName/ExternalFileProcess.class ProjectcContextPath/JSPFiles/index.jspProjectcContextPath/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 wayConnectionFactory connectionFactory=new ActiveMQConnectionFactory ( "admin","admin","tcp://localhost:61617" ) ; //establishing the connection b/w this Application and ActivemqConnection 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 服务 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 消息

觉得文章不错,微信扫描分享好友

扫码分享