`
orange5458
  • 浏览: 347685 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Active MQ (三) TOMCAT整合

阅读更多

通过与TOMCAT整合,使用TOMCAT的JNDI服务,通过JNDI获取ConnectionFactory等

与MQ提供商API耦合的资源,从而实现真正意义上的JMS编程。

 

1.准备:

将%ACTIVEMQ_HOME%\lib中的

activemq-core-5.1.0.jar
activemq-web-5.1.0.jar
geronimo-j2ee-management_1.0_spec-1.0.jar
geronimo-jms_1.1_spec-1.1.1.jar
geronimo-jta_1.0.1B_spec-1.0.1.jar

COPY到%TOMCAT6.0_HOME%\lib

(我的ACTIVEMQ是5.1.0所以要和TOMCAT6.0整合)

 

2.配置JNDI

在WEB APP的META-INF目录下新建context.xml,内容如下:

 

<?xml version='1.0' encoding='utf-8'?>
<Context>

    <Resource  
        name="jms/NormalConnectionFactory" 
        auth="Container" 
        type="org.apache.activemq.ActiveMQConnectionFactory" 
        description="JMS Connection Factory" 
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
        brokerURL="tcp://localhost:61616" 
        brokerName="localhost" 
        useEmbeddedBroker="false"/>  
 
 <Resource name="jms/queue/sender" 
        auth="Container" 
        type="org.apache.activemq.command.ActiveMQQueue" 
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
        physicalName="MY.TEST.SENDER"/>
   
    <Resource name="jms/queue/receiver" 
        auth="Container" 
        type="org.apache.activemq.command.ActiveMQQueue" 
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
        physicalName="MY.TEST.RECEIVER"/>
       
</Context>

 

3.通过ServletContextListener在WEB APP启动时将JNDI中可并发复用的部分保存于application上下文中。

 

JMSInitContextListener.java

 

package listener;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class JMSInitContextListener implements ServletContextListener {

 public void contextDestroyed(ServletContextEvent e) {
  // TODO Auto-generated method stub
  
 }

 public void contextInitialized(ServletContextEvent event) {
  ServletContext application = event.getServletContext();
  String jmsConnFactory = application.getInitParameter("jmsConnFactory");
  String jmsQueueSendTo = application.getInitParameter("jmsQueueSendTo");
  String jmsQueueReceiveFrom = application.getInitParameter("jmsQueueReceiveFrom");
  try {
   Context ctxt = new InitialContext();
   
   ConnectionFactory factory = (ConnectionFactory) ctxt.lookup(jmsConnFactory);
   Connection conn = factory.createConnection();
   conn.start();
   Queue queueSendTo = (Queue) ctxt.lookup(jmsQueueSendTo);
   Queue queueReceiveFrom = (Queue) ctxt.lookup(jmsQueueReceiveFrom);
   
   application.setAttribute("jmsConnection", conn);
   application.setAttribute("jmsQueueSendTo", queueSendTo);
   application.setAttribute("jmsQueueReceiveFrom", queueReceiveFrom);
  } catch (NamingException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } catch (JMSException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

4.在WEB.XML中申明该Listener

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
  <context-param>
   <param-name>jmsConnFactory</param-name>
   <param-value>java:comp/env/jms/NormalConnectionFactory</param-value>
  </context-param>
 
  <context-param>
   <param-name>jmsQueueSendTo</param-name>
   <param-value>java:comp/env/jms/queue/sender</param-value>
  </context-param>
 
  <context-param>
   <param-name>jmsQueueReceiveFrom</param-name>
   <param-value>java:comp/env/jms/queue/receiver</param-value>
  </context-param>
 
  <listener>
   <listener-class>listener.JMSInitContextListener</listener-class>
  </listener>
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

5.创建一测试用的JSP

 

index.jsp 本例子实现的功能是模拟一MQ 消息客户端,模拟与上一节中的消息处理器进行通讯

 

<%@ page language="java" pageEncoding="UTF-8"%>
<jsp:directive.page import="javax.jms.Connection"/>
<jsp:directive.page import="javax.jms.Queue"/>
<jsp:directive.page import="javax.jms.Session"/>
<jsp:directive.page import="javax.jms.MessageProducer"/>
<jsp:directive.page import="javax.jms.TextMessage"/>
<jsp:directive.page import="javax.jms.MessageConsumer"/>
<jsp:directive.page import="javax.jms.Message"/>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

Connection connection = (Connection) application.getAttribute("jmsConnection");
Queue queueSendTo = (Queue) application.getAttribute("jmsQueueSendTo");
Queue queueReceiveFrom = (Queue) application.getAttribute("jmsQueueReceiveFrom");

Session jmsSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

MessageProducer sender = jmsSession.createProducer(queueSendTo);
TextMessage messageToSend = jmsSession.createTextMessage();
messageToSend.setText("Nice to meet u!");
messageToSend.setJMSCorrelationID("99999");
sender.send(messageToSend);

MessageConsumer receiver = jmsSession.createConsumer(queueReceiveFrom, "JMSCorrelationID='99999'");
Message messageReceived = receiver.receive(3000);

receiver.close();
sender.close();
jmsSession.close();
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>JMS Queue Test</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
 
  <body>
 JMS Queue Test<br>
 <%="Send :" + messageToSend.getText()%><br>
 <%="Send JMSCorrelationID :" + messageToSend.getJMSCorrelationID()%><br>
 <%="-----------------------------------------" %><br>
 <% if (messageReceived instanceof TextMessage) { %>
  <%="Receive : " + ((TextMessage) messageReceived).getText()%><br>
  <%="Receive JMSCorrelationID : " + ((TextMessage) messageReceived).getJMSCorrelationID()%><br>
 <% } %>
  </body>
</html>

6.测试

 

开启MQ,创建对应的QUEUE,运行上一节的消息处理器,启动TOMCAT,进入index.jsp,刷新index.jsp

 

7.参考资料

 

http://activemq.apache.org/tomcat.html

分享到:
评论

相关推荐

    Active MQ in action 教程

    active mq 实战教程,写的很不错,拿来分享

    Apache Active MQ 简单的示例

    包含两个示例中,第一个示例须要运行单独MQ(Apache Active MQ 5.15.0以下的版本)。第二个示例不需要运行单独的MQ。 有兴趣的朋友可以看看。两个示例运用的不同的方法去实现的。

    Active MQ 与 IBM WebSphere MQ 可用性和管理分析

    Active MQ 与 WebSphere MQ 高可用性和管理分析。

    active MQ maven POM方式

    active MQ maven POM方式 初学者

    Active MQ in Action

    Active MQ in Action,英文版。主要是ActiveMQ,manning

    Active MQ C++实现通讯 X86 librariy

    Active MQ C++实现通讯 X86 librariy:CMS (stands for C++ Messaging Service)类似于JMS API用于同Message Brokers通讯(例如Active MQ)。 APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如...

    Jfinal -active mq

    Jfinal -active mq: 消费:extends JFinalQueueConsumer 生产:JFinalQueue.sendMessage(queueName, message);

    active_mq_mvc源码

    active_mq_mvc 源码,由一段if...else..判断引起的代码重构...,主要讲设计思想,以及设计模式,合理的运用反射,极度的省略了代码

    active MQ 通信程序全套代码

    集成了所有active MQ资源,应用于windows和linux即时通信

    active mq 学习笔记

    active mq的学习手册,例子等。你可以一步步地上手。

    active mq思维导图

    Active MQ 基础知识思维导图。主要是JMS总结介绍。用于学习和复习

    camel-wmq-amq:Camel IBM Websphere MQ 到 Active MQ 桥接路由

    Camel IBM Websphere MQ 到 Active MQ 桥接路由 先决条件 IBM 为安装在 Fuse 上的 MQ 客户端提供了 OSGi jar 文件IBM_MQ_INSTALL_DIR/java/lib/OSGi 运行 AMQ 代理 带有填充属性的 JBOSS_FUSE_INSTALL_DIR/etc/ 中...

    active-mq开发手册

    开发active-mq的良好帮助指导手册

    active MQ ,消息队列

    activeMQ的一个小例子 包含处理附件的代码例子 完整版 包含jar包和配置文件

    Manning.Active.MQ.in.Action.(MEAP)

    ActiveMQ Manning.Active.MQ.in.Action.(MEAP) Active.MQ Active.MQ Manning.Active.MQ.in.Action.(MEAP) Active.MQ Active.MQ

    Spring Boot基于Active MQ实现整合JMS

    主要介绍了Spring Boot基于Active MQ实现整合JMS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Active MQ教程+配置

    ActiveMQ is the most popular and powerful open source Message Bus.ActiveMQ 是一个完全支持JMS1.1 和J2EE 1.4 规范的JMS Provider 实现,尽管JMS 规范出台 已经是很久的事情了,但是JMS 在当今的J2EE 应用中间仍然...

    Active MQ的配置和使用

    NULL 博文链接:https://manzuosteve.iteye.com/blog/1859288

    消息队列active mq

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的...

    基于Spring+JMS+ActiveMQ+Tomcat整合

    基于Spring+JMS+ActiveMQ+Tomcat,做一个Spring4.1.0和ActiveMQ5.11.1整合实例,实现了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,简单实例,不包含任何业务。

Global site tag (gtag.js) - Google Analytics