学习分布式——ActiveMQ 消息中间件(六)

ActiveMQ 发布订阅模式

一、发布/订阅模式生产者

package com.study.queue;


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

/*
 * 发布/订阅模式生产者
 */
public class TestTopicProducer {
	
	private static String brokerURL = "tcp://0.0.0.0:61616";
	private static String queueName = "testQueue";
	
	public static void main(String[] args) {
		//1.创建ConnectionFactory  需要指定服务端ip和端口
		ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
		//2.使用ConnectionFactory创建connection对象
		Connection connection;
		try {
			connection = factory.createConnection();
			//3.开启连接,调用Connection对象的start方法。
			connection.start();
			//使用Connection对象创建session对象
			//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
			Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			//5.使用session对象创建Destination对象  目标创建一个Topic对象
			Topic topic =  session.createTopic(queueName);
			//6.使用session对象创建一个producer对象
			MessageProducer messageProducer = session.createProducer(topic);
			//7.创建Message对象
			TextMessage message = session.createTextMessage();
			message.setText("hello activeMq");
			//8.使用producer对象发送消息
			messageProducer.send(message);
			//9.关闭资源
			messageProducer.close();
			session.close();
			connection.close();
    	} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
	

在这里插入图片描述

二、发布/订阅模式消费者`

package com.study.queue;

import java.io.IOException;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

/*
 * 创建发布/订阅消费者 异步方式
 */
public class TestTopicConsumerSync {

	
	private static String brokerURL = "tcp://0.0.0.0:61616";
	private static String queueName = "testQueue";
	
	public static void main(String[] args) {
		//1.创建ConnectionFactory  需要指定服务端ip和端口
		ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
		//2.使用ConnectionFactory创建connection对象
		Connection connection;
		try {
			connection = factory.createConnection();
			//3.开启连接,调用Connection对象的start方法。
			connection.start();
			//使用Connection对象创建session对象
			//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
			Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			//5.使用session对象创建Destination对象  目标创建一个Topic对象
			Topic topic =  session.createTopic(queueName);
			//6.使用session对象创建一个Consumer对象
			MessageConsumer messageConsumer = session.createConsumer(topic);
			//7.监听消息
			messageConsumer.setMessageListener(new MessageListener() {
				public void onMessage(Message message) {
					if(message instanceof TextMessage){
						TextMessage textMessage = (TextMessage) message;
						try {
							System.err.println("接收到的消息内容:"+textMessage.getText());
						} catch (JMSException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			});
			//不让程序结束
			System.in.read();
			//8.关闭资源
			messageConsumer.close();
			session.close();
			connection.close();
			System.out.println("消息接收成功!");
    	} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
注意:测试时要先启动消费者后再启动生产者

三、点对点模式和发布/订阅模式比较

在这里插入图片描述

四、订阅模式说明

1.活动的持久的订阅者
2.离线的持久的订阅者
3.活动的非持久的订阅者
在这里插入图片描述
如果设置持久的订阅者,需要设置clientID。
//设置connection的clientID
connection.setClientID(“lxr”);
//创建消费者的方式修改成下面这种方式
//6.使用session对象创建一个TopicSubscriber对象
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, “”);

`package com.study.queue;

import java.io.IOException;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber;

import org.apache.activemq.ActiveMQConnectionFactory;

/*

  • 创建发布/订阅消费者 异步方式
    */
    public class TestTopicConsumerSync {

    private static String brokerURL = “tcp://0.0.0.0:61616”;
    private static String queueName = “testQueue”;

    public static void main(String[] args) {
    //1.创建ConnectionFactory 需要指定服务端ip和端口
    ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
    //2.使用ConnectionFactory创建connection对象
    Connection connection;
    try {
    connection = factory.createConnection();
    //设置connection的clientID
    connection.setClientID(“lxr”);
    //3.开启连接,调用Connection对象的start方法。
    connection.start();
    //使用Connection对象创建session对象
    //4.第一个参数是否开启事务,第二个参数是接收者的签收状态
    Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5.使用session对象创建Destination对象 目标创建一个Topic对象
    Topic topic = session.createTopic(queueName);
    //6.使用session对象创建一个TopicSubscriber对象
    TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, “”);
    //7.监听消息
    topicSubscriber.setMessageListener(new MessageListener() {
    public void onMessage(Message message) {
    if(message instanceof TextMessage){
    TextMessage textMessage = (TextMessage) message;
    try {
    System.err.println(“接收到的消息内容:”+textMessage.getText());
    } catch (JMSException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    });
    //不让程序结束
    System.in.read();
    //8.关闭资源
    topicSubscriber.close();
    session.close();
    connection.close();
    } catch (JMSException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    `
    启动时就会发现活动的持久的订阅者下面会有一条数据

在这里插入图片描述
关闭时离线的持久的订阅者会有一条数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值