`

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

    博客分类:
  • JMS
jms 
阅读更多

转自:http://www.cnblogs.com/chenpi/p/5566983.html

前言

基于上篇文章"基于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,结果如下:

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

参考资料

http://howtodoinjava.com/jms/jms-publish-subscribe-message-example/

分享到:
评论

相关推荐

    JMS之ActiveMQ 点对点+发布/订阅

    在这里,生产者发布消息到一个主题,多个消费者可以订阅这个主题以接收消息。与点对点模型不同,发布/订阅模型支持一对多的消息传递,即一条消息可以被多个订阅者接收。 - **主题**:消息发布的中心,类似于广播...

    基于DDS的发布/订阅中间件设计

    为了解决这一问题,SUN公司发布了Java消息服务(Java Message Service,简称JMS)规范,虽然一定程度上解决了不同厂商产品之间的互操作问题,但在实时性和灵活性方面仍然存在不足。为此,对象管理组织(Object ...

    ActiveMQ的点对点与发布/订阅模式小demo

    生产者(发布者)发布消息到一个主题,多个消费者(订阅者)可以订阅这个主题并接收到消息。相比于点对点模式,发布/订阅模式支持一对多的广播式通信。在ActiveMQ中,我们可以通过创建一个Topic,然后使用`...

    JMS sub/pub实现聊天系统

    在这个模型中,生产者(publisher)发布消息到一个主题(topic),而消费者(subscriber)则订阅这个主题,从而接收到发布的消息。 1. **JMS基本概念** - **消息**:消息是数据的载体,包含实际要传递的信息。 - ...

    JMS消息发送及订阅

    对于消息订阅,我们需要创建`MessageConsumer`来监听特定的消息源。如果是队列,消费者是独占的;如果是主题,可以有多个订阅者。 ```java MessageConsumer consumer = session.createConsumer(destination); ...

    JMS IBM MQ 订阅模式

    1. **消息模型**:JMS支持两种主要的消息传递模型——点对点(Queue)和发布/订阅(Topic)。点对点模式中,消息从一个生产者发送到一个队列,然后由一个消费者接收。发布/订阅模式下,消息由发布者发送到主题,多个...

    Flex+blazeds+java发布/订阅聊天程序

    3. **发布/订阅模式**:在发布/订阅模式中,消息生产者(发布者)将消息发送到一个中心节点(消息代理或消息总线),而消息消费者(订阅者)则注册对特定主题的兴趣。当有新消息发布时,消息总线会将消息推送给所有...

    activeMq点对点和发布/订阅模式demo

    1. 广播消息:生产者发布消息到一个主题,所有订阅了该主题的消费者都能接收到消息。 2. 多对多交付:一个消息可以被多个消费者同时接收,实现了广播效果。 3. 动态订阅:消费者可以随时订阅或取消订阅主题,不影响...

    apache MQ 点对点,发布/订阅者,开发流程

    2. **发布消息**:生产者连接到主题,创建Message对象,然后调用`publish`方法发布消息到主题。 3. **订阅消息**:消费者作为订阅者,可以订阅一个或多个主题。订阅后,每当有新的消息发布到主题,消费者都会接收到...

    应用openJMS实现JMS消息发布于订阅

    3. **发布消息**: 创建一个`MessageProducer`实例,并通过`createTextMessage()`或`createObjectMessage()`方法创建消息。然后,调用`send()`方法将消息发送到指定的主题。 ```java MessageProducer producer = ...

    JMS实现的信息的广播订阅

    3. **创建生产者**: 生产者是发送消息的组件,它需要连接到JMS提供者,并创建一个TopicProducer对象,用来发布消息到已定义的Topic。 4. **创建消费者**: 消费者是接收消息的组件,它们需要订阅特定的Topic。每个...

    Apache ActiveMQ学习笔记【原创:mq的方式有两种:点到点和发布/订阅】

    ### Apache ActiveMQ 学习笔记 ...点对点模型适用于一对一的消息传递场景,而发布/订阅模型则适用于一对多的消息分发场景。此外,通过示例代码,我们也了解了如何使用 Java 和 Spring 框架与 ActiveMQ 集成来发送消息。

    JMS中/英文帮助文档

    5. **主题(Topic)与队列(Queue)**:JMS支持两种消息模式——发布/订阅(Publish/Subscribe)和点对点(Point-to-Point)。主题适用于广播式通信,多个消费者可以订阅同一个主题并接收消息。队列则遵循一对一的...

    activemq和spring整合发布消息和订阅消息demo

    这个"activemq和spring整合发布消息和订阅消息demo"是用于演示如何在Spring环境中配置和使用ActiveMQ来实现实时的数据通信。现在,我们将深入探讨相关的知识点。 首先,ActiveMQ是Apache软件基金会开发的一个开源...

    jms-test.zip_jms activemq_jms test

    在JMS中,发布/订阅模式是一种通信方式,其中生产者(发布者)发布消息到一个主题,而消费者(订阅者)可以订阅这个主题来接收消息。与点对点模型不同,发布/订阅模型中,一个消息可以被多个消费者接收,增强了消息...

    weblogic中使用JMS发送和接受消息

    通过理解并熟练掌握上述内容,你将在WebLogic环境中成功地利用JMS进行消息传递,无论是简单的点对点通信还是复杂的发布/订阅模式,都能游刃有余。请务必根据具体需求进行配置,并确保测试环节充分,以确保JMS服务的...

    MQ JMS 发布订阅配置、代码

    【MQ JMS 发布订阅配置】是分布式消息传递系统中的一种模式,允许消息生产者(发布者)发送消息,而消息消费者(订阅者)可以选择性地接收这些消息。IBM 的 WebSphere MQ(简称 MQ)提供了Java消息服务(JMS)接口来...

    spring-jms使用queue发送消息简单例子

    在这个"spring-jms使用queue发送消息简单例子"中,我们将深入探讨如何使用Spring JMS与ActiveMQ结合,通过队列(Queue)来发送和接收消息。 首先,`pom.xml`文件是Maven项目的配置文件,它包含了项目所依赖的库。...

    JMS 使用 ActiveMQ 传送文件

    3. **jms规范教程.pdf** - 这是一个关于JMS规范的教程,可能详细讲解了JMS接口、消息类型(如点对点和发布/订阅模型)、消息队列和主题等核心概念,为理解JMS和ActiveMQ的工作原理提供了基础。 综上所述,这个主题...

    Spring发送接收JMS消息

    JMS提供两种类型的消息模型:点对点(Point-to-Point, P2P)和发布/订阅(Publish/Subscribe)。在点对点模型中,消息由一个生产者发送到一个队列,然后由一个或多个消费者接收。发布/订阅模型中,消息发布到一个...

Global site tag (gtag.js) - Google Analytics