Spring XD 自定义作业执行事件

Spring XD custom job execution event

我可以为我的 spring xd 作业接收预定义的作业执行事件,如下所示:

xd>job create --name myHttpJob --definition "httpJob" --deploy
xd>stream create --name jobExecutionEvents --definition "tap:job:myHttpJob.job >log" --deploy

参考:http://docs.spring.io/spring-xd/docs/1.0.3.RELEASE/reference/html/#_retrieve_job_notifications

但是,我想触发我自己的自定义事件并能够用它做一些事情。因此,也许创建一个我自己的自定义 jobExecution 事件并发布它,或者创建一个全新的自定义事件和新的侦听器。我无法找到执行此操作的最佳方法,我的问题是在 Spring XD 中执行此操作的最佳方法是什么?

为自定义事件创建新的 tap 并不容易(您需要一个插件将其绑定到总线)。

但是,您可以轻松地将侦听器添加到作业配置并将事件发布到聚合事件通道 bean。

https://github.com/spring-projects/spring-xd/blob/master/spring-xd-dirt/src/main/resources/META-INF/spring-xd/plugins/job/job-module-beans.xml

只有您的活动(以及您启用的任何其他活动)才会进入聚合活动频道。

如果您想探索添加自己的抽头,请参阅https://github.com/spring-projects/spring-xd/blob/master/spring-xd-dirt/src/main/java/org/springframework/xd/dirt/plugins/job/JobEventsListenerPlugin.java了解标准通道如何绑定到总线。

当然,您始终可以让您的侦听器通过您内部的 <int-amqp:outbound-channel-adapter/> 在 XD 基础架构之外发布到 rabbit 作业配置(但不要为此使用基于总线的队列)。

编辑 以回应您在下方的评论。

我刚刚用 Spring XD 1.1 试了一下。0.RELEASE 没问题。

我添加了这个

<int:inbound-channel-adapter expression="'foo'" channel="xd.job.aggregatedEvents">
    <int:poller fixed-delay="5000"/>
</int:inbound-channel-adapter>

timestampfile 文件作业(也添加了 int 命名空间)。

这会将文字 foo 发送到聚合事件通道。

然后我做了这个...

xd:>job create --name jobxxx --definition timestampfile
Successfully created job 'jobxxx'
xd:>job deploy jobxxx
Deployed job 'jobxxx'
xd:>stream create foo --definition "tap:job:jobxxx > log" --deploy
Created and deployed new stream 'foo'

...并在控制台上看到了这个...

18:29:13,392  INFO xdbus.tap:job:jobxxx.a1de5739-4399-4186-94de-33c5290a8411-1 sink.foo - foo
18:29:18,388  INFO xdbus.tap:job:jobxxx.a1de5739-4399-4186-94de-33c5290a8411-1 sink.foo - foo
18:29:23,390  INFO xdbus.tap:job:jobxxx.a1de5739-4399-4186-94de-33c5290a8411-1 sink.foo - foo
18:29:28,390  INFO xdbus.tap:job:jobxxx.a1de5739-4399-4186-94de-33c5290a8411-1 sink.foo - foo