Email 获取错误处理程序并编写文件后如何获取原始消息

Email 获取错误处理程序并编写文件后如何获取原始消息,email,spring-integration,dsl,Email,Spring Integration,Dsl,我一直在使用JavaDSL构建Spring集成服务电子邮件。 此服务必须有恢复策略才能重试发送电子邮件,但我没有成功。 一个简短的故事:应用程序收到一个有效负载和标题,并尝试发送到电子邮件服务器。它尝试了3次,如果失败,它将创建一个新文件,其中包含消息头和消息体 如果发送电子邮件失败,我如何获取原始消息(标题和负载)并将信息对放入json文件中? 谢谢 这是我的bean和服务: /** * ################# * MESSAGE ENDPOINTS * #########

我一直在使用JavaDSL构建Spring集成服务电子邮件。 此服务必须有恢复策略才能重试发送电子邮件,但我没有成功。 一个简短的故事:应用程序收到一个有效负载和标题,并尝试发送到电子邮件服务器。它尝试了3次,如果失败,它将创建一个新文件,其中包含消息头和消息体

如果发送电子邮件失败,我如何获取原始消息(标题和负载)并将信息对放入json文件中?

谢谢

这是我的bean和服务:

/**
 * ################# 
 * 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”}