Правильно ли вызывать EJB-компонент из потока ThreadPoolExecutor? - PullRequest
0 голосов
/ 08 апреля 2010

Я пытаюсь вызвать некоторый метод EJB-компонента из протектора.и получение ошибки:

(как и Glassfish v3)

Уровень журнала

SEVERE Logger
javax.enterprise.system.std.com.sun.enterprise.v3.services.impl Пары имя-значение
{_ThreadName = Thread-1, _ThreadID = 42} Номер записи 928 ID сообщения
java.lang.NullPointerException в ua.co.rufous.server.broker.TempLicService.run (TempLicService.java Завершить сообщение 35) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolEx908).lang.Thread.run (Thread.java:637)

здесь - шаг

public class TempLicService implements Runnable {

    String hash;
//it`s Stateful bean
    @EJB
    private LicActivatorLocal lActivator;


    public TempLicService(String hash) {
        this.hash= hash;
    }


    @Override
    public void run() {


       lActivator.proccessActivation(hash);
    }

}

my ThreadPoolExecutor

public class RequestThreadPoolExecutor extends ThreadPoolExecutor {

    private boolean isPaused;
    private ReentrantLock pauseLock = new ReentrantLock();
    private Condition unpaused = pauseLock.newCondition();


    private static RequestThreadPoolExecutor threadPool;

    private RequestThreadPoolExecutor() {
        super(1, Integer.MAX_VALUE, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
        System.out.println("RequestThreadPoolExecutor created");
    }

    public static RequestThreadPoolExecutor getInstance() {
        if (threadPool == null)
            threadPool = new RequestThreadPoolExecutor();
        return threadPool;
    }
    public void runService(Runnable task) {

        threadPool.execute(task);


    }


    protected void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
        pauseLock.lock();
        try {
            while (isPaused) unpaused.await();
        } catch (InterruptedException ie) {
            t.interrupt();
        } finally {
            pauseLock.unlock();
        }
    }

    public void pause() {
        pauseLock.lock();
        try {
            isPaused = true;
        } finally {
            pauseLock.unlock();
        }
    }

    public void resume() {
        pauseLock.lock();
        try {
            isPaused = false;
            unpaused.signalAll();
        } finally {
            pauseLock.unlock();
        }
    }


    public void shutDown() {
        threadPool.shutdown();
    }
//<<<<<< creating thread here
    public void runByHash(String hash) {
        Runnable service = new TempLicService(hash);
        threadPool.runService(service);
    }
}

и метод, в котором я вызываюэто (это сервлет gwt, но нет проблем с вызовом потока, не содержащего ejb):

 @Override
    public Boolean submitHash(String hash) {
        System.out.println("submiting hash");
        try {

            if (tBoxService.getTempLicStatus(hash) == 1) {
//<<< here is the call
                    RequestThreadPoolExecutor.getInstance().runByHash(hash);
                    return true;
                }
            } catch (NoResultException e) {
                e.printStackTrace();
            }
            return false;
        }

Мне нужно организовать пул отправки хэша на сервер (вызовы bean-компонента LicActivator) ThreadPoolExecutor дизайн хорошая идея и почему она не работаетв моем случае?(насколько я знаю, мы не можем создать поток внутри bean-компонента, но можем ли мы вызвать bean-компонент из разных потоков?).Если нет, то какова основная практика для организации такого пула запросов ?

Спасибо.


  1. << Ответ: Я использую DI (EJB3.1) так мне не нужно искать здесь.(Приложение упаковано в ухо и оба модуля в нем (веб-модуль и ejb), оно прекрасно работает для меня).Но я могу использовать его только в управляемых классах. </li>

Итак ..

2.Могу ли я использовать ручной поиск в Tread?---- Да

3. Могу ли я использовать Бин, расширяющий ThreadPoolExecutor, и вызывать другой бин, реализующий Runnable?Или это не разрешено?

1 Ответ

0 голосов
/ 05 мая 2010

Я могу использовать его только в управляемых классах для внедрения EJB.

...