У меня есть bean-компонент @Stateless
, в котором методу нужно быстро вернуть статус, но выполнить длинную задачу в фоновом потоке. Мой подход был сделать следующее:EJB 3.1: Отключить асинхронную задачу в фазе без состояния
Создать пул потоков для выполнения этих задач, и сделать Threadpool переменную-член:
final ExecutorService m_threadPool = Executors.newFixedThreadPool(5 /* Get from config*/, new ThreadFactory()
{
public Thread newThread(final Runnable r) {
return new Thread(r, "NotificationInputHandler Thread");
}
});
Сплит мой метод обслуживания на две части: 1) createStatus и 2) performBigTask
public Result process(final List<String> input) {
final Result status = createStatus(input)
m_threadPool.submit(new Runnable() {
public void run() {
performBigTask(input);
}
});
return status;
}
Мои вопросы: 1. Может ли это быть сделано в лучшую сторону? 2. Я работаю на JBoss 7. Есть ли пул потоков, созданный приложением для приложения, который я мог бы вводить вместо создания собственного?
Спасибо за ответ, @achabahe! Как я могу управлять характеристиками потока в Jboss? В частности, я хотел бы контролировать количество потоков и размер очереди для отставания задачи. – Raj
Кроме того, это должен быть отдельный компонент или может быть @Asynchronous метод жить на одном и том же компоненте? – Raj
О, JBoss не соблюдает спецификацию. 100% у него есть талоны Utility, которые помогут вам получить прокси для этого сеансового компонента, тогда вы можете использовать этот прокси-сервер, а для извлечения результата вызова вы также используете класс Utility для извлечения Будущее для использования в конфигурации i realy не знаю об этом –
achabahe