春季集成中,消息处理在短时间内随机停顿/暂停

时间:2019-01-28 16:07:40

标签: spring spring-integration

我有一个使用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>

有关如何调试此程序的任何指针?

1 个答案:

答案 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

将该池的大小增加到所需的数目。