以异步方式实现Envers审计的可能性

时间:2016-01-10 15:43:44

标签: java hibernate hibernate-envers

我将Envers添加到我的项目中,审计表正在更新实体创建/更新事务。完美!!

现在我希望以异步方式执行审计表更新事务。我想要实现的是 - 即使审计事务失败,也不应回滚主事务。

如果有人试过这个,请提供一些提示。

2 个答案:

答案 0 :(得分:1)

开箱即用,根本不可能。 Envers挂钩到默认的Hibernate事件系统,以同步方式触发所有侦听器。

从逻辑上讲,标记要审计的实体并将其状态保持为历史变更记录并允许实体进行更改(无论其是否具有历史记录)是没有意义的。改变是否有效。这比整体设计或部署问题更能说明问题。

我想说如何集成Envers和Hibernate,如果你需要异步,不可靠的审计,那么你可能需要编写自己的解决方案。

答案 1 :(得分:0)

您可以为版本3提供AuditEventListener。在v4之后,每个事件类型都有不同的类,因此您必须为每个事件类型设置一个类(org.hibernate.envers.event.EnversPostInsertEventListenerImpl等),但除此之外没什么不同。

以下是版本3的代码如何:

public class MyEventListener extends org.hibernate.envers.event.AuditEventListener {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    @Override
    public void onPostInsert(PostInsertEvent event) {
        super.onPostInsert(event);
    }

    @Override
    public void onPostUpdate(final PostUpdateEvent event) {
        Runnable runIt = new Runnable() {
            public void run() {
                System.out.println("Running in a thread now");
                MyEventListener.super.onPostUpdate(event);
                System.out.println("Finished OnPostUpdate THREAD!!!!");
            }
        };
        executorService.submit(runIt);
        System.out.println("Finished OnPostUpdate call");
    }

    @Override
    public void onPostDelete(PostDeleteEvent event) {
        super.onPostDelete(event);
    }

    @Override
    public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
        super.onPreUpdateCollection(event);
    }

    @Override
    public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
        super.onPreRemoveCollection(event);
    }

    @Override
    public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
        super.onPostRecreateCollection(event);
    }
}