activeMQ Topic方式(发布/订阅)

在发布订阅消息方式中,消息是无状态的,不保证每条消息被消费,只有监听该TOPIC地址才能收到消息并消费,否则该消息将会丢失。一对多的发布接受策略,可以同时消费多个消息。

 订阅/发布模式,同样可以有着多个发送端与多个接收端,但是接收端与发送端存在时间上的依赖,就是如果发送端发送消息的时候,接收端并没有监听消息,那么ActiveMQ将不会保存消息,将会认为消息已经发送,换一种说法,就是发送端发送消息的时候,接收端不在线,是接收不到消息的,哪怕以后监听消息,同样也是接收不到的。这个模式还有一个特点,那就是发送端发送的消息,将会被所有的接收端给接收到,不类似点对点,一条消息只会被一个接收端给接收到。

生产者:

public class JmsTopicProduct {

    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final String TOPIC_NAME = "topic.test";
    
    public static void main(String[] args) {
		
    	//1. 创建连接工厂
    	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD,BROKEURL);
    	Connection createConnection = null;
    	Session createSession = null;
    	Destination destination = null;
    	MessageProducer createProducer = null;
    	try {
    		//2. 创建连接
    		createConnection = connectionFactory.createConnection();
    		//3. 启动连接
    		createConnection.start();
    		//4. 创建会话
    		createSession = createConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    		//5. 创建消息目的地
    		destination = createSession.createTopic(TOPIC_NAME);
    		//6. 创建消息生产者
    		createProducer = createSession.createProducer(destination);
    		//7. 发送消息
    		send(createSession,createProducer);
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static void send(Session createSession, MessageProducer createProducer) throws JMSException {
		
		for (int i = 0; i < 20; i++) {
			TextMessage createTextMessage = createSession.createTextMessage("activeMQ发出一条消息"+i);
			System.out.println("activeMQ发出一条消息"+i);
			createProducer.send(createTextMessage);
		}
		
	}
}

消费者:

public class JmsTopicConsumer {

    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final String TOPIC_NAME = "topic.test";
    
    public static void main(String[] args) {
		//1. 创建连接工厂
    	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
    	Connection connection = null;
    	Session session = null;
    	Destination destination = null;
    	MessageConsumer messageConsumer = null;
    	try {
    		//2. 创建连接
			connection = connectionFactory.createConnection();
			//3. 开启连接
			connection.start();
			//4. 创建会话
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			//5. 创建目的地
			destination = session.createTopic(TOPIC_NAME);
			//6. 创建消费者
			messageConsumer = session.createConsumer(destination);
			//7. 创建消费者监听
			messageConsumer.setMessageListener(new MessageListener() {
				@Override
				public void onMessage(Message message) {
					TextMessage textMessage = (TextMessage)message;
					try {
						System.out.println("消费者收到一条消息,内容是:"+textMessage.getText());
					} catch (JMSException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			});
			
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值