首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Active MQ (3) TOMCAT整合

2012-12-21 
Active MQ (三) TOMCAT整合通过与TOMCAT整合,使用TOMCAT的JNDI服务,通过JNDI获取ConnectionFactory等与MQ

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

热点排行