JMS Connection 管理

最近遇到Connection Leak问题, 于是翻看了JMS Specification的关于Connection的章节, 并作一个简单总结. 对于JMS的概念, 文档如是说:

写道
JMS provides a common way for Java programs to create, send, receive and read an enterprise messaging system’s messages.
......

JMS is a set of interfaces and associated semantics that define how a JMS client accesses the facilities of an enterprise messaging product.


1.连接的创建:
JMS Connection对象一般是封装了JMS客户端和JMS后台服务提供者之间的TCP/IP连接. JMS 客户端大多采用单连接的方式同JMS服务进行交互.与此相反, JDBC Connection则采用的TCP/IP多连接. 二者均是重量级对象, 宜缓存重用, 免反复创建. JMS应用程序什么时候该采用多连接, 参阅文档, 语焉不详, 描述如下:

JMS Specification 写道
Most clients will do all their messaging with a single Connection. Other more advanced applications may use several Connections. JMS does not architect a reason for using multiple connections (other than when a client acts as a gateway between two different providers); however, there may be operational reasons for doing so.

 

2.连接的启动:
JMS Connection创建之后, 便处于stop状态, 这意味着没有消息传送, 具体来讲是没有消息接收. 一般实践, 最好让Connection保持stop状态, 直到调用start()方法. 一旦start,  便开始接收异步消息了. 而此时客户端应用程序相关资源可能还没有准备好. 令人相当困惑的是, Connection的start不会影响到消息发送, 尚未start也可发送消息, 即使stop也可发送消息. 不知JMS这样设计何解.

3.连接的停止:
Connection可以通过stop()临时停止消息接收, 再通过start()来重启. Stop的调用将可能导致当前线程block,  因为它会等待Message Listener 执行完毕将控制权交还给JMS Provider才返回. 此外, stop 可能导致同步的消息接收产生timeout或者直接return null. 对已经停止的连接进行停止, 对已经启动的连接进行启动, 并不会导致异常产生, 会被自动ignore.

4.连接的关闭:
JMS提供者往往为Connection在客户端JVM之外分配了相当大的资源, close去release这些资源很有必要.close的影响如下:
1.当前Connection下的所有Session, Session下的所有Consumer, 在invoke receive期间, 可能收到Timeout Exception, 或者直接返回null. 如接收一系列消息进行合并解析, 消息便可能出现不完整, 无法进行下去. 在这里可以看到, 消息之间的dependency将大大增加了Connection管理的complication.
2.对于异步消息接收, 当若干个消息监听器正在处理消息, 这时候invoke close了, close将等待直到Message Listener 执行返回.
3.Connection被close后, 相关的Session等资源将自动被release, 无需对其相关资源进行处理了.
4.导致当前执行之中的Transaction, 非由外部Transaction Manager的Transaction发生rollback.
5.对于client-acknowledged的session, 当Connection已经关闭, 调用消息的acknowledge, 将抛出IllegalStateException. 当然, 消息本身还是可用的. 这是为了避免消息丢失和保证JMS客户端要求的消息能够按顺序地执行处理的持久订阅性.
6.关闭已经关闭的连接不会产生异常.
7.一旦Connection关闭, 尝试使用其相关的Session, Producer, Consumer可能抛出将抛出IllegalStateException.

 

 

参考: JavaTM Message Service Specification

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值