【发布时间】:2014-02-12 22:13:44
【问题描述】:
我正在学习 Spring Integration 并使用它在 Grails 中实现一个基本的电子邮件服务。我想要做的是调用我的电子邮件服务,但只有在尝试发送电子邮件的交易成功时才会发送电子邮件。虽然这是在 Grails 中完成的,但它实际上应该与常规 Spring 应用程序没有什么不同,除了使用 BeanBuilder DSL 而不是 XML 配置。
无论如何,这是我对频道的配置:
beans = {
xmlns integration:'http://www.springframework.org/schema/integration'
integration.channel(id: 'email')
}
这是我的服务:
class MailService {
@ServiceActivator(inputChannel = "email")
MailMessage sendMail(Closure callable) {
//sending mail code
}
}
现在我期望发生的是,当我将此 MailService 注入另一个服务并调用发送邮件时,这将在电子邮件通道上放置一条消息,只有在我的事务完成时才会发布。让我相信这是关于 UserProcess 的部分:http://docs.spring.io/spring-integration/reference/html/transactions.html,它指出用户启动的进程将具有 Spring 提供的所有事务属性。
我正在尝试通过集成测试对此进行测试:
void "test transactionality"() {
when:
assert DomainObject.all.size() == 0
DomainObject.withNewTransaction { status ->
DomainObject object = buildAndSaveNewObject()
objectNotificationService.sendEmails(object) //This service injects emailService and calls sendMail
throw new Exception()
}
then:
thrown(Exception) // This is true
DomainObject.all.size() == 0 // This is true
greenMail.receivedMessages.length == 0 // This fails
}
这样做是在同一个事务中创建和保存一个对象并发送电子邮件。然后我抛出一个异常导致该事务失败。正如预期的那样,我的域对象都没有被持久化。但是,我仍然收到电子邮件。
总的来说,我对 Spring Integration 和 Spring 还是很陌生,所以我可能会误解这一切应该如何工作,但我希望 sendMail 消息永远不会放在电子邮件通道上。
【问题讨论】:
标签: spring grails transactions spring-integration