ActiveMQ发布订阅模式

Topic主题发布和订阅消息

根据前文介绍的消息传递都是点对点的消息,即一个生产者发送的一条消息只能被一个消费者消费,然后就移除了。
在这里插入图片描述
而topic模式一条消息可以被多个消费者订阅,关系如下:
在这里插入图片描述

定义生产者
public class TopicPublisherDemo {

    //创建 activemq 的连接账号
    private static String userName = "admin";
    //创建 activemq 的连接密码
    private static String password = "admin";
    // activemq 基于 tcp 协议的链接地址 端口默认为 61616
    private static String brokerURL = "tcp://192.168.111.161:61616";

    public static void main(String[] args) throws Exception {
        TopicConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,brokerURL);

        TopicConnection connection = factory.createTopicConnection();
        connection.start();

        TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

        Topic topic = session.createTopic("topic--hello");
        TopicPublisher publisher = session.createPublisher(topic);
        publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        MapMessage message = session.createMapMessage();
        message.setString("name","zmf");
        message.setString("address","深圳");
        publisher.publish(message);

        publisher.close();
        session.close();
        connection.close();

    }
}

启动后,我们可以看到如下:
在这里插入图片描述

定义消费者
public class TopicSubscriberDemo {

    //创建 activemq 的连接账号
    private static String userName = "admin";
    //创建 activemq 的连接密码
    private static String password = "admin";
    // activemq 基于 tcp 协议的链接地址 端口默认为 61616
    private static String brokerURL = "tcp://192.168.111.161:61616";

    public static void main(String[] args) throws Exception {
        TopicConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,brokerURL);

        TopicConnection connection = factory.createTopicConnection();
        connection.start();

        TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

        Topic topic = session.createTopic("topic--hello");

        TopicSubscriber subscriber = session.createSubscriber(topic);
        subscriber.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                try {
                    if (message instanceof TextMessage) {
                        System.out.println("获取的信息:" + ((TextMessage) message).getText());
                    } else if (message instanceof ObjectMessage) {
                        System.out.println("获取的信息:" + ((ObjectMessage) message).getObject());
                    }else if (message instanceof MapMessage){
                        String name = ((MapMessage) message).getString("name");
                        String address = ((MapMessage) message).getString("address");
                        System.out.println(name + ": " + address);
                    }
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread.sleep(Long.MAX_VALUE);
        subscriber.close();
        session.close();
        connection.close();
    }
}

启动后,从浏览器看到如下:
在这里插入图片描述
后台获取数据如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值