2016-01-10 6 views
1

Я добавил Envers в мой проект, а таблицы аудита обновляются при создании/обновлении транзакций. идеально!!Возможность выполнения аудита Envers в асинхронном режиме

Теперь я хочу, чтобы выполнение таблицы аудита обновляло транзакцию асинхронным образом. То, что я пытаюсь достичь, - хотя транзакция аудита не выполняется, основная транзакция не должна откатываться назад.

Если кто-то пробовал это раньше, пожалуйста, дайте несколько советов.

+0

Укажите код, который дает в любой проблеме. SO не является платформой «писать мой код». –

+0

Я не зацикливаюсь на какой-либо ошибке кода, я прошу какие-то намеки, если кто-то уже пытался это сделать. Я искал envers wiki, и они говорят, что это синхронно, и аудит происходит в конце транзакции. – Dinil

ответ

1

Из коробки это просто невозможно. Включает перехватывание в систему событий Hibernate по умолчанию, которая синхронно запускает всех слушателей.

Логически, нет смысла отмечать сущность, подлежащую аудиту, и ее состояние сохраняется как историческая запись об изменении, но при этом позволяет изменять сущность независимо от того, работает ли ее историческая запись изменений. Это больше связано с проблемой проектирования или развертывания, чем с чем-либо еще.

Я бы сказал, с интеграцией Envers и Hibernate, если вам нужен асинхронный, ненадежный аудит, то это, вероятно, случай, когда вам нужно написать собственное решение.

0

Вы можете предоставить аудиторию AuditEventListener для версии 3. После версии 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); 
    } 
} 
Смежные вопросы