EJB форсирует однопоточный доступ к отдельным членам коллекции ресурсов

1

Как в среде EJB я могу заставить взаимодействие с любым заданным ресурсом в совокупности ресурсов быть однопоточным, не ограничивая доступ к самой коллекции? Я хочу разрешить одному потоку взаимодействовать с ресурсом A, а другой взаимодействует с ресурсом B; но запрещают одновременное взаимодействие двух потоков с одним и тем же ресурсом.

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

Пул устройств - это сотни, но не тысячи. Это также несколько динамично - устройства появляются и падают.

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

Но большинство или все это должно быть уже рассмотрено, где-то в механизмах параллелизма Java?

Есть ли устоявшийся образец, который я должен использовать?

  • 0
    С помощью singleton EJB контейнер может синхронизировать каждый параллельный запрос, что позволяет выполнять некоторые функции в однопоточной модели. Я знаю, что вы уже решили использовать Singleton EJB, но мне не ясно, почему это не подходит для вашей проблемы.
  • 0
    Как бы вы использовали одноэлементный EJB для достижения того, чего я пытаюсь достичь, а именно, чтобы позволить многим потокам параллельно получать доступ ко многим устройствам, но для любого одного устройства только один поток за раз может получить к нему доступ. Если не считать (вручную) создания отдельного одноэлементного EJB для каждого устройства, что еще я мог сделать?
Теги:
multithreading
ejb

1 ответ

1

Вы уверены, что хотите использовать EJB для этого? Смешивание стандартных java-параллельных механизмов и JavaEE скорее обескураживается...

Смотрите: почему-нереститься-нить-в-java-ee-контейнер-обескуражен

  • 0
    Я не создаю никаких потоков напрямую - я оставляю все для контейнера, который реализует JSR-236. В контейнере может быть запущено несколько потоков, каждый из которых может попытаться связаться с данным устройством, в котором и возникает проблема.
  • 0
    Хорошо, тогда на вашем месте я бы сделал так, чтобы эти потоки обращались к одному Singleron EJB. Я хотел бы аннотировать его с помощью @ConcurrencyManagement (BEAN) и самостоятельно реализовать необходимые механизмы синхронизации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню