smtp - 用于处理/发送电子邮件的 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多个小时并且没有超时?
解决方案
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 消费者线程。
推荐阅读
- ruby - Ruby OptionParser 未正确解析 -- 命令正确
- java - Java中的“?:”运算符是什么?例如 sum += digit > 9 ?数字 - 9:数字;
- git - 带有 LFS 的 VSTS - 如何判断它是否真的有效
- java - 如何一次性在所有活动中添加风景(旋转)?
- vue.js - 在 vueJS 中,我想获得复选框的实际值,但我只是得到 true 或 undefined
- datetime - 计算 24 小时后的日期 Hive
- tensorflow - 分类列和密集列有什么区别?
- c# - 'crystaldecisions.shared.sharedutils' 的类型初始化程序引发了异常。在c#中
- python - 无法在 Python 中向 MQTT 主题发布消息
- android - 启用 Proguard 时 Mapbox 的 LocationLayerPlugin 不更新位置