activeMQ 的2种消息机制

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里的消息采取删除或其他操作。


展开阅读全文

没有更多推荐了,返回首页