`
daiwanqian
  • 浏览: 5051 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DefaultMessageListenerContainer

    博客分类:
  • jms
 
阅读更多
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连接。
分享到:
评论

相关推荐

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

    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory()); container.setMessageListener(messageListener()); container....

    spring下queue与持久订阅topic实现

    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setDestinationName("myTopic"); container....

    activemq整合spring

    “xml中包含DefaultMessageListenerContainer”,这表明配置文件(可能是Spring的XML配置文件)定义了一个`DefaultMessageListenerContainer`实例。这个bean负责连接到ActiveMQ服务器,并定义了消息监听器,当接收到...

    spring集成JMS

    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setMessageListener(listenerAdapter); container....

    JMS与Spring之二(用message listener container异步收发消息)

    Spring 提供了两种 message listener container:DefaultMessageListenerContainer 和 SimpleMessageListenerContainer。DefaultMessageListenerContainer 可以动态调整监听线程的数量,并且可以与 XA 事务集成。...

    activeMQ测试程序

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

    ActiveMq发布和订阅消息的实现源码

    3. **Spring整合**:Spring框架提供了方便的ActiveMQ集成,通过`JmsTemplate`和`DefaultMessageListenerContainer`等组件简化了消息操作。在Spring配置文件中,我们可以定义`ConnectionFactory`、`Destination`和`...

    activemq-demo

    Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等类使得发送和接收消息变得简单易行。 首先,我们需要理解Spring与ActiveMQ集成的基本原理。在Spring中,我们通常会定义一个`ConnectionFactory`,它是...

    Spring JMS消息处理-不基于JNDI

    这里定义了一个DefaultMessageListenerContainer,指定了之前配置的ConnectionFactory和Destination,同时注册了自定义的消息监听器MyMessageListener。 在消息监听器中,我们需要实现MessageListener接口,并重写...

    spring+activemq

    接下来,**Spring与ActiveMQ的集成**:在Spring应用中配置ActiveMQ,通常需要在Spring配置文件中定义`JmsTemplate`和`DefaultMessageListenerContainer`。`JmsTemplate`用于发送消息,而`...

    Spring JMS 消息处理-基于JNDI

    <bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> ``` 3. **定义消息监听器**: 创建一个实现了`javax.jms.MessageListener`接口的类...

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

    在Spring整合JMS的过程中,我们通常会使用`DefaultMessageListenerContainer`或`SimpleMessageListenerContainer`类来消费消息。这些容器提供了与JMS提供者(如ActiveMQ、RabbitMQ等)的连接管理,并且支持事务性...

    ActiveMQ整合Spirng的一个demo

    然后,我们可以通过监听器容器(如DefaultMessageListenerContainer)来设置消息监听器,监听特定Destination的消息。 在代码层面,我们可以创建一个实现了MessageListener接口的类,重写onMessage方法,当有新消息...

    activemq spring整合

    这可以通过设置`JmsTemplate`的`sessionTransacted`属性和`DefaultMessageListenerContainer`的`transactionManager`属性来实现。 8. **消息确认策略** 默认情况下,ActiveMQ使用自动确认模式,但你可以配置为...

    ActiveMQSpringDemo

    通过Spring的`JmsTemplate`和`DefaultMessageListenerContainer`等工具,我们可以方便地发送和接收消息,而无需深入理解底层的JMS细节。 ### 2. 配置ActiveMQ 首先,我们需要在项目中引入ActiveMQ的依赖。这通常在...

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

    对于想要深入了解Spring JMS工作原理的开发者,可以研究Spring框架的源码,例如JmsTemplate、DefaultMessageListenerContainer等关键类,这有助于更好地定制和优化JMS的使用。 总结,Spring对JMS的支持使得开发者...

    springboot activemq

    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setDestinationName("myQueue"); // 设置队列名称 ...

    ActiveMQ-P2P文本消息

    在IT行业中,消息传递是分布式系统中至关重要的一个部分,它允许不同的组件之间进行异步通信,从而提高系统的可扩展性和容错性。ActiveMQ,作为Apache软件基金会的一个开源项目,是Java消息服务(JMS)的一个实现,...

    JMS之ActiveMQ与Spring整合源码

    消费者可以通过实现`MessageListener`接口或者使用`DefaultMessageListenerContainer`来接收消息。`MessageListener`接口只有一个`onMessage(Message message)`方法,当接收到消息时会被调用。`...

Global site tag (gtag.js) - Google Analytics