0

我有一个作为后台进程执行服务调用的插件。也就是说,它在计时器上执行一些与任何用户操作没有直接关系的操作。

我需要做的是每次该服务调用完成时在“主”应用程序中执行一些代码。有没有办法挂钩该插件代码?我可以访问插件代码,因此更改它并不是一个巨大的障碍。

4

1 回答 1

2

您可以让您的插件服务在完成时发布一个事件,然后在您的主应用程序中监听该事件。我已经使用过这种模式几次,它是一种非常方便的方式来解耦我的应用程序的各个部分。为此,请创建一个事件类。

class PluginEvent extends ApplicationEvent {
   public PluginEvent(source) {
      super(source)
   }
}

然后,让您的插件服务实现ApplicationContextAware。这为您的插件提供了一种发布事件的方法

class PluginService implements ApplicationContextAware {
  def applicationContext

  def serviceMethod() {
     //do stuff
     publishPluginEvent()  
  }

  private void publishPluginEvent() {
    def event = new PluginEvent(this)
    applicationContext.publishEvent(event)
  }
}

然后在您的主应用程序中,创建一个侦听器服务,该服务将在事件发布时做出响应:

class ApplicationService implements ApplicationListener<PluginEvent> {
   void onApplicationEvent(PluginEvent event) {
     //whatever you want to do in your app when 
     // the plugin service fires.
   }
}

这个监听器不需要是 Grails 服务,你可以使用 POJO/POGO,但你需要将它配置为内部的 spring bean resources.groovy

我最近一直在使用这种方法,它对我来说效果很好。它绝对是您的 Grails 工具箱中的一个不错的工具。

于 2012-09-18T14:27:44.683 回答