关于JMS规范和多线程的一些疑问

Squall1009 2012-07-19 12:18:37
在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读取消息时,应该是不会出现并发控制的问题吧?
...全文
425 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
续写经典 2012-07-31
  • 打赏
  • 举报
回复
学习一下!
朱超ZhuChao.Tech 2012-07-31
  • 打赏
  • 举报
回复
当然应该先用Connection去获得Session,
然后用Session获得Destination(Queue和Topic)。
然后再去关闭Session。


这是安全滴。


Squall1009 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

这个。。。不回答问题就拿分。。。会不会不地道啊。。。
[/Quote]
这个是帖子已经到非技术区了。。。
-AJ- 2012-07-31
  • 打赏
  • 举报
回复
这个。。。不回答问题就拿分。。。会不会不地道啊。。。
VanBaston 2012-07-31
  • 打赏
  • 举报
回复
刚刚开始研究jms的东西,的跟大牛没学学啊
Squall1009 2012-07-31
  • 打赏
  • 举报
回复
自己弄完,改个散分帖吧,平均给分好了
Squall1009 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
在JMS规范中
ConnectionFactory
Destination(Queue和Topic)
认为是可以受管的,在服务器上可以使用jndi访问。

然后根据JMS规范的描述
ConnectionFactory
Connection
Destination(Queue和Topic)
都是线程安全的,也就是说多个线程公用不会造成并发访问控制的问题。
但是Session对象不……
[/Quote]

根据目前我手上的api,不在容器中的话,只有用 Session的
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提供的创建Queue的Topic的途径只有通过Session创建。
但是Queue和Topic线程安全的是不需要同步的,session是非线程安全的,每个线程应该有自己的session。所以Queue和Topci应该是线程公用的。所以难道做的时候应该先初始化一个session去创建Queue和Topic ,然后再关掉session。以后线程都新建立session但Queue和Topic共享?

"最后一句话的问题,如果针对Queue和Topic做了同步,应该就没有并发不同步的问题了"
这个不需要同步。。。
brightyq 2012-07-19
  • 打赏
  • 举报
回复
“但是在使用的时候其实是和Session无关的?”
这句没太看懂楼主的意思。

实现线程安全,可以针对Queue和Topic两个对象来做,对其的新增、删除方法加同步即可。
最后一句话的问题,如果针对Queue和Topic做了同步,应该就没有并发不同步的问题了。
MiceRice 2012-07-19
  • 打赏
  • 举报
回复
确实是的。

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

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

23,409

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧