如何处理SendFailedException?

时间:2016-01-28 17:54:09

标签: java javamail spring-batch

我使用spring批量发送批量电子邮件。 我正在使用ItemReader获取列表,其中包含需要发送电子邮件的详细信息,并使用ItemProcessor进行准备并使用ItemWriter发送。 它工作正常,但问题是我必须确定哪个电子邮件ID邮件发送失败。

简而言之,我想做这样的事情:

        try { 
            mailSender.send(items.toArray(new MimeMessagePreparator[items.size()])); 
        } catch (final SendFailedException e) { 
            logProblem(e); 

            final Address[] invalidAddresses = e.getInvalidAddresses(); 
            setFailedAddresses(invalidAddresses); 
            final Address[] validSentAddresses = e.getValidSentAddresses(); 
            setConfirmedAddresses(validSentAddresses); 
            final Address[] validUnsentAddresses = e.getValidUnsentAddresses(); 
            resend(validUnsentAddresses); 
        }     

但发送方法定义是这样的

JavaMailSender.send(MimeMessagePreparator [] arg0)抛出MailException

所以它显示了无法访问的catch块

这是我的ItemProcessor实现:

@Override
    public MimeMessagePreparator process(final UserEmailDtlBO userEmailDtlBO) throws Exception {

       MimeMessagePreparator preparator = new MimeMessagePreparator() {
           public void prepare(MimeMessage mimeMessage) throws Exception {
             MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true);
             message.setTo(userEmailDtlBO.getEmail());
             message.setFrom(mailbundle.getString("mailFrom"));
             Map<String, Object> model = new HashMap<String, Object>();
             model.put("user", userEmailDtlBO);
            // message.addInline("logoImg", new ClassPathResource("/conf/logo_green.png"));
             String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/conf/demo_email.vm", "utf-8", model);
             message.setSubject("demo email template");
             message.setText(text, true);
             URL resource = this.getClass().getResource("/conf/logo_green.png");
             String fileStr = resource.getFile();
             File emailLogo = new File(fileStr);
             message.addInline("logoImg", emailLogo);
           }};
    return preparator;
    }

这是我的ItemWriter实现:

@Override
    public void write(List<? extends MimeMessagePreparator> items) throws MailException{
        mailSender.send(items.toArray(new MimeMessagePreparator[items.size()]));
    } 

请帮我处理SendFailedException。

1 个答案:

答案 0 :(得分:0)

javax.mail.SendFailedException

是一个经过检查的例外,所以

org.springframework.mail.javamail.JavaMailSender.send(MimeMessagePreparator... mimeMessagePreparators)

永远不会抛出已检查的异常,只会抛出javadoc API中定义的运行时异常。

如果抛出的异常属于

类型,您可以检查
org.springframework.mail.MailSendException

,然后调用

ex.getFailedMessages()

关于那些例外。至少org.springframework.mail.javamail.JavaMailSenderImpl正在填写特定条件下的失败消息(有关详细信息,请查看源代码)。 如果没有,编写自己的impl类捕获SendFailedException,提取所需的值并将其包装在您自己的MySendFailedException中。

对于Spring Batch中的处理,您可以定义

org.springframework.batch.core.ItemWriteListener

并在

中处理异常
public void onWriteError(Exception ex, List<? extends O> item) {    }