【问题标题】:Possibility of achieving Envers audit in asynchronous manner以异步方式实现 Envers 审计的可能性
【发布时间】:2016-01-10 15:43:43
【问题描述】:

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

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

如果有人之前尝试过,请提供一些提示。

【问题讨论】:

  • 请提供一些可以解决任何问题的代码。 SO 不是“编写我的代码”平台。
  • 我没有遇到任何代码错误,如果有人以前尝试过,我要求提供一些提示。我搜索了 envers wiki,他们说它是同步的,审计发生在事务结束时。

标签: java hibernate hibernate-envers


【解决方案1】:

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

从逻辑上讲,标记要审计的实体并将其状态作为变更的历史记录进行维护是没有意义的,而无论其历史变更记录是否有效,都允许对该实体进行更改。这比其他任何事情都更能说明设计或部署问题。

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

【讨论】:

    【解决方案2】:

    您可以为版本 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);
        }
    }
    

    【讨论】:

    • 使用此代码如何使其异步。就像在一个事务中一样,它只会保存在审计表中
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2012-08-10
    • 2023-03-24
    相关资源
    最近更新 更多