共计 5194 个字符,预计需要花费 13 分钟才能阅读完成。
基于上篇文章 ” 基于 Tomcat + JNDI + ActiveMQ 实现 JMS 的点对点消息传送 ” 很容易就可以编写一个发布 / 订阅消息传送例子,相关环境准备与该篇文章基本类似,主要的区别如下。
在 Tomcat 中配置 JNDI
配置连接工厂和话题
<Resource name="topic/connectionFactory" auth="Container" | |
type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" | |
factory="org.apache.activemq.jndi.JNDIReferenceFactory" | |
brokerURL="failover:(tcp://localhost:61616)?initialReconnectDelay=100&maxReconnectAttempts=5" | |
brokerName="LocalActiveMQBroker" useEmbeddedBroker="false" /> | |
<Resource name="topic/topic0" | |
auth="Container" | |
type="org.apache.activemq.command.ActiveMQTopic" description="My Topic" factory="org.apache.activemq.jndi.JNDIReferenceFactory" | |
physicalName="TestTopic" /> |
在 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 | |
*/ | |
public class Publisher extends HttpServlet {private static final long serialVersionUID = 1L; | |
/** | |
* @see HttpServlet#HttpServlet() | |
*/ | |
public Publisher() {super(); | |
// TODO Auto-generated constructor stub | |
} | |
/** | |
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse | |
* response) | |
*/ | |
protected void doGet(HttpServletRequest request, | |
HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter(); | |
try {// get the initial context | |
InitialContext ctx = new InitialContext(); | |
// 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 void doPost(HttpServletRequest request, | |
HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub | |
} | |
} |
新建一个订阅者 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 | |
*/ | |
public class Subscriber extends HttpServlet {private static final long serialVersionUID = 1L; | |
/** | |
* @see HttpServlet#HttpServlet() | |
*/ | |
public Subscriber() {super(); | |
// TODO Auto-generated constructor stub | |
} | |
/** | |
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse | |
* response) | |
*/ | |
protected void doGet(HttpServletRequest request, | |
HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter(); | |
try {// get the initial context | |
InitialContext ctx = new InitialContext(); | |
// 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 void doPost(HttpServletRequest request, | |
HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub | |
} | |
} |
运行 Web 工程,分别打开多个标签访问订阅 servlet,然后访问发布 servlet,结果如下:
在订阅者订阅消息的时候,一开始没接收到消息,一旦发布者发布消息后,订阅者马上收到消息。
代码参考自:http://howtodoinjava.com/jms/jms-publish-subscribe-message-example/
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-06/132502.htm
正文完
星哥玩云-微信公众号
