使用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();
分享到:
相关推荐
例如,我们可以使用`JmsTemplate`的`setSessionTransacted(true)`方法开启事务,或者在`DefaultMessageListenerContainer`中设置`transactionManager`属性。 此外,我们还需要关注事务隔离级别和超时设置。事务隔离...
1. **引入依赖**:首先,需要在项目中引入ActiveMQ和Spring相关的库,通常是通过Maven或Gradle的依赖管理来实现。 2. **配置ActiveMQ连接**:在Spring的XML配置文件中,定义一个`ConnectionFactory`,这是连接到...
首先,我们需要在项目中引入ActiveMQ的相关依赖。这通常通过在`pom.xml`文件中添加Maven依赖来完成。对于ActiveMQ,我们需要添加如下依赖: ```xml <groupId>org.apache.activemq <artifactId>activemq-spring ...
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> ...
在Spring应用中,我们需要配置JMS相关的bean,如ConnectionFactory、Destination(Queue或Topic)、MessageListener等。这些可以通过XML或Java配置实现。 2.3 发送消息 Spring提供了JmsTemplate类,用于发送JMS消息...
这个压缩包“spring-framework-5.0.1.RELEASE-schema.zip”包含了与Spring框架相关的XML约束文件,这些文件定义了配置文件中的元素和属性,确保了正确和一致的配置。 1. **mvc** - 这部分涉及到Spring MVC(Model-...
在Spring 2.5.6中,你可以利用MessageDrivenPojo和DefaultMessageListenerContainer来处理消息。 最后,Spring的测试模块提供了方便的单元测试和集成测试工具,如MockMVC和TestContext框架,帮助开发者编写和执行...
3. **创建消息监听器容器**:Spring的`DefaultMessageListenerContainer`或`SimpleMessageListenerContainer`允许我们在后台运行消息监听器。我们需要指定连接工厂、目的地以及消息监听器接口的实现类。 4. **定义...
Spring提供多种容器集成,如`DefaultMessageListenerContainer`和`SimpleMessageListenerContainer`,它们可以自动启动监听器并处理线程池和异常恢复。 8. **测试支持** Spring提供了`MockJmsTemplate`和`...
通过设置`ExceptionListener`,你可以捕获和处理与JMS相关的异常。 10. **测试与监控** 使用Spring的`ActiveMQConnectionFactory`,你可以创建一个`BrokerService` bean来启动和停止ActiveMQ服务器,方便在测试...
5. **集成友好**:Spring 框架的整体设计使得 JMS 可以无缝地与其他 Spring 组件(如事务管理、AOP、数据访问等)集成。 **使用 Spring JMS 实现异步处理** 在 Spring 中,发送 JMS 消息通常涉及以下步骤: 1. ...
5. **MessageListener接口**:为了接收消息,我们可以实现MessageListener接口,或者使用MessageDrivenPojo(MDP)和DefaultMessageListenerContainer。 6. **消息类型**:JMS支持两种基本的消息模式:点对点...
对于发布/订阅模式,可以使用`DefaultMessageListenerContainer`监听Topic。在监听器中实现`MessageListener`接口,处理接收到的消息。 6. **事务管理**:如果需要确保消息的原子性,Spring支持JMS事务,可以在发送...
**正文** ActiveMQ是Apache软件基金会...Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等类为发送和接收消息提供了便捷的API。在`TestActiveMq`程序中,我们可能看到了以下配置: ```xml ...
Spring的`DefaultMessageListenerContainer`和`SimpleMessageListenerContainer`允许我们在后台自动接收消息,而无需手动创建线程或处理回调。它们负责管理和调度消息监听器,确保在接收到新消息时能够正确调用处理...
4. **消息消费者**:使用Spring的监听容器(如`DefaultMessageListenerContainer`),我们可以创建一个消息监听器来处理接收到的消息。监听器通常是一个实现了`MessageListener`接口的类,其中的`onMessage`方法会在...
在Spring的配置文件中,开发者可以轻松定义消息模板、监听容器和消息驱动的POJO,从而降低与JMS相关的代码复杂性。 核心概念包括: 1. **MessageTemplate**:这是Spring JMS提供的主要工具类,用于发送JMS消息。它...
1. **配置ActiveMQ**:首先,你需要在你的项目中引入ActiveMQ的相关依赖。在Maven的pom.xml文件中,添加ActiveMQ的客户端库,并确保你的Spring配置文件中包含ActiveMQ的连接工厂配置。 2. **创建消息生产者**:在...
Spring通过`org.springframework.jms`包提供对JMS的支持,包括消息生产者(MessageProducer)、消息消费者(MessageConsumer)以及事务管理等。主要涉及以下组件: - `ConnectionFactory`:这是创建JMS会话的工厂,...
在 Maven 或 Gradle 的配置文件中,添加 ActiveMQ 和 Spring JMS 相关的依赖库。 #### 3.2 配置 ActiveMQ 在 Spring 的配置文件中,定义一个 `ConnectionFactory`,通常使用 `ActiveMQConnectionFactory` 类。同时...