Реализует Runnable поверх расширяет поток с EJB

1

Скажем, класс 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 способом вместо анонимного класса?

Теги:
runnable
asynchronous
ejb
code-injection

1 ответ

1
Лучший ответ

Из спецификации EJB:

Компонент предприятия не должен пытаться управлять потоками. Компонент предприятия не должен пытаться запускать, останавливать, приостанавливать или возобновлять поток или изменять приоритет или имя потока. Компонент предприятия не должен пытаться управлять группами потоков.

См. Блог Адама.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню