2011-01-22 4 views
0

В моем приложении на основе EJB3.0 и JBoss5 мне нужно реализовать функциональность, которая позволяет обрабатывать одновременно несколько инструкций. Например. существует EJB прослушивания с поддержкой состояния, который в случае приема данных (асинхронно) запускает объединенные фаз без учета состояния для выполнения вычислений. Выполнение выполнения в одном SLSB не останавливает запуск в другом SLSB (в случае получения запроса SFSB до того, как первый SLSB завершит свою работу). Это похоже на Spring ThreadPoolTaskExecutor - задача передается в очередь, и когда есть поток, доступный для его обработки, он получает его из очереди (все делается параллельно).Pure EJB 3.0 Spring ThreadPoolTaskExecutor-like решение

К сожалению, я не могу использовать Spring или другую версию спецификации EJB (но я могу использовать некоторые функции JBoss). Как я могу реализовать такую ​​вещь? Я думал об использовании MDB, который работает как исполнители задач, но я не очень уверен, что это будет сделано одновременно (это мой первый вопрос;)), и если это правильный способ использования JMS (не для «обмена сообщениями»).

Заранее благодарим за все намеки.

Петр

ответ

2

Использование org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils. Это выполняет асинхронный код любого SLSB (или даже других компонентов, имеющих интерфейс).

Пример:

@Stateless 
public class SomeBean implements SomeBeanLocal { 

    public Future<Order> getByUserIDAsync(Long userID) { 
     SomeBeanLocal asyncSomeBean = AsyncUtils.mixinAsync(this); 
     asyncSomeBean.getByUserID(userID); 
     return (Future<Order>) AsyncUtils.getFutureResult(asyncSomeBean); 
    } 

    // normal non-async methods or other async methods here ... 
} 

Это направит вызов к управляемому пула потоков, что каждый EJB контейнер и немедленно вернуться. Затем код будет работать в фоновом режиме.

JMS и управляемые сообщением beans действительно использовались для этого в прошлом, но это не лучший инструмент для JOB. Вы сталкиваетесь с кучей транзакционных проблем, таких как сообщения, которые не отправляются до тех пор, пока транзакция не завершится и т. Д. Также сложно вернуть значение. Для этого также использовались таймеры EJB3, так как они также выполняли код асинхронно.

Я знаю, что вы упомянули, что в настоящий момент вы не можете переключиться на другую версию EJB, но я хотел бы упомянуть, что в EJB 3.1 можно использовать @Asynchronous annotation. Это действительно лучший способ решить эту проблему.

+0

Вот и все! Большое спасибо. –

+0

Добро пожаловать;) –