(静态)grails(2.5)服务上的java.util observer安全吗?

时间:2015-12-14 11:36:04

标签: grails observer-pattern

我们通过在爆炸插件(即核心应用程序之外)中实现侦听器来解耦某些事件。然后我们可以构建不同的实现。此外,听众的工作必须在任何交易之外,因为它可能需要很长时间(想想连接到互联网并等待很长时间,如果失败,它必须不回滚任何东西)。该应用程序是在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并返回。

我看到了两种可能的解决方案:

  1. 将观察者放在域对象上,这不是静态的。
  2. 挂钩到afterUpdate域事件(不知道我们想要在事务之外,但我们可以启动另一个线程并异步地完成工作)
  3. 有人知道在域对象上使用观察者(并在某些会话中调用setChanged和nofityObservers)是一个很好的解决方案吗?

0 个答案:

没有答案