текущая ситуация: у меня есть служба с несколькими типичными методами, такими как create (), remove (), findXy () и т. Д. Теперь я хочу предотвратить два разных вызова службы одновременно, то есть хочу заблокируйте мой сервисный вызов, после ввода его в первый раз, так что второй клиент (или тот же клиент снова) будет вводить метод только после завершения первого клиента.
Для целей блокировки мы обычно используем ReentrantLocks. Они отлично работают. Но теперь я сомневаюсь, как реализовать эти ReentrantLocks, так как я не хочу вставлять их в каждый метод. Более того, наши сервисные слои уже сами определяют свой контекст транзакции, что означает, что когда я интегрирую их в сам метод, транзакция уже начинается до того, как произойдет блокировка.
public class WorkerServiceServerImpl implements WorkerServiceRemote
{
private static final ReentrantLock workerLock = new ReentrantLock( true );
@Autowired
private WorkerDao workerDao;
@Override
@Transactional
public int createWorker( int projectId ) throws RemoteException
{
workerLock.lock();//NO GOOD! Transaction already started!
try
{
workerDao.create( projectId );
//Do some more stuff...
}
finally
{
workerLock.unlock();//Unlock, next request can be handled!
}
}
...
}
Конечно, я мог бы создать ServiceLayer над этим классом WorkerServiceImpl и просто перенаправить вызовы на исходный сервис, но, поскольку у меня около 30 сервисов, мне интересно, есть ли какие-либо глобальные решения для решения этой проблемы. Или возможно создать собственную аннотацию, которая срабатывает до начала транзакции?
Любые идеи приветствуются, заранее спасибо!
ymene
РЕДАКТИРОВАТЬ: я выбираю методы CRUD для простоты. Конечно, эти сервисные вызовы намного сложнее и могут вызывать разные CRUD-методы в пределах одного вызова.