Я пытаюсь вызвать некоторый метод 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-компонент из разных потоков?).Если нет, то какова основная практика для организации такого пула запросов ?
Спасибо.
- << Ответ: Я использую DI (EJB3.1) так мне не нужно искать здесь.(Приложение упаковано в ухо и оба модуля в нем (веб-модуль и ejb), оно прекрасно работает для меня).Но я могу использовать его только в управляемых классах. </li>
Итак ..
2.Могу ли я использовать ручной поиск в Tread?---- Да
3. Могу ли я использовать Бин, расширяющий ThreadPoolExecutor, и вызывать другой бин, реализующий Runnable?Или это не разрешено?