关于jms的问题,希望大家进来讨论
学习总结:
JMS(java Message Server)java消息服务。
分为两种消息机制:
(1)Publish/Subscriber发布/订阅,体现在Topic上,通俗的讲即为广播方式,只要对某个Topic进行listener那么这个Topic上的所有消息你都可以收到,无论是不是你发的或跟你有没有关系。但是如果你没有开listener,那么就收不到任何的消息,而且你只能收到你开listener后发到该Topic上的消息。如果想接收所有你没有收到(包括在没有开listener时的消息)的消息可以使用persistent(持久性)(即使server被重新启动过仍然可以收到),weblogic是通过Store来实现persistent,最简单的方式是建一个FileStore然后设置Topic的ConnectionFactory的ClientID,连接代码在TopicReceive.java中有。MDB(Message Driver Bean)可以作为EJB发布在weblogic上对请求的消息进行相应的处理,然后把处理的结果Publisher
(2)Point/Point点对点,体现在Queue。与上面方式主要区别在这种方式自动实现persistent,即你的listener不用在发出消息前开着也可以收到消息;另一个区别在于它不是广播式的而是一对一的,即多个同时对一个Queue进行监听的listener只有其中的一个可以收到消息,至于那一个没有规则,可能是按照他们listener的顺序,第一个listener的先收到第一个消息,下一个消息就被第二个listener收到,以此循环。最大的疑问《如果两个listener联到同一个Queue上,如果Queue有消息向外广播那么只能有一个listener收到该消息。由此产生问题,当1向Queue发送一个消息后,Queue将处理结果广播出来,而这时恰巧2开始listener这个Queue了,就有可能1无法收到结果消息,而被2接收去了》
最想不通的地方:
我觉得在消息机制中,无论是那种方式都无法实现只接收我自己发出消息的处理结果?????
下面有两种解决方案,我觉得都有不妥之处:
1、使用p/p机制。不妥之处在上面的总结中已经提出疑问了。
2、在listener中进行判断,对自己发出请求在处理结果中用特出的标志标记。这种方法确实可以解决上面的问题,但也太笨了吧!!!!
附注:
本人并没有用jms做过什么项目,只是将来的项目可能会用到所以最近学习了一下,把学习总结和疑问贴出来,希望大家讨论。