是否有可能在处理消息后设置spring集成邮件入站适配器标志?

9gm1akwq  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(408)

简介:
我们目前正在使用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时,是否可以在相同的流中标记邮件,或者我是否需要第二个流来获取和标记相同的邮件?

v1l68za4

v1l68za41#

我认为事务同步是可能的:https://docs.spring.io/spring-integration/reference/html/mail.html#mail-tx同步
那么,你准备好了吗 transactional(TransactionManager transactionManager) 在那上面 Mail.imapIdleAdapterJpaTransactionManager 从imap空闲通道适配器启动事务并将其传播到 handleMimeMessage() 你在哪里做那些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) {

对上述事务的提交和回滚作出React。
这个 DefaultTransactionSynchronizationFactory 用一些 TransactionSynchronizationProcessor impl可以给你一个想要的行为,在那里你需要一个 Message 以及它的有效载荷 IntegrationResourceHolder 表演一些像 message.setFlag(Flag.SEEN, true);MimeMessage .
您可以考虑使用 ExpressionEvaluatingTransactionSynchronizationProcessor .
为了避免文件夹重新打开,您可以考虑使用 public ImapIdleChannelAdapterSpec autoCloseFolder(boolean autoCloseFolder) { 用一个 false 选项。您需要考虑以那种tx sync impl或其他方式关闭它。

相关问题