Чистое EJB 3.0 Spring's ThreadPoolTaskExecutor-подобное решение - PullRequest
0 голосов
/ 22 января 2011

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

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

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

Петр

1 Ответ

2 голосов
/ 23 января 2011

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

Пример:

@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 и объекты, управляемые сообщениями, действительно использовались для этого в прошлом, но это не лучший инструмент для JOB.Вы сталкиваетесь с множеством транзакционных проблем, таких как сообщения, которые не отправляются, пока транзакция не будет зафиксирована и т. Д. Также сложнее вернуть значение.Для этого также использовались таймеры EJB3, так как они также выполняют код асинхронно.

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

...