【问题标题】:Spring Integration Email Redelivery on Exception异常时的 Spring Integration 电子邮件重新投递
【发布时间】:2017-01-14 08:27:51
【问题描述】:

我有一个网络服务,通过 GET Http 方法,用户请求一个人对象。这个人被发送到一个 JMS 队列,然后在 Spring Integration 的帮助下,我将它发送到一个虚假的电子邮件地址 (https://papercut.codeplex.com/)。我用 Spring Integration Java DSL 编写了代码。我想问一下:

  1. 是否有更灵活的方式发送电子邮件?

  2. 如果抛出异常,如何借助 Spring Integration 重新投递邮件? (例如 5 次,如果未发送,则处理异常并停止程序) 这是我的代码:

网络服务

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

Java 配置

    @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, "Papercut0@test.com"))
        .handle(Mail.outboundAdapter("127.0.0.1")
                   .credentials("test","test").port(25)
                   .javaMailProperties(p -> p.put("mail.debug", "true")), 
                    e -> e.id("sendMailEndpoint"))
        .get();
}
}

【问题讨论】:

    标签: email jms spring-integration


    【解决方案1】:

    是否有更灵活的方式发送电子邮件?

    抱歉,问题不清楚。你有足够的短代码来做到这一点。 Mail.outboundAdapter() 及其所有流畅的 API。什么应该更灵活?

    如果抛出异常,如何借助 Spring Integration 重新投递邮件?

    为此,Spring Integration 建议使用RequestHandlerRetryAdviceMail.outboundAdapter() 可以配置为:

    @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!
    

    请参阅它的 JavaDocs 和 Reference Manual

    【讨论】:

    • 谢谢!你的回答很清楚。 .advice(retryAdvice()) 尤其对我帮助很大。
    猜你喜欢
    • 2016-03-25
    • 2017-04-06
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多