2017-10-27 1 views
0

Ich lese Mails mit Feder Mail eingehenden Kanaladapter einmal Nachricht gelesen wird ich bin einige db Operationen in Dienst Aktivator der entsprechenden Kanal durchgeführt wird. Meine Anforderung ist, wenn ein DB-Vorgang fehlschlägt, sollte der Adapter die gleiche Nachricht erneut lesen.Re Herunterladen von Nachricht, wenn der Frühling Integration Eingangskanaladapter

Mail-Konfiguration:

@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 
    } 
} 

dachte ich, das funktionieren würde, aber es funktioniert nicht. Gibt es eine Möglichkeit, meine Anforderung zu erfüllen

public class Exp { 

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

Antwort

0

Sie benötigen IMAP dafür; Bei POP3 markiert der Server sie immer als gelesen.

Sie können die Ratgeberkette des Pollers um eine Sprungantwort-Interzeptor-Empfehlung erweitern und/oder die fehlgeschlagene Nachricht an einen Fehlerkanal senden.

Der Wiederholungsvorschlag kann für die Anzahl der Wiederholungen, Zurückschalt-Richtlinien usw. konfiguriert werden.

+0

danke. Ich habe meine Konfiguration in IMAP geändert, funktioniert aber immer noch nicht –

Verwandte Themen