1
私はJavaを使用してSpring統合サービスメールを作成しています。DSL 電子メールの送信を再試行するには、このサービスに回復ポリシーが必要ですが、成功していません。 簡単な話:アプリケーションがペイロードとヘッダーを受信し、電子メールサーバーに送信しようとしました。 3回試行し、失敗した場合は、メッセージのヘッダーと本文で新しいファイルを作成します。errorHandlerを取得してファイルを書き込んだ後の元のメッセージの取得方法
電子メールの送信に失敗した場合、元のメッセージ(ヘッダーとペイロード)を取得してjsonファイルに情報ペアを挿入するにはどうすればよいですか?
ありがとうございました。
これが私の豆であり、サービス:
/**
* #################
* 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();
}
}
errorFlow()メソッドのペイロードには、MessageException: –
しかないので、 '.transform(" payload.failedMessage ")'を '.transform(Transformers.toJson())'の前に追加する必要があります。 –
ありがとう。作品! –