Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import com.google.common.annotations.Beta;
- import java.util.concurrent.TimeUnit;
- /**
- * Created by sergey.kobets on 13.11.2015.
- * Класс делегатор / семафор, с синхронизацией через базу данных.
- * Гарантирует, что в один момент времени в системе может исполнятся только 1 произвольный вызов,
- * по идентификатору единицы работы.
- * <p/>
- * Объект реализует 2-х уровневый семафор, память + бд -> не совершает лишние операции по базе,
- * если не удается захватить блокировку сначала в памяти.
- * <p/>
- * Блокирующие методы с ожиданием захвата блокировки останавливаются так же по thread.interrupt()
- * <p/>
- * Реализует DestructorHook ->
- * в случае корректного завершения работы ноды или сервера, выполняемые объекты WorkUnitExclusiveAccessor
- * приостановят попытки захвата блокировки и попытаются корректно завершить бизнес логику
- * которая выполнялась в момент инициализации остановки по ранее захваченным блокировкам.
- */
- public interface WorkUnitExclusiveAccessor<I, O> {
- /**
- * Произвести в блокирующем режиме попытку захвата блокировки на WorkUnitUID, в течении времени
- * unit.toNanos(time), после чего незамедлительно выполнить бизнес логику передав на вход input
- * и не зависимо от успеха выполнения снять блокировку по завешению вызова метода.
- *
- * @throws LockedException - в случае если в момент ожидания захвата блокировки, ожидающий поток будет
- * прерван из вне и в случае если за время unit.toNanos(time) блокировку захватить не удалось
- */
- O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, long time, TimeUnit unit, I input)
- throws LockedException;
- /***
- * Ожидание по умолчанию 30 секунд, эквивалент:
- * O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, 30L, TimeUnit.SECOND, I input)
- */
- O awaitExclusiveAccessorAndExecute(WorkUnitUID workUnitUID, I input) throws LockedException;
- /***
- * Реализация шаблона "Пессимистичная блокировка"
- * <p/>
- * Произвести попытку захвата блокировки на WorkUnitUID, в случае успеха незамедлительно
- * выполнить бизнес логику, передав на вход бизнес метода в замыкании input и не зависимо
- * от успеха выполнения, снять блокировку по его завешению
- *
- * @throws LockedException - в случае если брокировку захватить не удалось
- */
- O tryExecute(WorkUnitUID workUnitUID, I input) throws LockedException;
- /***
- * Эквивалент WorkUnitExclusiveAccessor, но передаваемый в эксклюзивный вызов параметр типа I,
- * самостоятельно реализует WorkUnitUID
- */
- @Beta
- interface SelfWU<I extends WorkUnitUID, O> {
- O tryExecute(final I input) throws LockedException;
- O awaitExclusiveAccessorAndExecute(long time, TimeUnit unit, final I input) throws LockedException;
- O awaitExclusiveAccessorAndExecute(final I input) throws LockedException;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement