我们通过在爆炸插件(即核心应用程序之外)中实现侦听器来解耦某些事件。然后我们可以构建不同的实现。此外,听众的工作必须在任何交易之外,因为它可能需要很长时间(想想连接到互联网并等待很长时间,如果失败,它必须不回滚任何东西)。该应用程序是在tomcat上运行的webapp和api。
问题是setChanged()。
这是一项服务:
class someService extends Observable {
}
这是一个插件引导程序:
SomeService someService
:
someService.addObserver(listenerService)
以下是听众:
class ListenerService implements Observer {
@NotTransactional
void update(Observable o, Object arg) {
DomainObject domainObject (DomainObject) arg
// do somethign which takes a very log time
}
这里它被称为某处(例如在某个服务的方法或其他地方)
someService.setChanged()
someService.notifyObservers(someEvent)
我在这里看到一个大问题 - 如果setChanged被调用我的多个请求,每个将设置changed = true,但第一个notifyObserver会将其设置为false,所以当第二个notifyObserer执行时,它会看到更改== false并返回。
我看到了两种可能的解决方案:
有人知道在域对象上使用观察者(并在某些会话中调用setChanged和nofityObservers)是一个很好的解决方案吗?