Есть ли способ прервать сессионный компонент с отслеживанием состояния?

Этот вопрос несколько связан с обработкой тайм-аута в EJB3 без использования потоков.

Предыстория. У меня есть пример операции, которая может заблокироваться во время выполнения, и я должен быть в состоянии справиться с этой возможностью и завершить операцию, если это произойдет. Решение должно быть независимым от сервера приложений, поэтому транзакции, управляемые контейнером, со значениями тайм-аута не подходят.

Актуальный вопрос. Одна идея для решения, в котором я запускал операцию в сессионном компоненте с отслеживанием состояния и использовал внешний метод @Timeout для ее мониторинга, но для этого мне нужно иметь возможность прерывания или отменить этот сессионный компонент. Есть ли способ сделать это?


person mikek    schedule 27.05.2011    source источник
comment
Почему независимость сервера приложений исключает использование транзакций, управляемых контейнером? CMT являются частью спецификации Java EE, которую должен реализовать каждый сервер приложений Java EE.   -  person Matt Ball    schedule 27.05.2011
comment
@Matt: Ах, я имел в виду CMT с тайм-аутами. Спасибо за указатель.   -  person mikek    schedule 27.05.2011


Ответы (1)


Спецификация говорит (§4.3.14):

Контейнер сериализует вызовы к каждому экземпляру сеансового компонента с состоянием и без состояния. Большинство контейнеров поддерживают множество экземпляров сеансового компонента, выполняющихся одновременно; однако каждый экземпляр видит только сериализованную последовательность вызовов методов. Таким образом, сеансовый компонент с состоянием или без состояния не должен кодироваться как реентерабельный.

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

person JB Nizet    schedule 27.05.2011
comment
То же самое верно для Java в целом. Вы должны реализовать совместное прерывание, запрограммировав прерываемую задачу так, чтобы она периодически опрашивала, была ли она прервана. - person Brett Kail; 27.05.2011