在处理消息后是否可以设置spring集成邮件入站适配器标志?
简介:在处理消息后是否可以设置spring集成邮件入站适配器标志?,spring,email,kotlin,spring-integration,spring-integration-dsl,Spring,Email,Kotlin,Spring Integration,Spring Integration Dsl,简介: 我们目前正在使用SpringMail集成来接收和发送电子邮件,如果没有异常情况(如到exchange服务器或数据库的连接错误),则该集成可以正常工作 这些邮件以消息的形式传入,并传递给处理程序方法,该处理程序方法将mimessage解析为自定义邮件数据对象。JPA将这些实体保存为数据库的最后一步 问题: 如果数据库关闭或邮件由于任何其他原因无法处理,则会出现问题,因为一旦消息传递给处理程序,IntegrationFlow仍会将其标记为“已看到” 将此标志设置为false不会解决问题,因为
我们目前正在使用SpringMail集成来接收和发送电子邮件,如果没有异常情况(如到exchange服务器或数据库的连接错误),则该集成可以正常工作 这些邮件以消息的形式传入,并传递给处理程序方法,该处理程序方法将mimessage解析为自定义邮件数据对象。JPA将这些实体保存为数据库的最后一步 问题:
如果数据库关闭或邮件由于任何其他原因无法处理,则会出现问题,因为一旦消息传递给处理程序,IntegrationFlow仍会将其标记为“已看到” 将此标志设置为false不会解决问题,因为如果邮件处理和保存正确,我们希望Spring设置/SEEN标志
shouldMarkMessagesAsRead(false)
搜索:成功将邮件保存到数据库后是否可以设置标志?
我们希望在修复导致错误的原因后再次处理失败的电子邮件,只要Spring将其标记为“已看到”,无论结果如何,这都不会起作用 参考:
消息进入并传递给处理程序,处理程序将解析邮件并执行CRUD存储库保存(mailDAO)方法。HandleTimeMessage()或多或少只是一个映射器
@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时,是否可以在同一个流中标记邮件,或者我需要第二个流来获取和标记同一邮件?我认为可以使用事务同步之类的方法: 因此,您可以将
transactional(TransactionManager TransactionManager)
上的Mail.imapIdleAdapter
设置为JpaTransactionManager
以从这个IMAP空闲通道适配器启动事务,并将其传播到您的HandleTimeMessage()
中,您可以在那里进行JPA保存
此外,您还可以添加:
/**
* Configure a {@link TransactionSynchronizationFactory}. Usually used to synchronize
* message deletion with some external transaction manager.
* @param transactionSynchronizationFactory the transactionSynchronizationFactory.
* @return the spec.
*/
public ImapIdleChannelAdapterSpec transactionSynchronizationFactory(
TransactionSynchronizationFactory transactionSynchronizationFactory) {
对所述事务的提交和回滚作出反应
DefaultTransactionSynchronizationFactory
和一些TransactionSynchronizationProcessor
impl可以为您提供所需的行为,您可以从提供的IntegrationResourceHolder
中获取消息及其有效负载,并执行类似于消息.setFlag(Flag.SEEN,true)的操作在MimeMessage
上选择code>
您可以考虑使用DOCs中提到的AN代码> ExpRealStudio来评估事务同步处理器< /C> > /P>
< >为了避免文件夹重新打开,您可以考虑使用<代码>公共ImapIdleChannelAdapterSpec autoCloseFolder(BooOutAutoCeleFoad){<代码> > < <代码> false >代码>选项。您需要考虑以TX同步IMPL或其他方式关闭它。