DefaultMessageListenerContainer继承自AbstractPollingMessageListenerContainer,主要使用同步的方式接收消息(也就是通过循环调用MessageConsumer.receive的方式接收消息)。该类主要的属性如下:
Java代码
private int concurrentConsumers = 1;
private int maxConcurrentConsumers = 1;
private int maxMessagesPerTask = Integer.MIN_VALUE;
private int idleTaskExecutionLimit = 1;
private final Set scheduledInvokers = new HashSet();
private TaskExecutor taskExecutor;
private int cacheLevel = CACHE_AUTO
跟SimpleMessageListenerContainer一样,DefaultMessageListenerContainer也支持创建多个Session和MessageConsumer来接收消息。跟SimpleMessageListenerContainer不同的是,DefaultMessageListenerContainer创建了concurrentConsumers所指定个数的AsyncMessageListenerInvoker(实现了SchedulingAwareRunnable接口),并交给taskExecutor运行。
maxMessagesPerTask属性的默认值是Integer.MIN_VALUE,但是如果设置的taskExecutor(默认值是SimpleAsyncTaskExecutor)实现了SchedulingTaskExecutor接口并且其prefersShortLivedTasks方法返回true(也就是说该TaskExecutor倾向于短期任务),那么maxMessagesPerTask属性会自动被设置为10。
如果maxMessagesPerTask属性的值小于0,那么AsyncMessageListenerInvoker.run方法会在循环中反复尝试接收消息,并在接收到消息后调用MessageListener(或者SessionAwareMessageListener);如果maxMessagesPerTask属性的值不小于0,那么AsyncMessageListenerInvoker.run方法里最多会尝试接收消息maxMessagesPerTask次,每次接收消息的超时时间由其父类AbstractPollingMessageListenerContainer的receiveTimeout属性指定。如果在这些尝试中都没有接收到消息,那么AsyncMessageListenerInvoker的idleTaskExecutionCount属性会被累加。在run方法执行完毕前会对idleTaskExecutionCount进行检查,如果该值超过了DefaultMessageListenerContainer.idleTaskExecutionLimit(默认值1),那么这个AsyncMessageListenerInvoker可能会被销毁。
所有AsyncMessageListenerInvoker实例都保存在scheduledInvokers中,实例的个数可以在concurrentConsumers和maxConcurrentConsumers之间浮动。跟SimpleMessageListenerContainer一样,应该只是在Destination为Queue的时候才使用多个AsyncMessageListenerInvoker实例。
cacheLevel属性用于指定是否对JMS资源进行缓存,可选的值是CACHE_NONE = 0、CACHE_CONNECTION = 1、CACHE_SESSION = 2、CACHE_CONSUMER = 3和CACHE_AUTO = 4。默认情况下,如果transactionManager属性不为null,那么cacheLevel被自动设置为CACHE_NONE(不进行缓存),否则cacheLevel被自动设置为CACHE_CONSUMER。
如果cacheLevel属性值大于等于CACHE_CONNECTION,那么sharedConnectionEnabled方法(在AbstractJmsListeningContainer中定义)返回true,也就是说使用共享的JMS连接。
分享到:
相关推荐
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory()); container.setMessageListener(messageListener()); container....
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setDestinationName("myTopic"); container....
“xml中包含DefaultMessageListenerContainer”,这表明配置文件(可能是Spring的XML配置文件)定义了一个`DefaultMessageListenerContainer`实例。这个bean负责连接到ActiveMQ服务器,并定义了消息监听器,当接收到...
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setMessageListener(listenerAdapter); container....
Spring 提供了两种 message listener container:DefaultMessageListenerContainer 和 SimpleMessageListenerContainer。DefaultMessageListenerContainer 可以动态调整监听线程的数量,并且可以与 XA 事务集成。...
**正文** ActiveMQ是Apache软件基金会...Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等类为发送和接收消息提供了便捷的API。在`TestActiveMq`程序中,我们可能看到了以下配置: ```xml ...
3. **Spring整合**:Spring框架提供了方便的ActiveMQ集成,通过`JmsTemplate`和`DefaultMessageListenerContainer`等组件简化了消息操作。在Spring配置文件中,我们可以定义`ConnectionFactory`、`Destination`和`...
Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等类使得发送和接收消息变得简单易行。 首先,我们需要理解Spring与ActiveMQ集成的基本原理。在Spring中,我们通常会定义一个`ConnectionFactory`,它是...
这里定义了一个DefaultMessageListenerContainer,指定了之前配置的ConnectionFactory和Destination,同时注册了自定义的消息监听器MyMessageListener。 在消息监听器中,我们需要实现MessageListener接口,并重写...
接下来,**Spring与ActiveMQ的集成**:在Spring应用中配置ActiveMQ,通常需要在Spring配置文件中定义`JmsTemplate`和`DefaultMessageListenerContainer`。`JmsTemplate`用于发送消息,而`...
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> ``` 3. **定义消息监听器**: 创建一个实现了`javax.jms.MessageListener`接口的类...
在Spring整合JMS的过程中,我们通常会使用`DefaultMessageListenerContainer`或`SimpleMessageListenerContainer`类来消费消息。这些容器提供了与JMS提供者(如ActiveMQ、RabbitMQ等)的连接管理,并且支持事务性...
然后,我们可以通过监听器容器(如DefaultMessageListenerContainer)来设置消息监听器,监听特定Destination的消息。 在代码层面,我们可以创建一个实现了MessageListener接口的类,重写onMessage方法,当有新消息...
这可以通过设置`JmsTemplate`的`sessionTransacted`属性和`DefaultMessageListenerContainer`的`transactionManager`属性来实现。 8. **消息确认策略** 默认情况下,ActiveMQ使用自动确认模式,但你可以配置为...
通过Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等工具,我们可以方便地发送和接收消息,而无需深入理解底层的JMS细节。 ### 2. 配置ActiveMQ 首先,我们需要在项目中引入ActiveMQ的依赖。这通常在...
对于想要深入了解Spring JMS工作原理的开发者,可以研究Spring框架的源码,例如JmsTemplate、DefaultMessageListenerContainer等关键类,这有助于更好地定制和优化JMS的使用。 总结,Spring对JMS的支持使得开发者...
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setDestinationName("myQueue"); // 设置队列名称 ...
在IT行业中,消息传递是分布式系统中至关重要的一个部分,它允许不同的组件之间进行异步通信,从而提高系统的可扩展性和容错性。ActiveMQ,作为Apache软件基金会的一个开源项目,是Java消息服务(JMS)的一个实现,...
消费者可以通过实现`MessageListener`接口或者使用`DefaultMessageListenerContainer`来接收消息。`MessageListener`接口只有一个`onMessage(Message message)`方法,当接收到消息时会被调用。`...