Email 获取错误处理程序并编写文件后如何获取原始消息
我一直在使用JavaDSL构建Spring集成服务电子邮件。 此服务必须有恢复策略才能重试发送电子邮件,但我没有成功。 一个简短的故事:应用程序收到一个有效负载和标题,并尝试发送到电子邮件服务器。它尝试了3次,如果失败,它将创建一个新文件,其中包含消息头和消息体 如果发送电子邮件失败,我如何获取原始消息(标题和负载)并将信息对放入json文件中? 谢谢 这是我的bean和服务:Email 获取错误处理程序并编写文件后如何获取原始消息,email,spring-integration,dsl,Email,Spring Integration,Dsl,我一直在使用JavaDSL构建Spring集成服务电子邮件。 此服务必须有恢复策略才能重试发送电子邮件,但我没有成功。 一个简短的故事:应用程序收到一个有效负载和标题,并尝试发送到电子邮件服务器。它尝试了3次,如果失败,它将创建一个新文件,其中包含消息头和消息体 如果发送电子邮件失败,我如何获取原始消息(标题和负载)并将信息对放入json文件中? 谢谢 这是我的bean和服务: /** * ################# * MESSAGE ENDPOINTS * #########
/**
* #################
* MESSAGE ENDPOINTS
* #################
*/
@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata poller() {
return Pollers
.fixedRate(NumberUtils.createLong(QUEUE_RATE))
.maxMessagesPerPoll(NumberUtils.createLong(QUEUE_CAPACITY))
.errorHandler(e -> LOG.error("Exception : " + e.getMessage()))
.get();
}
@Bean
public MessageChannel recoveryChannel() {
return MessageChannels.direct().get();
}
@MessagingGateway
public static interface MailService {
@Gateway(requestChannel = "mail.input")
void sendMail(String body, @Headers Map<String,String> headers);
}
@Bean
public RetryPolicy retryPolicy() {
final Map<Class<? extends Throwable>, Boolean> map =
new HashMap<Class<? extends Throwable>, Boolean>() {
{
put(MailSendException.class,true);
put(RuntimeException.class, true);
}
private static final long serialVersionUID = -1L;
};
final RetryPolicy ret = new SimpleRetryPolicy(3, map, true);
return ret;
}
@Bean
public RetryTemplate retryTemplate() {
final RetryTemplate ret = new RetryTemplate();
ret.setRetryPolicy(retryPolicy());
ret.setThrowLastExceptionOnExhausted(false);
return ret;
}
@Bean
public Advice retryAdvice() {
final RequestHandlerRetryAdvice advice = new RequestHandlerRetryAdvice();
advice.setRetryTemplate(retryTemplate());
RecoveryCallback<Object> recoveryCallBack = new ErrorMessageSendingRecoverer(recoveryChannel());
advice.setRecoveryCallback(recoveryCallBack);
return advice;
}
private MailSendingMessageHandlerSpec mailOutboundAdapter(){
MailSendingMessageHandlerSpec msmhs =
Mail.outboundAdapter(emailServerHost())
.port(serverPort())
.credentials(MAIL_USER_NAME, MAIL_PASSWORD)
.protocol(emailProtocol())
.javaMailProperties(p -> p
.put("mail.debug", "true")
.put("mail.smtp.ssl.enable",enableSSL())
.put("mail.smtp.connectiontimeout", 5000)
.put("mail.smtp.timeout", 5000));
return msmhs;
}
@Bean
public FileWritingMessageHandler fileOutboundAdapter(){
FileWritingMessageHandler fwmhs = Files
.outboundAdapter(new File("logs/errors/"))
.autoCreateDirectory(true)
.get();
return fwmhs;
}
/**
* ################
* FLOWS
* ################
*/
@Bean
public IntegrationFlow smtp(){
return IntegrationFlows.from("mail.input")
.channel(MessageChannels.queue())
.handle(this.mailOutboundAdapter(),
e -> e.id("smtpOut")
.advice(retryAdvice())
)
.get();
}
@Bean
public IntegrationFlow errorFlow(){
return IntegrationFlows.from(recoveryChannel())
.transform(Transformers.toJson())
.enrichHeaders(c -> c.header(FileHeaders.FILENAME, "emailErrors"))
.handle(this.fileOutboundAdapter())
.get();
}
}
/**
* #################
*消息端点
* #################
*/
@Bean(name=PollerMetadata.DEFAULT\u POLLER)
公共民意调查机构{
回程轮询器
.fixedRate(numberrutils.createLong(队列速率))
.maxMessagesPerPoll(numberrutils.createLong(队列容量))
.errorHandler(e->LOG.error(“异常:+e.getMessage()))
.get();
}
@豆子
public MessageChannel recoveryChannel(){
返回MessageChannels.direct().get();
}
@消息网关
公共静态接口邮件服务{
@网关(requestChannel=“mail.input”)
void sendMail(字符串体,@Headers映射头);
}
@豆子
公共RetryPolicy RetryPolicy(){
最终映射错误消息有一个有效负载MessaginException
。它有两个属性cause
和failedMessage
failed消息是处于故障点的消息,带有标题和负载。errorFlow()方法中的My payload只包含MessageException:Right,因此您需要在转换(Transformers.toJson())之前添加Transformer.transform(“payload.failedMessage”)
。非常感谢。非常有效!现在,我坚持将消息转换为Json,如下结构:{“Headers”:{[“abc”:“123”]},“Payload”:{“def”:“aaaaaaaaaaa”}