Реализует 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:

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

Смотрите блог Адама.

Другие вопросы по тегам