首页 > 解决方案 > 用于处理/发送电子邮件的 Spring Integration 流程需要数小时才能处理某些消息

问题描述

我有 spring 集成应用程序,它使用 Freemarker 转换消息并将消息发送到 SMTP 服务器。它在生产中运行了将近一年。过程本身并不庞大,message-driven-channel-adapter 读取消息,freemarker 转换消息,EmailAdapter 发送电子邮件。

从 MQ 收到消息后,发送电子邮件过去需要大约 100 毫秒。然而,在过去的几周里,10% 的消息在从 MQ 读取消息到到达 EmailAdapter 之间花费了超过 12 个小时,其他 90%(类似)的消息仍在大约 100 毫秒内得到处理。

<!-- Email -->
<!-- Split message into separate email messages for delivery -->
<splitter id="EmailSplitter"
    input-channel="EmailDeliveryChannel"
    output-channel="EmailDeliveryProcessChannel" method="split">
    <beans:bean
        class="com.ne.splitter.EmailSplitter">
        <beans:property name="mailSender"
            ref="MailSender" />
    </beans:bean>
</splitter>

<!-- Added task executor to handler messages in dedicated threads. Otherwise one failed email delivery will fail all split messages. -->
<channel id="EmailDeliveryProcessChannel">
    <dispatcher
        task-executor="SplitDeliveryExecutor" />
</channel>

<task:executor id="RequestTaskExecutor"
    pool-size="2-100"
    queue-capacity="500"
    keep-alive="1" />

<task:executor
    id="SplitDeliveryExecutor"
    pool-size="3-200"
    queue-capacity="1000" />

<service-activator
    input-channel="EmailDeliveryProcessChannel"
    output-channel="EmailDeliveryStatusChannel" method="send">

    <beans:bean
        class="com.ne.adapters.EmailAdapter">
        <beans:property name="mailSender"
            ref="MailSender" />
        <beans:property name="retryAttempts" value="3" />
    </beans:bean>
</service-activator>

为什么有些消息在进程中卡住了10多个小时并且没有超时?

标签: smtpspring-integrationjakarta-mail

解决方案


org.springframework.integration很高兴为类别打开调试并分析日志以了解消息被卡住的步骤。WireTap您可以通过某处为他们收集消息历史记录并发出警报。请参阅有关它们的文档:https ://docs.spring.io/spring-integration/docs/5.0.8.RELEASE/reference/html/system-management-chapter.html#message-history 。

尽管如此,对我来说,发送电子邮件的真正问题似乎是与服务器的连接,因此您的应用程序没有任何问题。它只是提供者允许您与之交互的吞吐量。

您可以考虑QueueChannel在电子邮件之前放置一个适配器来缓冲消息以供将来处理,这不会影响整个流程并且不会阻塞 JMS 消费者线程。


推荐阅读