jms和spring集成的性能问题。以下配置有什么问题?

jms和spring集成的性能问题。以下配置有什么问题?,jms,activemq,messaging,spring-integration,Jms,Activemq,Messaging,Spring Integration,我有一个jms生产者,它每秒生成许多消息,这些消息被发送到amq持久队列,并由单个消费者使用,该消费者需要按顺序处理它们。但生产商似乎比消费者快得多,我的性能和内存都有问题。获取消息的速度非常慢,而且消费似乎是在间隔时间发生的(消费者以轮询方式“询问”消息,这很奇怪?!) 基本上,一切都是通过spring集成实现的。这是生产者端的配置。首先,stakesInMemoryChannel中的stakesInMemoryChannel消息经过过滤,抛出filteredStakesChannel,然后进

我有一个jms生产者,它每秒生成许多消息,这些消息被发送到amq持久队列,并由单个消费者使用,该消费者需要按顺序处理它们。但生产商似乎比消费者快得多,我的性能和内存都有问题。获取消息的速度非常慢,而且消费似乎是在间隔时间发生的(消费者以轮询方式“询问”消息,这很奇怪?!)

基本上,一切都是通过spring集成实现的。这是生产者端的配置。首先,stakesInMemoryChannel中的stakesInMemoryChannel消息经过过滤,抛出filteredStakesChannel,然后进入jms队列(使用executor,以便在单独的线程中发送)


另一个应用程序正在使用这样的消息。。。消息从jms stakesQueue进入StakeInputChannel,之后它们被路由到两个单独的通道,一个通道保存消息,另一个通道执行其他操作,我们称之为“处理”


不确定您所说的“按时间间隔”是什么意思(消费者“要求”以轮询方式发送消息,这很奇怪)

容器线程可能“看起来”像是在轮询,但事实并非如此;它们在消息到达或超时之前会阻塞AMQ客户端;当超时时,它会立即返回AMQ receive()

此配置看起来不错;对于一个线程,消耗率将直接取决于您在路由器下游所做的操作。

不确定您所说的“按间隔”是什么意思(消费者“要求”以轮询方式发送消息,这很奇怪)

容器线程可能“看起来”像是在轮询,但事实并非如此;它们在消息到达或超时之前会阻塞AMQ客户端;当超时时,它会立即返回AMQ receive()


此配置看起来不错;对于一个线程,消耗率将直接取决于您在路由器下游所做的操作。

建议使用。建议使用Spring JmsTemplate,它将连接、会话和消息生成器实例集中在一起,以便在它们不再在美国后返回e

我相信你在消费者方面看到的“间隔”行为是消费者超时

与Gary Russel所说的相反,
amq.receive()
确实有效地轮询了队列。Spring配置隐藏了这一点,但消息基本上是通过一个循环从队列中拉出的,该循环在队列的使用者上调用receive。队列的使用者在调用
receive()之前无法知道消息是否在队列中
尝试获取消息

与主题相反,您可以注册一个侦听器,在消息传入时执行操作。主题是一个优雅的解决方案,因为您注册了一个处理消息的侦听器


通过一个主题,您可以告诉activemq如何处理消息,通过一个队列,activemq只在您请求时提供消息。

建议使用。这建议用于Spring JmsTemplate,它将连接、会话和MessageProducer实例池在不再使用后返回

我相信你在消费者方面看到的“间隔”行为是消费者超时

与Gary Russel所说的相反,
amq.receive()
确实有效地轮询了队列。Spring配置隐藏了这一点,但消息基本上是通过一个循环从队列中拉出的,该循环在队列的使用者上调用receive。队列的使用者在调用
receive()之前无法知道消息是否在队列中
尝试获取消息

与主题相反,您可以注册一个侦听器,在消息传入时执行操作。主题是一个优雅的解决方案,因为您注册了一个处理消息的侦听器


通过一个主题,您可以告诉activemq如何处理消息,通过一个队列,activemq只在您请求时提供消息。

我使用jmeter创建了jms计划,它直接将消息发送到activemq。我发送了更多的消息-每20毫秒发送一条消息-消费者应用程序正在毫不延迟地完美地处理它们。。。因此,问题一定出在producer配置中。我使用jmeter创建了jms计划,它直接将消息发送到activemq。我发送了更多的消息(每20毫秒发送一条消息),消费者应用程序正在毫无延迟地完美地处理它们……因此,问题一定出在producer配置中。谢谢,我将使用池连接工厂…我将重复我对Gary说过的话…我用jmeter创建了jms计划,它直接向activemq发送消息。我发送了更多的消息-每20毫秒发送一条消息-消费者应用程序正在毫无延迟地完美处理这些消息…因此,问题一定出在生产者配置中“…确实有效地轮询队列…”是的;我的意思是Spring不会每隔一段时间(例如,每隔这么多毫秒)对队列进行“轮询”。实际上,除了超时后的快速周转之外,线程一直处于amq.receive()中等待消息到达。超时时间可以从默认值增加,但我们需要它,以便对其他事情做出反应,例如停止容器。啊,是的,它不会每隔一段时间轮询它,它本质上相当于一段时间(true)循环。很高兴我们在同一页上。谢谢,我将使用池连接工厂更改它…我将重复我对Gary说的话…我用jmeter创建了jms计划,它将消息直接发送到t
    <bean id="stakesQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg name="name" value="${jms.stakes.queue.name}" />
    </bean>

    <int:channel id="stakesInMemoryChannel" />

    <int:channel id="filteredStakesChannel" >
        <int:dispatcher task-executor="taskExecutor"/>
    </int:channel>

    <bean id="stakeFilterService" class="cayetano.games.stake.StakeFilterService"/>

    <int:filter 
       input-channel="stakesInMemoryChannel"
       output-channel="filteredStakesChannel" 
       throw-exception-on-rejection="false"
       expression="true"/>

    <jms:outbound-channel-adapter channel="filteredStakesChannel" destination="stakesQueue" delivery-persistent="true" explicit-qos-enabled="true"  />

    <task:executor id="taskExecutor" pool-size="100" />
    <bean id="stakesQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg name="name" value="${jms.stakes.queue.name}" />
</bean>

<jms:message-driven-channel-adapter 
    channel="stakesInputChannel" 
    destination="stakesQueue" 
    acknowledge="auto"
    concurrent-consumers="1"
    max-concurrent-consumers="1"
    />
<int:publish-subscribe-channel id="stakesInputChannel" />
<int:channel id="persistStakesChannel" />
<int:channel id="processStakesChannel" />

<int:recipient-list-router 
        id="customRouter" 
        input-channel="stakesInputChannel" 
        timeout="3000" 
        ignore-send-failures="true" 
        apply-sequence="true"
        >
    <int:recipient channel="persistStakesChannel"/>
    <int:recipient channel="processStakesChannel"/>
</int:recipient-list-router> 


<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
    <property name="queuePrefetch" value="${jms.broker.prefetch.policy}" />
</bean>

<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="${jms.broker.url}" />     
            <property name="prefetchPolicy" ref="prefetchPolicy" /> 
            <property name="optimizeAcknowledge" value="true" /> 
            <property name="useAsyncSend" value="true" />
        </bean>
    </property>
    <property name="sessionCacheSize" value="10"/>
    <property name="cacheProducers" value="false"/>
</bean>