Advertisement
Guest User

Untitled

a guest
Feb 9th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 4.11 KB | None | 0 0
  1. import com.google.common.annotations.Beta;
  2.  
  3. import java.util.concurrent.TimeUnit;
  4.  
  5.  
  6. /**
  7.  * Created by sergey.kobets on 13.11.2015.
  8.  * Класс делегатор / семафор, с синхронизацией через базу данных.
  9.  * Гарантирует, что в один момент времени в системе может исполнятся только 1 произвольный вызов,
  10.  * по идентификатору единицы работы.
  11.  * <p/>
  12.  * Объект реализует 2-х уровневый семафор, память + бд -> не совершает лишние операции по базе,
  13.  * если не удается захватить блокировку сначала в памяти.
  14.  * <p/>
  15.  * Блокирующие методы с ожиданием захвата блокировки останавливаются так же по thread.interrupt()
  16.  * <p/>
  17.  * Реализует DestructorHook ->
  18.  * в случае корректного завершения работы ноды или сервера, выполняемые объекты WorkUnitExclusiveAccessor
  19.  * приостановят попытки захвата блокировки и попытаются корректно завершить бизнес логику
  20.  * которая выполнялась в момент инициализации остановки по ранее захваченным блокировкам.
  21.  */
  22. public interface WorkUnitExclusiveAccessor<I, O> {
  23.     /**
  24.      * Произвести в блокирующем режиме попытку захвата блокировки на WorkUnitUID, в течении времени
  25.      * unit.toNanos(time), после чего незамедлительно выполнить бизнес логику передав на вход input
  26.      * и не зависимо от успеха выполнения снять блокировку по завешению вызова метода.
  27.      *
  28.      * @throws LockedException - в случае если в момент ожидания захвата блокировки, ожидающий поток будет
  29.      *                         прерван из вне и в случае если за время unit.toNanos(time) блокировку захватить не удалось
  30.      */
  31.  
  32.     O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, long time, TimeUnit unit, I input)
  33.             throws LockedException;
  34.  
  35.     /***
  36.      * Ожидание по умолчанию 30 секунд, эквивалент:
  37.      * O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, 30L, TimeUnit.SECOND, I input)
  38.      */
  39.     O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, I input) throws LockedException;
  40.  
  41.     /***
  42.      * Реализация шаблона "Пессимистичная блокировка"
  43.      * <p/>
  44.      * Произвести попытку захвата блокировки на WorkUnitUID, в случае успеха незамедлительно
  45.      * выполнить бизнес логику, передав на вход бизнес метода в замыкании input и не зависимо
  46.      * от успеха выполнения, снять блокировку по его завешению
  47.      *
  48.      * @throws LockedException - в случае если брокировку захватить не удалось
  49.      */
  50.     O tryExecute(WorkUnitUID workUnitUID, I input) throws LockedException;
  51.  
  52.     /***
  53.      * Эквивалент WorkUnitExclusiveAccessor, но передаваемый в эксклюзивный вызов параметр типа I,
  54.      * самостоятельно реализует WorkUnitUID
  55.      */
  56.     @Beta
  57.     interface SelfWU<I extends WorkUnitUID, O> {
  58.         O tryExecute(final I input) throws LockedException;
  59.  
  60.         O awaitExclusiveAccessorAndExecute(long time, TimeUnit unit, final I input) throws LockedException;
  61.  
  62.         O awaitExclusiveAccessorAndExecute(final I input) throws LockedException;
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement