activeMQ 的2种消息机制

本文介绍了JMS规范下的两种消息模型:点对点(queue)和发布/订阅(topic)。详细解释了这两种模型的工作原理及特点,包括消息的生产和消费过程、消息存储情况以及消息的完整性和丢失风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mq:点对点, 发布/订阅


JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。 
点对点: 
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意: 
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。 
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。 
发布/订阅 
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
<!-- 定义消息队列(Queue) --> 点对点:
   <bean id="destination1" class="org.apache.activemq.command.ActiveMQQueue"> 


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--创建连接工厂 -->

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"></property>
</bean>

<!-- 定义消息队列(Queue) -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>  
        <value>OTS-MQ</value>  
    </constructor-arg>  
</bean>


   <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destination"></property>
<property name="receiveTimeout" value="600"></property>
</bean>

<bean id="sender" class="com.palmyou.ots.api.v7.mq.Sender">
<property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>

<!-- <bean id="receiver" class="com.palmyou.ots.api.v7.mq.Receiver"> -->
<!-- <property name="jmsTemplate" ref="jmsTemplate"></property> -->
<!-- </bean> -->

<!-- 配置消息队列监听者(Queue),代码下面给出,只有一个onMessage方法 -->
<bean id="queueListener" class="com.palmyou.ots.api.v7.mq.Msglistener">
</bean>

    <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory1" />
<property name="destination" ref="destination1" />
<property name="messageListener" ref="queueListener" />
</bean>

<bean id="connectionFactory1" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.1.103:61616"></property>
</bean>

<!-- 定义消息队列(Queue) -->
<bean id="destination1" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>  
        <value>OTS_Order</value>  
    </constructor-arg>  
</bean>


   <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
<bean id="jmsTemplate1" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory1"></property>
<property name="defaultDestination" ref="destination1"></property>
<property name="receiveTimeout" value="600"></property>
</bean>

</beans>




发布/订阅 
 <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">  例子参考(http://nettm.iteye.com/blog/1828268

 )


Topic

Queue

概要

Publish Subscribe messaging 发布订阅消息

Point-to-Point 点对点

有无状态

topic数据默认不落地,是无状态的。

Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。

完整性保障

并不保证publisher发布的每条数据,Subscriber都能接受到。

Queue保证每条数据都能被receiver接收。

消息是否会丢失

一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。

Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。

消息发布接收策略

一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器

一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值