给 Controller、Service、Endpoint 等类补充异步事件的 API
常见使用方法:
// 监听事件
on("xxxx") { Map data -> ... }
// 触发事件
notify("xxxx", data)
// 监听 gorm 事件
// 其中事件 afterInsertCommit、afterUpdateCommit、afterDeleteCommit 的闭包参数都是 Map 对象;
// 而 preInsert 等事件的参数为 AbstractPersistenceEvent 对象,详请参阅 Grails 官方手册。
on("gorm:afterInsertCommit", { Map event ->
if (event.entity instace of Xxxxxx)
...
})
on("gorm:afterInsertCommit:" + Xxxxx.canonicalName, { Map event ->
...
})
// 触发 gorm 事件
new Xxxxxx(...).save(flush: true)
// 监听事件并返回处理结果
on("xxxx") { data -> log.info(data); return 1111 }
// 触发事件,并接收第一个监听器返回的处理结果
sendAndReceive("xxxx", data, {result -> assert result == 1111 )})
// 监听事件并返回处理结果
receiveAll("xxxx") { data -> return 1111 }
receiveAll("xxxx") { data -> return 2222 }
// 触发事件,并接收所有监听器返回的处理结果列表
sendAndReceiveAll("xxxx", data, {result -> assert result == [1111, 2222]})
// 清理监听器
clearEventConsumers("xxxx")
更多详情参见 grails.events.Events 及官方文档。
| Type | Name and description |
|---|---|
void |
receiveAll(CharSequence key, Closure callback)监听通过 sendAndReceiveAll 发布的事件,并在闭包中返回值,供发布者使用 |
reactor.bus.Bus |
sendAndReceiveAll(CharSequence key, Object data, Closure callback)发布事件,并获得所有监听器的返回结果 |
监听通过 sendAndReceiveAll 发布的事件,并在闭包中返回值,供发布者使用
发布事件,并获得所有监听器的返回结果
本事件也可以被 on 监听到,此时 callback 会接收到单条返回值。
因此,应该用 receiveAll 来监听事件,闭包 callback 可以接收到所有监听器的返回值列表。
如果没有监听器,那么也不会执行回调闭包 callback。