`
gdfloyd
  • 浏览: 74175 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    编码实现MQ连接池实现JMS消息发送连接管理

    这个Factory会负责创建和管理JMS Connection实例。 3. **配置连接池**:配置连接池参数,包括最大连接数、最小连接数、超时时间等。这些设置应根据实际应用的负载和资源限制来调整。 4. **获取和释放连接**:在...

    Spring + JMS + MQ Connection

    配置通常包含服务器地址、端口、队列管理器名等信息。 ```xml <bean id="connectionFactory" class="com.ibm.mq.jms.MQConnectionFactory"> ``` 接下来,我们需要创建一个JmsTemplate,它是Spring提供的...

    spring-jms源码

    4. 连接池和资源管理:CachingConnectionFactory是如何缓存JMS资源,如Connection、Session和Producer/Consumer,以提高性能。同时,了解其如何处理连接的生命周期和异常恢复。 5. 配置和定制:Spring JMS提供了一...

    JMS--J2EE培训材料

    1. **ConnectionFactory**:这是一个用于创建Connection的受管理对象。 2. **Connection**:代表与JMS提供者的活动连接。 3. **Destination**:封装消息目的地身份的受管理对象。它可以是队列或主题。 4. **Session*...

    JMS 规范(英文)

    3. **连接和会话**:JMS使用连接(Connection)和会话(Session)的概念来管理与消息服务器的通信。连接是JMS客户端与消息服务器之间的通信链路,而会话则是在连接之上创建的对象,用于发送和接收消息。 4. **消息...

    JMS学习笔记(一)——JMS简介安装ActiveMQ

    import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import org.apache....

    javax.jms包,sun的JMS接口规范包

    4. **连接和会话**:`Connection`接口代表与JMS提供者的连接,而`Session`接口则表示一个线程安全的上下文,用于创建消息生产者、消费者和消息。`Session`有事务支持,可以配置为非事务、单事务或自动提交事务。 5....

    Weblogic JMS 依赖jar包下载

    6. **编写生产者和消费者代码**:使用JMS API(如`javax.jms.Connection`,`Session`,`MessageProducer`,`MessageConsumer`等)来创建和发送消息,以及接收和处理消息。 在描述中提到的jar包下载,通常包括以下...

    Sun 官方JMS教程

    #### 六、JMS的安全性和管理 JMS还支持安全性特性,如身份验证和授权,以及管理特性,如消息持久化和事务处理。 - **安全性**:可以通过配置安全策略来保护消息的传输,防止未经授权的访问。 - **事务处理**:JMS...

    JMS入门文档,JMS入门文档

    5. **JMS事务管理**: - **Session事务**:在一个Session中进行的一组操作,要么全部成功,要么全部失败。 - **X/Open XA事务**:支持跨多个资源的分布式事务。 6. **持久性**: - 消息可以被持久化存储,即使...

    jms-1.1.jar

    JMS是Java平台的一个标准接口,它定义了生产、消费和管理消息的一组API。通过JMS,开发者可以使用消息中间件来传递数据,这种中间件能够处理消息的路由、缓冲和可靠传递,从而提高系统的可扩展性和解耦性。JMS支持两...

    weblogic_jms服务器配置

    JMS 服务器是 WebLogic 中管理和部署 JMS 资源的核心组件。每个 JMS 服务器可以配置不同的持久性存储,以满足不同的需求。 配置步骤: 1. 同样在 WebLogic 控制台,进入“服务” -> “消息传递” -> “JMS 服务器”...

    在Weblogic上配置JMS服务的方法

    接着,创建一个新的Connection Factory,选择SubDeployment JMS Subdeployment,指定JNDI名称为`jms/QueueConnectionFactory`,并将目标设置为myserver。 - **TopicConnectionFactory配置**: 同样创建一个新的JMS...

    JMS1.1规范(中文)

    11. **事务管理**:JMS1.1支持X/Open XA事务,允许将消息发送与数据库操作合并到一个全局事务中,确保数据一致性。 12. **选择器(Selector)**:在发布/订阅模型中,消费者可以通过选择器过滤收到的消息,只接收...

    JMS规范教程pdf

    ### JMS规范教程知识点解析 #### 一、JMS基本概念 **1.1 什么是JMS(JAVA MESSAGE SERVICE)?...JMS不仅提供了消息传递的基础结构,还涵盖了消息的管理和控制,使得开发者能够构建高效、可靠和灵活的企业级应用。

    JMS 简单使用指南

    - **管理对象**:通过JNDI(Java Naming and Directory Interface)查找,包括Connection Factory和Destination,确保与供应商的无关性,便于代码移植。 3. **JMS编程接口**: - **Message对象**:包含消息头、...

    JMS 教程 - 消息队列、消息服务

    JMS提供了一套标准的Java API,用于实现消息的生产、消费以及管理。JMS支持两种主要的消息传递模型:发布/订阅(Publish and Subscribe)和点对点(Point-to-Point)。这两种模型分别对应于不同的应用场景。 **发布...

    Weblogic上部署JMS

    JMS 在 WebLogic 中的部署涉及多个层次,包括 JMS Server、JMS Module、Topic、Connection Factory 和 Queue。这些组件的正确配置是实现 JMS 应用程序的关键。一旦部署完成,应用程序就可以通过 JNDI 查找并使用这些...

    JMS 中文 规范

    - **JMS接口:** JMS提供了一系列接口,如`javax.jms.Connection`、`javax.jms.Session`和`javax.jms.MessageProducer`等,用于创建连接、会话和消息生产者。 - **开发JMS应用:** - 开发JMS客户端涉及创建连接...

Global site tag (gtag.js) - Google Analytics