2016-12-16 6 views
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(); 
} 

} 

答えて

1

エラーメッセージは、ペイロードMessagingExceptionを持っています。それは2つのプロパティcausefailedMessageを持っています。

失敗したメッセージは、障害発生時のメッセージで、ヘッダーとペイロードです。

+0

errorFlow()メソッドのペイロードには、MessageException: –

+1

しかないので、 '.transform(" payload.failedMessage ")'を '.transform(Transformers.toJson())'の前に追加する必要があります。 –

+0

ありがとう。作品! –

関連する問題