Java 以异步方式实现Envers审核的可能性
我在我的项目中添加了enver,审计表正在更新实体创建/更新事务。太好了 现在,我希望以异步方式执行审计表更新事务。我试图实现的是——即使审核事务失败,主事务也不应该回滚Java 以异步方式实现Envers审核的可能性,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,我在我的项目中添加了enver,审计表正在更新实体创建/更新事务。太好了 现在,我希望以异步方式执行审计表更新事务。我试图实现的是——即使审核事务失败,主事务也不应该回滚 如果以前有人尝试过,请给出一些提示。开箱即用,这根本不可能。Envers钩住默认的Hibernate事件系统,该系统以同步方式触发所有侦听器 从逻辑上讲,标记待审计实体并将其状态作为变更的历史记录进行维护,而允许该实体进行变更,无论其变更的历史记录是否有效,这是没有意义的。这比其他任何东西更能说明总体设计或部署问题 我想说的是
如果以前有人尝试过,请给出一些提示。开箱即用,这根本不可能。Envers钩住默认的Hibernate事件系统,该系统以同步方式触发所有侦听器 从逻辑上讲,标记待审计实体并将其状态作为变更的历史记录进行维护,而允许该实体进行变更,无论其变更的历史记录是否有效,这是没有意义的。这比其他任何东西更能说明总体设计或部署问题
我想说的是如何集成Envers和Hibernate,如果您需要异步的、不可靠的审核,那么您可能需要编写自己的解决方案。您可以为版本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);
}
}
请提供一些导致任何问题的代码。所以这不是一个“编写我的代码”的平台。我没有遇到任何代码错误,如果有人曾经尝试过,我会寻求一些提示。我搜索了enverswiki,他们说它是同步的,审计发生在事务结束时。有了这段代码,你可以使它异步。在一个事务中,它只会保存在审计表中