|
通过与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 |
|
|