2016-02-17 5 views
0

У меня есть 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. Есть ли пул потоков, созданный приложением для приложения, который я мог бы вводить вместо создания собственного?

ответ

2

вы можете использовать @Asynchronous, имеют другой сессионный B боб, чтобы сделать вашу большую задачу и аннотировать его метод с @Asynchronous и затем вам оригинальный сеанс Bean позволяет назвать это вызов, прежде чем он возвращает статус

Б:

@Asynchronous 
public Future<SomeResult> performBigTask(List<String> input){ 
/*run your big task*/ 
return new Asynchronous<SomeResult>(bigTaskResult);} 

А:

@EJB B b; 
public Result process(final List<String> input) { 
final Result status = createStatus(input) 
Future<SomeResult>result= b.performBigTask(input); 
//check if every thing went well or what ever logic you have 
return status; 
} 

, если вы хотите посмотреть, как манипулировать Будущим, вот ссылка oracle tutorial

+0

Спасибо за ответ, @achabahe! Как я могу управлять характеристиками потока в Jboss? В частности, я хотел бы контролировать количество потоков и размер очереди для отставания задачи. – Raj

+0

Кроме того, это должен быть отдельный компонент или может быть @Asynchronous метод жить на одном и том же компоненте? – Raj

+0

О, JBoss не соблюдает спецификацию. 100% у него есть талоны Utility, которые помогут вам получить прокси для этого сеансового компонента, тогда вы можете использовать этот прокси-сервер, а для извлечения результата вызова вы также используете класс Utility для извлечения Будущее для использования в конфигурации i realy не знаю об этом – achabahe