在处理消息后是否可以设置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或其他方式关闭它。