`
jiangchuhan
  • 浏览: 17045 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

DefaultMessageListenerContainer事务相关问题

 
阅读更多

使用DefaultMessageListenerContainer作为消息接收器,典型的配置如下:

<bean id="queueListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="mqConnectionFactory" />
<property name="destination" ref="queueIn" /><!-- 接收队列 -->
<property name="concurrentConsumers" value="3" /><!-- 控制同时启几个concurrent listener threads -->
<property name="messageListener" ref="messageReceiver" />
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="sessionTransacted" value="true" />
</bean>

<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="mqConnectionFactory" />

</bean>


其中的JmsTransactionManager会将messageReceiver的onMessage方法当作一个事务,如果后续的消息处理程序耗时很长,比如我的系统就有一个耗时n个小时的消息处理程序,这样的话,onMessage方法作为一个事务就一直无法提交了,表现为消息队列中的消息是假的被取走了,也就是说这时候看到的队列中消息数量减少了一个,但是当事务回滚了或者进程意外终止,那个被取走的消息又回到队列中了,这也正是事务的作用。如果这个时候同时收到并正在处理的消息已经达到concurrentConsumers的数量,那么消息接收器DefaultMessageListenerContainer就不会再响应新的消息了。

(我曾经在论坛发过的相关问题:http://topic.csdn.net/u/20110301/16/8e73219d-667d-455d-87eb-43c0853f6f0b.html)

如果你的应用是将整个接收到处理完的过程作为一个事务,那么就需要按照原本的做法;如果你不希望因为事务处理时间过长而影响消息接收,那么可以在接收到消息后另外启动一个线程来做消息处理,这样的话onMessage方法的这个事务在启动了消息处理的线程之后就结束了。

在onMessage方法里:

1、作为一整个事务:

notifyObservers(messageStr);//一般都会将消息处理实现为Observer模式

2、单独启动一个线程:

Thread t = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
notifyObservers(messageStr);
}
});
t.start();

分享到:
评论

相关推荐

    Spring整合JMS(四)——事务管理

    在Spring框架中,Java消息服务(Java Message Service,简称JMS)被广泛用于实现应用程序间的异步通信。...通过Spring的声明式事务管理,我们可以优雅地处理这些问题,而无需深入研究底层的事务细节。

    activemq整合spring

    1. **引入依赖**:首先,需要在项目中引入ActiveMQ和Spring相关的库,通常是通过Maven或Gradle的依赖管理来实现。 2. **配置ActiveMQ连接**:在Spring的XML配置文件中,定义一个`ConnectionFactory`,这是连接到...

    ActiveMQ+spring配置方案详解

    首先,我们需要在项目中引入ActiveMQ的相关依赖。这通常通过在`pom.xml`文件中添加Maven依赖来完成。对于ActiveMQ,我们需要添加如下依赖: ```xml &lt;groupId&gt;org.apache.activemq &lt;artifactId&gt;activemq-spring ...

    JMS入门Demo

    &lt;bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt; &lt;property name="connectionFactory" ref="connectionFactory" /&gt; ...

    Spring In Action 使用Spring发送和接收JMS消息

    在Spring应用中,我们需要配置JMS相关的bean,如ConnectionFactory、Destination(Queue或Topic)、MessageListener等。这些可以通过XML或Java配置实现。 2.3 发送消息 Spring提供了JmsTemplate类,用于发送JMS消息...

    最新版spring-framework-5.0.1.RELEASE-schema.zip约束

    这个压缩包“spring-framework-5.0.1.RELEASE-schema.zip”包含了与Spring框架相关的XML约束文件,这些文件定义了配置文件中的元素和属性,确保了正确和一致的配置。 1. **mvc** - 这部分涉及到Spring MVC(Model-...

    spring-framework-2.5.6jar包

    在Spring 2.5.6中,你可以利用MessageDrivenPojo和DefaultMessageListenerContainer来处理消息。 最后,Spring的测试模块提供了方便的单元测试和集成测试工具,如MockMVC和TestContext框架,帮助开发者编写和执行...

    Spring+Weblogic JMS

    3. **创建消息监听器容器**:Spring的`DefaultMessageListenerContainer`或`SimpleMessageListenerContainer`允许我们在后台运行消息监听器。我们需要指定连接工厂、目的地以及消息监听器接口的实现类。 4. **定义...

    jms Spring+ActiveMQ 5.4.2

    5. **MessageListener接口**:为了接收消息,我们可以实现MessageListener接口,或者使用MessageDrivenPojo(MDP)和DefaultMessageListenerContainer。 6. **消息类型**:JMS支持两种基本的消息模式:点对点...

    JMS整合Spirng

    Spring提供多种容器集成,如`DefaultMessageListenerContainer`和`SimpleMessageListenerContainer`,它们可以自动启动监听器并处理线程池和异常恢复。 8. **测试支持** Spring提供了`MockJmsTemplate`和`...

    activemq spring整合

    通过设置`ExceptionListener`,你可以捕获和处理与JMS相关的异常。 10. **测试与监控** 使用Spring的`ActiveMQConnectionFactory`,你可以创建一个`BrokerService` bean来启动和停止ActiveMQ服务器,方便在测试...

    使用Spring JMS轻松实现异步消息传递.pdf

    5. **集成友好**:Spring 框架的整体设计使得 JMS 可以无缝地与其他 Spring 组件(如事务管理、AOP、数据访问等)集成。 **使用 Spring JMS 实现异步处理** 在 Spring 中,发送 JMS 消息通常涉及以下步骤: 1. ...

    activemq与spring整合

    在 Maven 或 Gradle 的配置文件中,添加 ActiveMQ 和 Spring JMS 相关的依赖库。 #### 3.2 配置 ActiveMQ 在 Spring 的配置文件中,定义一个 `ConnectionFactory`,通常使用 `ActiveMQConnectionFactory` 类。同时...

    SpringJMMS

    3. **MessageListenerContainer**: Spring提供了多种MessageListenerContainer实现,如SimpleMessageListenerContainer、DefaultMessageListenerContainer等,它们负责接收和处理消息。这些容器可以自动管理消息监听...

    ActiveMQ+Spring

    对于发布/订阅模式,可以使用`DefaultMessageListenerContainer`监听Topic。在监听器中实现`MessageListener`接口,处理接收到的消息。 6. **事务管理**:如果需要确保消息的原子性,Spring支持JMS事务,可以在发送...

    activeMQ测试程序

    **正文** ActiveMQ是Apache软件基金会...Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等类为发送和接收消息提供了便捷的API。在`TestActiveMq`程序中,我们可能看到了以下配置: ```xml ...

    Spring整合JMS

    Spring的`DefaultMessageListenerContainer`和`SimpleMessageListenerContainer`允许我们在后台自动接收消息,而无需手动创建线程或处理回调。它们负责管理和调度消息监听器,确保在接收到新消息时能够正确调用处理...

    SpringActiveMQ.rar

    4. **消息消费者**:使用Spring的监听容器(如`DefaultMessageListenerContainer`),我们可以创建一个消息监听器来处理接收到的消息。监听器通常是一个实现了`MessageListener`接口的类,其中的`onMessage`方法会在...

    spring-jms-4.3.4.RELEASE.zip

    在Spring的配置文件中,开发者可以轻松定义消息模板、监听容器和消息驱动的POJO,从而降低与JMS相关的代码复杂性。 核心概念包括: 1. **MessageTemplate**:这是Spring JMS提供的主要工具类,用于发送JMS消息。它...

    Spring+ActiveMQ消息队列+前台接收消息

    1. **配置ActiveMQ**:首先,你需要在你的项目中引入ActiveMQ的相关依赖。在Maven的pom.xml文件中,添加ActiveMQ的客户端库,并确保你的Spring配置文件中包含ActiveMQ的连接工厂配置。 2. **创建消息生产者**:在...

Global site tag (gtag.js) - Google Analytics