代码之家  ›  专栏  ›  技术社区  ›  Iker Jimenez

处理来自SpringJMS的JMS消息的最快方法

  •  4
  • Iker Jimenez  · 技术社区  · 14 年前

    我有一个JMS队列,其中有无数条消息要处理。我将使用SpringJMS从这个队列中读取一些侦听器。

    我对不同的ListenerContainers和它们可能的配置有些迷茫。 我的要求是:

    • 显然是异步处理。
    • 不需要事务处理,如果发生故障,我可以承受丢失一些消息的代价。
    • 我需要原始速度!
    • 我用ActiveMQ做经纪人。

    任何人都有关于要使用的ListenerContainer的建议,以及关于JMS会话、线程等数量的配置。

    机器将有8个核心,大量的内存。

    2 回复  |  直到 14 年前
        1
  •  4
  •   skaffman    14 年前

    除非你有特殊的理由,否则你应该使用 DefaultMessageListenerContainer . 在性能和配置方面,这是最灵活的。相反, SimpleMessageListenerContainer 有点太简单了,不能实际使用。

    我不能建议您设置并发使用者的数量,因为这完全取决于您的设置。

        2
  •  1
  •   jcalvert    14 年前

    我会调查使用 Spring Integration . 这使得设置基于JMS的应用程序变得非常容易。

        <bean id="commandQueue" class="org.apache.activemq.command.ActiveMQQueue">
                <constructor-arg value="queue.command"/>
        </bean>
    
        <jms:message-driven-channel-adapter
        id="jmsin" destination="commandQueue" channel="commandChannel" />
    
        <int:channel id="commandChannel" />
    

    所以在上面的XML块中,您创建了一个“通道”,这是一个抽象的队列概念。您将JMS队列定义为普通队列,然后只定义一个适配器。

        <service-activator input-channel="commandChannel" 
               ref="commandWatcher" method="processCommand">
        <poller task-executor="pool">
            <interval-trigger interval="100"/>
        </poller>
    </service-activator>
    
    <bean id="commandWatcher" class="foo.bar.Pojo" scope="prototype"/>
    
        <bean id="pool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
     <property name="corePoolSize" value="8" />   
         </beans:bean>
    

    因此,上面的代码只定义了一个“服务激活器”,这意味着每隔100毫秒,它就会查看队列中是否有消息。然后,它提取该消息并通过将该消息传递给POJO在线程池中处理它。您定义了一个简单的方法,它可以将有效负载作为一个字符串,或者如果您将它作为一个序列化对象,您可以这样做。如果您需要更多的语义,比如头,您可以使用注释并将头作为映射获取。

    这使得JMS的东西变得无痛…