将实体保存在Grails自定义事件侦听器中



我正在编写Grails 2.3.7应用程序,其中有两个域实体:CommentEvent。保存在数据库中的每个新的Comment都应该生成并持久化相应的Event。为此,我尝试在AbstractPersistenceEventListener:中拦截PostInsertEvent

class MyPersistenceEventListener extends AbstractPersistenceEventListener {
    public MyPersistenceEventListener(Datastore ds) {
        super(ds)
    }
    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        Event.withTransaction {
            new Event(text: "New comment posted").save()
        }
    }
    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType.isAssignableFrom(PostInsertEvent)
    }
}

这种方法不起作用:调用了onPersistenceEvent,但新的事件记录不会出现在数据库中。是否可以在perstence事件侦听器中保存另一个实体,或者是否有更好的方法来做到这一点?

最后,我设法将它保存在不同的线程中:

class MyPersistenceEventListener extends AbstractPersistenceEventListener {
    final def eventQueue = new DataflowQueue()
    public MyPersistenceEventListener(Datastore ds) {
        super(ds)
        Dataflow.operator(inputs: [eventQueue], maxForks: 10) { event ->
            Event.withTransaction {
                event.save()
            }
        }
    }
    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        if (event.entityObject instanceof Comment) {
            eventQueue << new Event(text: "New comment posted")
        }
    }
    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType.isAssignableFrom(PostInsertEvent)
    }
}

但我仍然怀疑这是否是正确的解决方案。。。

最新更新