2015-02-09 5 views
0

У меня есть два сессионных компонент:параллелизма на Stateless Bean

  • сессионных компонент под названием AuctionFrontEnd.
  • одноплодной сессия Bean называется StateAuctionFrontEnd

В StateAuctionFrontAnd существует HashMap и способы положить и удалить элемент из HashMap. Параллелизм обрабатывается аннотациями @Lock (WRITE) и @Lock (WRITE).

AuctionFrontEnd Bean реализует методы бизнес-логики, которые называют методы в StateAuctionFrontEnd.

Пример метод в AuctionFrontAnd является последователем (псевдо-код):

Если есть два клиента, которые хотят устранить один и тот же элемент, исключение может быть вызвано. Оба вызова метода delete, и оба входят в 'if'. Один удаляет элемент, а другой запускает исключение.

У меня такая же проблема в других бизнес-методах.

Как я могу это решить?

+1

Используйте одновременно структуру данных? – Brendan

ответ

1

Если вы получаете stateAuctionFronEnd.getHashMap(), вы оставляете замок EJB и одновременно изменяете карту.

Переключение на параллельную структуру данных не помогло бы, поскольку оператор if и delete находятся за пределами синхронизированного блока EJB.

Вы должны полностью переместить логику компонента Singleton и инкапсулировать доступ к HashMap, как:

@Lock(WRITE) 
public void removeValue(int key){ 
    if(stateAuctionFronEnd.getHashMap().containsKey(key)) 
      stateAuctionFronEnd.getHashMap().remove(key); 
} 

В качестве альтернативы можно также синхронизировать называемый код

+0

Но помните, что когда вы используете ручную синхронизацию, вы должны использовать тип '@ConcurrencyManagement (BEAN)' на вашем одноэлементном классе. – slwk

+0

Это решение! В противном случае, если бы я использовал API транзакций, чтобы обеспечить «атомарность последовательности операций»? –

+0

@slwk Да, но я имел в виду ручную синхронизацию в фазе без состояния. Использование транзакций должно работать и попадет в категорию «ручная синхронизация», но будьте осторожны, чтобы не блокировать надолго –

Смежные вопросы