日期:2014-05-20  浏览次数:20627 次

关于JMS规范和多线程的一些疑问
在JMS规范中
ConnectionFactory
Destination(Queue和Topic)
认为是可以受管的,在服务器上可以使用jndi访问。

然后根据JMS规范的描述
ConnectionFactory
Connection
Destination(Queue和Topic)
都是线程安全的,也就是说多个线程公用不会造成并发访问控制的问题。
但是Session对象不是线程安全的,每个Thread都应当有自己的Session,才不会造成并发访问下的异常。

我的问题来了:根据目前我手上的api,不在容器中的话,只有用
Queue sessioncreateQueue(java.lang.String queueName) 和 Topic createTopic(java.lang.String topicName)
才能拿到Destination(Queue和Topic)的对象。而Destination(Queue和Topic)又是可以被多线程共享的。
那我如果再程序中想共享Destination(Queue和Topic)岂不是应该先用Connection去获得Session,然后用Session获得Destination(Queue和Topic)。然后再去关闭Session?
那也就是说说明根据JMS Destination(Queue和Topic) 虽然依赖于 Session创建,但是在使用的时候其实是和Session无关的?


另外还有个小问题是多线程使用同一个Connection对象,创建的Session读取消息时,应该是不会出现并发控制的问题吧?

------解决方案--------------------
“但是在使用的时候其实是和Session无关的?”
这句没太看懂楼主的意思。

实现线程安全,可以针对Queue和Topic两个对象来做,对其的新增、删除方法加同步即可。
最后一句话的问题,如果针对Queue和Topic做了同步,应该就没有并发不同步的问题了。
------解决方案--------------------
确实是的。

考虑把Session理解为数据库连接会话(Hibernate中也有Session的概念),Topic类似于一个表。

同一个表是可以被并发访问的;但同一个Session被并发访问就存在问题了。

------解决方案--------------------
刚刚开始研究jms的东西,的跟大牛没学学啊
------解决方案--------------------
这个。。。不回答问题就拿分。。。会不会不地道啊。。。
------解决方案--------------------
当然应该先用Connection去获得Session,
然后用Session获得Destination(Queue和Topic)。
然后再去关闭Session。


这是安全滴。



------解决方案--------------------
学习一下!