我使用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。
答案 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) { }