使用 spring 集成入站通道适配器时重新下载消息
Re downloading of message when using spring integration inbound channel adapter
我正在使用 spring 邮件入站通道适配器阅读邮件,一旦邮件被读取,我就会在相应通道的服务激活器中执行一些数据库操作。我的要求是,如果任何数据库操作失败,适配器应再次读取相同的消息。
邮件配置:
@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);
}
}
为此您需要 IMAP;使用 POP3,服务器总是将它们标记为已读。
您可以将 spring-重试拦截器建议添加到轮询器的建议链中and/or将失败的消息发送到错误通道。
可以为重试次数、退避策略等配置重试建议
我正在使用 spring 邮件入站通道适配器阅读邮件,一旦邮件被读取,我就会在相应通道的服务激活器中执行一些数据库操作。我的要求是,如果任何数据库操作失败,适配器应再次读取相同的消息。
邮件配置:
@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);
}
}
为此您需要 IMAP;使用 POP3,服务器总是将它们标记为已读。
您可以将 spring-重试拦截器建议添加到轮询器的建议链中and/or将失败的消息发送到错误通道。
可以为重试次数、退避策略等配置重试建议