Реализует Runnable поверх расширяет поток с EJB
Скажем класс MyCoolProcess
имеет логику моего приложения, которое необходимо вызывать в своем собственном потоке. Мы создадим тему, вызовем ее и продолжим работу с приложением.
Этот класс является EJB; с пометкой @Stateless
Теперь у нас есть MyController
учебный класс; который собирается вызвать новую тему.
Код:
public class MyController {
@EJB
MyCoolProcess p;
public Response foo() {
Thread t = new Thread() {
public void run() {
p.run();
}
};
t.start();
// continues ...
}
}
@Stateless
public class MyCoolProcess {
public void run() {
// heavy task
}
}
Это работает нормально; дело в том... до того решения, которое я пробовал с Runnable
интерфейс. Какой я хотел в первый раз. Подход будет такой:
public class MyController {
@EJB
MyCoolProcess p;
public Response foo() {
Thread t = new Thread(p);
t.start();
// continues ...
}
}
@Stateless
public class MyCoolProcess implements Runnable {
@Override
public void run() {
// heavy task
}
}
Это не работает На самом деле, сервер не может запуститься. Сбои при попытке ввести зависимости. Я не смогу реализовать интерфейс Runnable
если я EJB не так ли? ЗАЧЕМ
И... есть ли способ сделать Runnable
Кстати вместо анонимного класса?
1 ответ
Из спецификации EJB:
Корпоративный компонент не должен пытаться управлять потоками. Корпоративный компонент не должен пытаться запустить, остановить, приостановить или возобновить поток или изменить приоритет или имя потока. Корпоративный компонент не должен пытаться управлять группами потоков.
Смотрите блог Адама.