• JMS发布/订阅消息传送例子


    前言

    基于上篇文章"基于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&amp;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
     */
    @WebServlet("/Publish")
    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
     */
    @WebServlet("/Subscribe")
    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,结果如下:

    在订阅者订阅消息的时候,一开始没接收到消息,一旦发布者发布消息后,订阅者马上收到消息。

  • 相关阅读:
    Android开发四大组件--Activity详解
    <base target="_blank"/>
    MVC EF异常-“序列化类型为 XX 的对象时检测到循环引用”
    错误:[将截断字符串或二进制数据。 语句已终止。]
    EasyUI queryParams属性 在请求远程数据同时给action方法传参
    存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
    easyui DateTimeBox 取值
    [转载]再次谈谈easyui datagrid 的数据加载
    EasyUI datagrid 改变url属性 实现动态加载数据
    在js中获取easyui datagrid的数据
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/6285862.html
Copyright © 2020-2023  润新知