2010-04-08 2 views
-1

J'essaie d'appeler une méthode de bean ejb de la bande de roulement. et erreur est survenue lors:est-il correct d'appeler le bean ejb du thread par ThreadPoolExecutor?

(comme GlassFish v3)

Log Level

GRAVES Logger
javax.enterprise.system.std.com.sun.enterprise.v3.services.impl paires nom-valeur
{_ThreadName = discussion-1, _ThreadID = 42} Numéro 928 ID de message
java.lang.NullPointerException à ua.co.rufous.server.broker.TempLicService.run (Templi cService.java message complet 35) à java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) à java.lang.Thread.run (Thread.java:637)

est ici foulent

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); 
    } 

} 

mon 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); 
    } 
} 

et méthode où je l'appelle (il est servlet GWT, mais il n'y a pas problèm appeler fil qui contient 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; 
     } 

J'ai besoin d'organiser une piscine de soumettre hash au serveur (appels de bean LicActivator), est ThreadPoolExecutor bonne idée de conception et pourquoi il ne fonctionne pas dans mon cas? (comme je sais que nous ne pouvons pas créer de thread à l'intérieur du bean, mais pourrions-nous appeler bean de différents threads?). Si non, quelle est la pratique de Bast pour organiser ces pool de requêtes?

Merci.


  1. < < Réponse: J'utilise DI (EJB 3.1) soo i ne pas besoin de regarder ici. (application emballée dans l'oreille et les deux modules dedans (module de Web et ejb), cela fonctionne parfait pour moi). Mais je ne peux l'utiliser que dans les classes gérées.

So ..

2.Puis J'utilise regarder manuel dans la bande de roulement? ---- Oui

3. Puis-je utiliser Bean qui étend ThreadPoolExecutor et appeler un autre bean qui implémente Runnable? Ou ce n'est pas autorisé?

+1

Il se peut que je manque quelque chose, mais où recherchez-vous votre bean session? lActivator.proccessActivation (hash) lancera NullPointerException si vous n'initialisez pas lActivator.L'injection @EJB ne fonctionnera pas dans votre exemple. Voir aussi http://stackoverflow.com/questions/848675/ejb-annotation-in-clients –

+0

J'utilise DI (EJB 3.1) donc je n'ai pas besoin de chercher ici. (application emballée dans l'oreille et les deux modules dedans (module de Web et ejb), cela fonctionne parfait pour moi). Mais je ne peux l'utiliser que dans les classes gérées. 1. Donc, je peux utiliser la recherche manuelle dans la bande de roulement? 2. Pourrais-je utiliser Bean qui étend ThreadPoolExecutor et qui appelle un autre bean qui implémente Runnable? Ou ce n'est pas autorisé? –

Répondre

0

Je ne peux l'utiliser que dans les classes gérées pour l'injection d'EJB.

Questions connexes