2017-10-27 4 views
0

メッセージが読み込まれると、私はスプリングメールインバウンドチャネルアダプタを使用してメールを読んでいます。対応するチャネルのサービスアクティビティでいくつかのdb操作を実行しています。私の要件は、DB操作が失敗した場合、アダプターは同じメッセージを再度読み取る必要があるということです。バネ統合インバウンドチャネルアダプタを使用しているときにメッセージを再ダウンロードする

メールの設定:

@Bean 
public DirectChannel inputChannel() { 
    return new DirectChannel(); 
} 

@Bean 
public IntegrationFlow pop3MailFlow() { 



    String url = "[url]"; 
    return IntegrationFlows 
      .from(Mail.pop3InboundAdapter(url) 
        .javaMailProperties(p -> p.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory")),e -> e.autoStartup(true) 
        .poller(Pollers.fixedDelay(2000).transactionSynchronizationFactory(transactionSynchronizationFactory()))) 
      .channel(inputChannel()) 
      .handle(inboundEmailProcessor(),"messageProcess") 
      .get(); 
} 

@Bean 
public InboundEmailProcessor inboundEmailProcessor() { 
    return new InboundEmailProcessor(); 
} 

@Bean 
public TransactionSynchronizationFactory transactionSynchronizationFactory() { 
    TransactionSynchronizationFactory synchronizationFactory = new DefaultTransactionSynchronizationFactory(expressionEvaluatingTransactionSynchronizationProcessor()); 
    return synchronizationFactory; 
} 

@Bean 
public ExpressionEvaluatingTransactionSynchronizationProcessor expressionEvaluatingTransactionSynchronizationProcessor() { 
    ExpressionEvaluatingTransactionSynchronizationProcessor processor = new ExpressionEvaluatingTransactionSynchronizationProcessor(); 
    ExpressionParser parser = new SpelExpressionParser(); 
    processor.setAfterRollbackExpression(parser.parseExpression("new com.muraai.ex.config.Exp().process(payload)")); 
    return processor; 

} 

public class InboundEmailProcessor { 


    @Autowired 
    AttachmentsRepository attachmentsRepository; 

    @Transactional(rollbackFor = Exception.class) 
    public void messageProcess() { 
     // some db operations 
     // if it fails the same message should be read again 
    } 
} 

私はこれが仕事だろうと思ったが、その作業はありません。私の要求を達成する方法はありますか?

public class Exp { 

    public void process(MimeMessage message) throws MessagingException { 
     message.setFlag(Flags.Flag.SEEN, false); 
    } 
} 

答えて

0

IMAPが必要です。 POP3では、サーバーは常にそれらを読み取るようにマークします。

ポーラのアドバイスチェーンにスプリングリトライインターセプタのアドバイスを追加したり、エラーメッセージに失敗したメッセージを送信することができます。

リトライアドバイスは、リトライ回数、バックオフポリシーなどに設定できます。

+0

ありがとうございました。 IMAPに設定を変更したが、まだ動作していない –

関連する問題