挂钩插件服务电话

时间:2012-09-18 13:55:20

标签: grails

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

我需要做的是在" main"中执行一些代码。每次此服务呼叫结束时应用程序。有没有办法挂钩该插件代码?我可以访问插件代码,因此改变它并不是一个巨大的障碍。

1 个答案:

答案 0 :(得分:2)

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

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,但您需要将其配置为resources.groovy内的spring bean。

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