バックグラウンドプロセスとしてサービス呼び出しを実行するプラグインがあります。つまり、ユーザーのアクションに直接関係しないタイマーに対して何らかのアクションを実行します。
私がする必要があるのは、このサービス呼び出しが終了するたびに「メイン」アプリケーションでいくつかのコードを実行することです。そのプラグインコードにフックする方法はありますか?私はプラグインコードにアクセスできるので、それを変更することは大きな障害ではありません。
バックグラウンドプロセスとしてサービス呼び出しを実行するプラグインがあります。つまり、ユーザーのアクションに直接関係しないタイマーに対して何らかのアクションを実行します。
私がする必要があるのは、このサービス呼び出しが終了するたびに「メイン」アプリケーションでいくつかのコードを実行することです。そのプラグインコードにフックする方法はありますか?私はプラグインコードにアクセスできるので、それを変更することは大きな障害ではありません。
プラグインサービスが完了したときにイベントを公開し、メインアプリケーションでそのイベントをリッスンすることができます。私はこのパターンを数回使用しましたが、アプリケーションのさまざまな部分を切り離すのに非常に便利な方法でした。これを行うには、イベントクラスを作成します。
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を使用するだけで済みますが、内部でSpringBeanとして構成する必要がありますresources.groovy
。
私は最近このアプローチを使用していて、それは私にとってうまくいきました。Grailsツールボックスにあるのは間違いなく素晴らしいツールです。