根据相应的输入通道适当地存储通知

时间:2011-10-23 15:51:32

标签: java spring email aop separation-of-concerns

我有以下问题。在我的应用程序中,每个用户都可以通过Web客户端以及通过电子邮件执行操作。每个操作(控制器类中的方法)必须隐式地将通知存储在外部键值存储中(我正在使用Redis)此外,如果操作是通过电子邮件执行的,则必须通知执行程序有关状态通过电子邮件的行动(成功/失败)。我遇到的主要问题是如何在最大程度地分离关注点的情况下设计整个结构。例如,我不希望控制器方法本身对存储通知/发送响应电子邮件做任何事情。

最初我想使用AOP,只是用@Action(“actionType”)装饰我的方法,不幸的是我还需要知道发件人是谁。据我所知,我不能在运行时为注释属性赋值,所以我不得不考虑另一种方式。

第二种方法是使用“Around”拦截器,停止方法的执行,抓取当前用户(来自会话范围的userService),但同样,这只适用于Web控制器,因为邮件处理类是无状态的,并且不知道诸如currentUser之类的概念(我每次收到新邮件时,我可以通过电子邮件参数来获取发件人的唯一方法)

我想,最简单的方法是从需要通知的每个方法(在Web请求控制器和邮件处理器中)显式调用通知服务,但同样,这将导致方法知道有点太多了。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我坚持使用AOP方法,但是我会让方面共享一个ThreadLocal来保存用户信息,并由一个在收到电子邮件时捕获电子邮件的Aspect初始化。这样你就可以实现整个逻辑而不改变您的应用程序代码。

顺便说一下,好的问题。