java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务
前言
之所以使用JNDI 是出于通用性考慮,該例子使用JMS規范提供的通用接口,沒有使用具體JMS提供者的接口,這樣可以保證我們編寫的程序適用于任何一種JMS實現(ActiveMQ、HornetQ等)。
什么是JNDI:JNDI(Java Naming and Directory Interface)是一個標準規范,類似于JDBC,JMS等規范,為開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口。J2EE 規范要求所有 J2EE 容器都要提供 JNDI 規范的實現,因此Tomcat就實現了JNDI 規范。
PTP(Point to point)消息模式(JMS的點對點消息傳送)
1、使用Tomcat配置JNDI
找到Tomcat安裝路徑下的conf文件夾,打開context.xml,添加如下配置:
View Code
2、啟動ActiveMQ
3、編寫一個Web工程
Eclipse上新建web工程,添加ActiveMQ依賴的jar包,然后開始編寫兩個Servlet,一個用于生產消息,另一個用于消費消息,如下代碼:
消息生產者Servlet:
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.DeliveryMode;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
* Servlet implementation class JMSTest*/@WebServlet("/Send")public classSend extends HttpServlet {private static final long serialVersionUID = 1L;/**
* @see HttpServlet#HttpServlet()*/
publicSend() {
super();//TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriterout =response.getWriter();try{//get the initial context
InitialContext context = newInitialContext();//lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory
QueueConnectionFactory conFactory =(QueueConnectionFactory) context
.lookup("java:comp/env/queue/connectionFactory");//create a queue connection
QueueConnection queConn =conFactory.createQueueConnection();//create a queue session
QueueSession queSession = queConn.createQueueSession(false,
Session.DUPS_OK_ACKNOWLEDGE);//create a queue sender
QueueSender queSender =queSession.createSender(queue);
queSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//create a simple message to say "Hello World"
TextMessage message = queSession.createTextMessage("Hello World");//send the message
queSender.send(message);//print what we did
out.write("Message Sent:" +message.getText());//close the queue connection
queConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub
}
}
View Code
消息消費者Servlet:
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
* Servlet implementation class Receive*/@WebServlet("/Receive")public classReceive extends HttpServlet {private static final long serialVersionUID = 1L;/**
* @see HttpServlet#HttpServlet()*/
publicReceive() {
super();//TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriterout =response.getWriter();try{//get the initial context
InitialContext context = newInitialContext();//lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory
QueueConnectionFactory conFactory =(QueueConnectionFactory) context
.lookup("java:comp/env/queue/connectionFactory");//create a queue connection
QueueConnection queConn =conFactory.createQueueConnection();//create a queue session
QueueSession queSession = queConn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);//create a queue receiver
QueueReceiver queReceiver =queSession.createReceiver(queue);//start the connection
queConn.start();//receive a message
TextMessage message =(TextMessage) queReceiver.receive();//print the message
out.write("Message Received:" +message.getText());//close the queue connection
queConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub
}
}
View Code
4、驗證結果
在Tomcat里運行該Web工程,執行消息生產者Servlet,返回消息發送成功標志,同時我們可以在http://localhost:8161/admin/queues.jsp查看到該消息,如下圖所示
繼續執行消息消費者Servlet,返回消息接收成功標志,同時我們可以打開http://localhost:8161/admin/queues.jsp頁面,發現剛才的消息已經不見了,如下圖所示
Pub/Sub消息模式(JMS發布/訂閱消息傳送)
1、在Tomcat中配置JNDI
配置連接工廠和話題:
View Code
2、啟動ActiveMQ
3、在Web工廠中編寫代碼
新建一個發布者Servlet:
package pubSub;
import java.io.IOException;
import java.io.PrintWriter;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.jms.Topic;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.TopicPublisher;
import javax.jms.DeliveryMode;
import javax.jms.TopicSession;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;/**
* Servlet implementation class JMSTest*/@WebServlet("/Publish")public classPublisher extends HttpServlet {private static final long serialVersionUID = 1L;/**
* @see HttpServlet#HttpServlet()*/
publicPublisher() {
super();//TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriterout =response.getWriter();try{//get the initial context
InitialContext ctx = newInitialContext();//lookup the topic object
Topic topic = (Topic) ctx.lookup("java:comp/env/topic/topic0");//lookup the topic connection factory
TopicConnectionFactory connFactory =(TopicConnectionFactory) ctx
.lookup("java:comp/env/topic/connectionFactory");//create a topic connection
TopicConnection topicConn =connFactory.createTopicConnection();//create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);//create a topic publisher
TopicPublisher topicPublisher =topicSession.createPublisher(topic);
topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//create the "Hello World" message
TextMessage message =topicSession.createTextMessage();
message.setText("Hello World");//publish the messages
topicPublisher.publish(message);//print what we did
out.write("Message published:" +message.getText());//close the topic connection
topicConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub
}
}
View Code
新建一個訂閱者Servlet:
package pubSub;
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
* Servlet implementation class Receive*/@WebServlet("/Subscribe")public classSubscriber extends HttpServlet {private static final long serialVersionUID = 1L;/**
* @see HttpServlet#HttpServlet()*/
publicSubscriber() {
super();//TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriterout =response.getWriter();try{//get the initial context
InitialContext ctx = newInitialContext();//lookup the topic object
Topic topic = (Topic) ctx.lookup("java:comp/env/topic/topic0");//lookup the topic connection factory
TopicConnectionFactory connFactory =(TopicConnectionFactory) ctx
.lookup("java:comp/env/topic/connectionFactory");//create a topic connection
TopicConnection topicConn =connFactory.createTopicConnection();//create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);//create a topic subscriber
TopicSubscriber topicSubscriber =topicSession
.createSubscriber(topic);//start the connection
topicConn.start();//receive the message
TextMessage message =(TextMessage) topicSubscriber.receive();//print the message
out.write("Message received:" +message.getText());//close the topic connection
topicConn.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub
}
}
View Code
4、驗證結果
運行Web工程,分別打開多個標簽訪問訂閱servlet,然后訪問發布servlet,結果如下:
在訂閱者訂閱消息的時候,一開始沒接收到消息,一旦發布者發布消息后,訂閱者馬上收到消息。
總結
以上是生活随笔為你收集整理的java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rose双机热备两款软件原理介绍以及共享
- 下一篇: html页面小宠物代码大全,宠物店网页设