关于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读取消息时,应该是不会出现并发控制的问题吧?
...全文
397 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
续写经典 2012-07-31
  • 打赏
  • 举报
回复
学习一下!
宁波朱超 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被并发访问就存在问题了。
Apache JMeter应用程序是开源软件,是一个 100% 纯 Java 应用程序,它对被测系统(测试静态资源、动态资源、web应用程序等)进行负载测试、压力测试、容量测试等多种性能测试。Apache JMeter 功能包括:能够加载和性能测试许多不同的应用程序/服务器/协议类型:Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)SOAP / REST WebservicesFTP文件传输协议Database via JDBCLDAPMessage-oriented middleware (MOM) via JMSMail - SMTP(S), POP3(S) and IMAP(S)Native commands or shell scriptsTCPJava Objects全功能测试IDE,允许快速测试计划记录(从浏览器或本机应用程序)、构建和调试;CLI 模式(命令行模式(以前​​称为非 GUI)/headless 模式)从任何Java兼容操作系统(Linux、Windows、Mac OSX 等)进行负载测试;一个完整且呈现的动态 HTML 报告;通过HTML、JSON、 XML、文本的响应格式中提取数据进行关联;完全可移植性和100%纯Java代码;完整多线程框架允许多个线程并发采样和不同线程组同时采样不同的函数;测试结果的缓存和离线分析/回放。高度可扩展的核心:可插拔采样器允许无限的测试能力脚本采样器(JSR223 兼容语言,如Groovy和 BeanShell)可以使用可插入计时器选择多个负载统计信息数据分析和可视化插件允许很大的可扩展性和个性化函数可用于为测试提供动态输入或提供数据操作通过适用于Maven、Gradle 和 Jenkins 的第三方开源库轻松持续集成。 本套课程内容:1.    JMeter概述2.    HTTPS协议简介3.    JMeter下载地址4.    JMeter软件安装5.    JMeter录制HTTPS协议步骤6.    Badboy录制脚本7.    手工编写脚本8.    项目实操:JMeter编写HTTPS协议脚本

23,404

社区成员

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

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