无论采用哪种JMS 组件,JMS 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:PTP Domain 和Pub/Sub Domain。



          PTP(使用Queue即队列目标)     消息从一个生产者传送至一个消费者。在此传送模型中,目标是一个队列。消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息。可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至、并由一个消费者成功使用。如果没有已经向队列目标注册的消费者,队列将保留它收到的消息,并在某个消费者向该队列进行注册时将消息传送给该消费者。



         Pub/Sub(使用Topic即主题目标)     消息从一个生产者传送至任意数量的消费者。在此传送模型中,目标是一个主题。消息首先被传送至主题目标,然后传送至所有已订阅此主题的活动消费者。可以向主题目标发送消息的生产者的数量没有限制,并且每个消息可以发送至任意数量的订阅消费者。主题目标也支持持久订阅的概念。持久订阅表示消费者已向主题目标进行注册,但在消息传送时此消费者可以处于非活动状态。当此消费者再次处于活动状态时,它将接收此信息。如果没有已经向主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。



这两种消息传送模型使用表示不同编程域的 API 对象(其语义稍有不同)进行处理。 



         在ActiveMQ中针对消息的发送实现类似Queue的队列的一对多实现,保障在消息发送端发送消息,客户端中无论是否启动必须始终可以接收到发送端发送的数据的实现。

目前有两种思路:

1.将一对多的发送消息采用Queue的方式主要将一对多分解为多个点对点的Queue发送消息。

   优点: 简单,容易实现,既保证消息发送的可靠性又实现了相关的功能。

  缺点:不便于管理,但是比较占用宽带不利于在局域网或者广域网发送消息。

 

2.将一对多发送消息采用发布订阅模式(Topic)模式

     需要将启动的时候事先进行消费者注册了持久订阅实现相关的功能,重写部分功能实现。

 

针对第二种方案怎么实现?请知道大侠,指点迷津,多谢了!

 

 

  

1、消息文件越来越多,导致超出了存储空间

报错日志:Usage Manager Store is Full, 100% of 1073741824. Stopping producer (ID:db01-48754-1336034955132-0:5:1:1) to prevent flooding queue://queue.land.group. See http://activemq.apache.org/producer-flow-control.html for more info (blocking for: 1s) | org.apache.activemq.broker.region.Queue | ActiveMQ Transport: tcp:///172.24.99.41:44716

这是由于我们在配置文件中设置了storeUsage ,当存储的消息文件(log文件)超过了这值就会报这个异常,在官方网站看到说消息文件不删除是5.3版本的一个bug,在5.5版本的时候已经被解决了,但是我们使用的是5.5.1版本啊,然后在看存储下来的消息文件,文件名不是连续的,那么说明其中还是有被删除的,后来在评论中看到Jeff Genender说的这个可能是ActiveMQ的线程调度问题,只要不使用线程调度就可以了,在broker中设置属性schedulerSupport=”false” ,这样消息文件就会自动在cleanup阶段删除了。

官方网址:https://issues.apache.org/jira/browse/AMQ-2736?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel