2017-10-27 3 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으로 변경했지만 여전히 작동하지 않습니다. –