2016-09-06 3 views
2

GET Http 메서드를 통해 사용자가 person 개체를 요청하는 웹 서비스가 있습니다. 이 사람은 JMS 대기열로 보내지고 나서 Spring Integration 덕분에 가짜 이메일 주소 (https://papercut.codeplex.com/)로 보냅니다. 스프링 통합 Java DSL로 코드를 작성했습니다.스프링 통합 전자 메일 재 배달 (예외시)

  1. 이메일 메시지를보다 유연하게 보낼 수있는 방법이 있습니까?

  2. 예외가 발생하면 Spring Integration을 사용하여 메일을 어떻게 재전송 할 수 있습니까?

     public Person findById(Integer id) { 
         Person person = jpaPersonRepository.findOne(id); 
         jmsTemplate.convertAndSend("testQueue", person); 
         return jpaPersonRepository.findOne(id); 
        } 
    

    자바 Confiuration

웹 서비스 : 여기 내 코드 (5 회 예와이 후 전송되지 않은 경우 예외가 처리됩니다 프로그램이 중지)

@Configuration @EnableIntegration @ComponentScan public class JavaConfig { private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616"; private static final String DEFAULT_QUEUE = "testQueue"; @Bean public ActiveMQConnectionFactory connectionFactory() { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL(DEFAULT_BROKER_URL); return connectionFactory; } @Bean public JmsTemplate jmsTemplate() { JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(this.connectionFactory()); template.setDefaultDestinationName(DEFAULT_QUEUE); return template; } @Bean public DefaultMessageListenerContainer defaultMessageListenerContainer() { DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer(); defaultMessageListenerContainer.setDestinationName(DEFAULT_QUEUE); defaultMessageListenerContainer.setConnectionFactory(this.connectionFactory()); return defaultMessageListenerContainer; } @Bean(name="inputChannel") public DirectChannel directChannel() { return new DirectChannel(); } @Bean public IntegrationFlow orders() { return IntegrationFlows .from(Jms.messageDrivenChannelAdapter(defaultMessageListenerContainer())) .transform(new ObjectToStringTransformer()) .enrichHeaders(p -> p.header(MailHeaders.TO, "[email protected]")) .handle(Mail.outboundAdapter("127.0.0.1") .credentials("test","test").port(25) .javaMailProperties(p -> p.put("mail.debug", "true")), e -> e.id("sendMailEndpoint")) .get(); } } 

답변

2

더 유연한 방법으로 이메일 메시지를 보낼 수 있습니까?

죄송합니다. 질문은 명확하지 않습니다. 그렇게하기에 충분한 짧은 코드가 있습니다. Mail.outboundAdapter() 및 모든 유창한 API. 더 유연해야하는 것은 무엇입니까?

예외가 발생하면 Spring Integration을 사용하여 메일을 어떻게 재전송 할 수 있습니까?

이러한 이유로 스프링 통합은 RequestHandlerRetryAdvice을 제안합니다.

@Bean 
public Advice retryAdvice() { 
    RequestHandlerRetryAdvice advice = new RequestHandlerRetryAdvice(); 
    RetryTemplate retryTemplate = new RetryTemplate(); 
    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(5); 
    retryTemplate.setRetryPolicy(retryPolicy); 
    advice.setRetryTemplate(retryTemplate); 
    advice.setRecoveryCallback(new ErrorMessageSendingRecoverer(emailErrorChannel())); 
    return advice; 
} 

... 

.handle(Mail.outboundAdapter("127.0.0.1") 
       .credentials("test","test").port(25) 
       .javaMailProperties(p -> p.put("mail.debug", "true")), 
       e -> e.id("sendMailEndpoint") 
         .advice(retryAdvice())) // HERE IS THE TRICK! 

의 JavaDoc을 참조하고이 문제에 Reference Manual : 그리고 Mail.outboundAdapter()는로 구성 할 수 있습니다.

+0

감사합니다. 당신의 대답은 분명했습니다. .advice (retryAdvice())는 특히 많은 도움이되었습니다. – user3590899

관련 문제