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