我有一个使用Spring集成框架进行消息处理的应用程序(网关->转换->服务激活器)。我面临的问题之一是,处理消息的延迟相当长,从几毫秒到几秒不等。滞后并不总是一致的,似乎消息是突然被阻止并立即处理的。
我尝试使用YourKit对应用程序进行性能分析,但找不到任何死锁或阻塞线程。打开org.springframework.integration的DEBUG日志也没有提供太多信息。这是spring集成xml:
<int:gateway service-interface="com.test.MessageGateway"
id="msggateway" default-request-channel="msginputchannel" />
<int:channel id="msginputchannel">
<int:queue capacity="5000" />
</int:channel>
<int:bridge id="msginputbridge" input-channel="msginputchannel" output-channel="msgchannel">
<int:poller fixed-delay="100"/>
</int:bridge>
<int:channel id="msgchannel">
<int:queue capacity="5000" />
</int:channel>
<int:transformer input-channel="msgchannel"
output-channel="msgPubSubchannel" id="msgtransformer" ref="msgserializer" method="serialzeTo" >
<int:poller fixed-delay="100" />
</int:transformer>
<int:publish-subscribe-channel id="msgPubSubchannel" />
<int:bridge id="msgQueueSystembridge" input-channel="msgPubSubchannel" output-channel="msgQueueSystemqueuechannel"/>
<int:channel id="msgQueueSystemqueuechannel">
<int:queue capacity="5000"/>
</int:channel>
<int:service-activator id="msgQueueSystempublisher" ref="msgQueueSystemadapter" input-channel="msgQueueSystemqueuechannel" method="publish" >
<int:poller fixed-delay="100"/>
</int:service-activator>
<int:bridge id="msgbridge" input-channel="msgPubSubchannel" output-channel="msgFileSystemchannel"/>
<int:channel id="msgFileSystemchannel">
<int:queue capacity="5000"/>
</int:channel>
<int:service-activator id="msgfilewriter" ref="msgadapter" input-channel="msgFileSystemchannel" method="publish" >
<int:poller fixed-delay="100"/>
</int:service-activator>
有关如何调试此程序的任何指针?
答案 0 :(得分:0)
您使用了许多QueueChannel
,它们的所有轮询任务都基于默认的TaskSheduler
,而线程池仅为10
。因此,对于您来说,所有任务仅共享这10个线程确实是一个瓶颈。
您可能会考虑在两者之间不要使用太多的队列:我看不出要在流程中的所有步骤上排队的原因。
另一方面,您可以使用集成spring.integration.taskScheduler.poolSize
属性:https://docs.spring.io/spring-integration/docs/current/reference/html/whats-new.html#x51.-global-properties