简介:
我们目前正在使用spring邮件集成来接收和发送电子邮件,如果没有异常情况(例如到exchange服务器或数据库的连接错误),那么这些电子邮件就可以正常工作。
这些邮件作为消息传入,并传递给处理程序方法,该方法将mimessage解析为自定义邮件数据对象。jpa将这些实体保存为数据库的最后一步。
问题:
如果数据库关闭或邮件由于任何其他原因无法处理,则会出现问题,因为一旦消息传递给处理程序,integrationflow仍会将其标记为/seen。
将这个标志设置为false并不能解决我们的问题,因为如果邮件处理和保存正确,我们希望spring设置/seen标志
shouldMarkMessagesAsRead(false)
正在搜索:
在成功地将邮件保存到数据库之后,是否有可能设置标志?
我们想处理失败的电子邮件后,再次负责的错误的原因是修复,这将不起作用,因为只要Spring标记为/看到他们无论结果。
参考文献:
消息进入并传递给处理程序,处理程序将解析邮件并执行crud repository save(maildao)方法。handleTimeMessage()或多或少只是一个Map器。
@Bean
fun imapIdleFlow(imapProperties: ImapProperties): IntegrationFlow {
imapProperties.username.let { URLEncoder.encode(it, charset) }
return IntegrationFlows
.from(
Mail.imapIdleAdapter(
ImapMailReceiver("imap://${imapProperties.username}:${imapProperties.password}@${imapProperties.host}/Inbox")
.apply {
setSimpleContent(true)
setJavaMailProperties(imapProperties.properties.toProperties())
})
.autoStartup(true)
.shouldReconnectAutomatically(true)
)
.handle(this::handleMimeMessage)
.get()
}
在您需要第二次访问exchange时,是否可以在相同的流中标记邮件,或者我是否需要第二个流来获取和标记相同的邮件?
1条答案
按热度按时间v1l68za41#
我认为事务同步是可能的:https://docs.spring.io/spring-integration/reference/html/mail.html#mail-tx同步
那么,你准备好了吗
transactional(TransactionManager transactionManager)
在那上面Mail.imapIdleAdapter
到JpaTransactionManager
从imap空闲通道适配器启动事务并将其传播到handleMimeMessage()
你在哪里做那些jpa保存。此外,您还可以添加:
对上述事务的提交和回滚作出React。
这个
DefaultTransactionSynchronizationFactory
用一些TransactionSynchronizationProcessor
impl可以给你一个想要的行为,在那里你需要一个Message
以及它的有效载荷IntegrationResourceHolder
表演一些像message.setFlag(Flag.SEEN, true);
上MimeMessage
.您可以考虑使用
ExpressionEvaluatingTransactionSynchronizationProcessor
.为了避免文件夹重新打开,您可以考虑使用
public ImapIdleChannelAdapterSpec autoCloseFolder(boolean autoCloseFolder) {
用一个false
选项。您需要考虑以那种tx sync impl或其他方式关闭它。