2009-07-09 8 views
4

Je dois exécuter des threads longs dans un environnement de serveur WebLogic Bea 10.0 M1. J'ai essayé d'utiliser WorkManagers pour cela. L'utilisation d'un WorkManager me permet de spécifier mon propre délai d'attente de thread (MaxThreadStuckTime) au lieu d'ajuster le délai d'attente pour l'ensemble de l'application métier.Weblogic Bea 10.0 M1 et WorkManager

Ma configuration est la suivante:

weblogic-ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-ejb-jar.xsd"> 

    <weblogic-enterprise-bean> 
     <ejb-name>TestBean</ejb-name> 
     <resource-description> 
      <res-ref-name>myWorkManager</res-ref-name> 
      <jndi-name>wm/myWorkManager</jndi-name> 
     </resource-description> 
    </weblogic-enterprise-bean> 

</weblogic-ejb-jar> 

weblogic-application.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic xmlns="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 
    http://www.bea.com/ns/weblogic/90/weblogic.xsd"> 

    <work-manager> 
     <name>myWorkManager</name> 
     <ignore-stuck-threads>1</ignore-stuck-threads> 
    </work-manager> 

</weblogic> 

et le haricot :

import javax.annotation.Resource; 
import javax.ejb.Stateful; 

import weblogic.work.WorkManager; 

@Stateful(mappedName = "TestBean") 
public class TestBean implements TestBeanRemote { 

    @Resource(name = "myWorkManager") 
    private WorkManager myWorkManager; 

    public void test() { 
     myWorkManager.schedule(new Runnable() { 

      public void run() { 
       while (true) { 
        System.out.println("test: +++++++++++++++++++++++++"); 
        try { 
         Thread.sleep(45000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 

      } 
     }); 
    } 
} 

Lorsque je tente de déployer ces choses, le serveur me donne les exceptions suivantes:

[EJB:011026]The EJB container failed while creating the java:/comp/env namespace for this EJB deployment. 
weblogic.deployment.EnvironmentException: [EJB:010176]The resource-env-ref 'myWorkManager' declared in the ejb-jar.xml descriptor has no JNDI name mapped to it. The resource-ref must be mapped to a JNDI name using the resource-description element of the weblogic-ejb-jar.xml descriptor. 

J'essaie de comprendre comment l'accès/utilisation WorkMangers depuis plusieurs jours, et encore obtenir ceci ou cela comme une exception. Très frustrant!

Merci d'avance!

Répondre

2

Vous devez retirer le refrence WorkManager de votre weblogic-ejb-jar.xml, ce refenece devrait aller à ejb-jar.xml. En fait, je doute que la définition du schéma Weblogic "weblogic-ejb-jar.xsd" vous permette d'ajouter un élément de référence, vous devez obtenir des erreurs de validation xsd.

de toute façon, se débarrasser de l'élément

ressources Description de weblogic-ejb-jar.xml

<weblogic-enterprise-bean> 
    <ejb-name>TestBean</ejb-name> 
    <resource-description> 
     <res-ref-name>myWorkManager</res-ref-name> 
     <jndi-name>wm/myWorkManager</jndi-name> 
    </resource-description> 
</weblogic-enterprise-bean> 

il ressemblera à ceci

weblogic-ejb-jar.xml

<weblogic-enterprise-bean> 
    <ejb-name>TestBean</ejb-name> 
</weblogic-enterprise-bean> 

votre référence workManager ira à ejb-jar.xml comme ceci.

ejb-jar.xml

<enterprise-beans> 
    <session> 
     <ejb-name>TestBean</ejb-name> 
     <ejb-class>com.xxx.TestBean</ejb-class> <!-- your package com.xxx--> 
     <resource-ref> 
      <res-ref-name>myWorkManager</res-ref-name> 
      <res-type>commonj.work.WorkManager</res-type> 
      <res-auth>Container</res-auth> 
     </resource-ref> 
    </session> 
</enterprise-beans> 

Maintenant, pour obtenir de WorkManager JNDI que je fais

InitialContext ctx = new InitialContext(); 
this.workManager = (WorkManager) ctx.lookup("java:comp/env/myWorkManager"); 

mais je belive annotation fonctionnera aussi bien.

@Resource(name = "myWorkManager") 

mon weblogic-application.xml semble même que partageais ci-dessus

<weblogic> 
<work-manager> 
    <name>myWorkManager</name> 
    <ignore-stuck-threads>1</ignore-stuck-threads> 
</work-manager> 

Cela fonctionne pour moi .. laissez-moi savoir si besoin je peux partager mon code complet.

vous pouvez voir votre WorkManager et charge en allant à la console d'administration Weblogic Maison-> Deployments-> yourApp-> Suivi (onglet) -> WorkLoad (Tab) »

0

BEA (avec IBM) a développé un framework spécialement conçu pour la gestion de tâches de longue durée dans un environnement Java EE. Jetez un oeil à CommonJ.

Le Spring Framework offre quelques classes de commodité autour de ce cadre.

0

Vous devez nommer votre gestionnaire de travaux. La façon dont nous le faisons est dans notre projet Ear EarContent/META-INF/weblogic-application.xml

<wls:work-manager> 
    <wls:name>wmBatch</wls:name> 
    <wls:ignore-stuck-threads>true</wls:ignore-stuck-threads> 
</wls:work-manager> 

(que vous semblez avoir fait)

et nous utilisons les annotations pour définir le gestionnaire :

@MessageDriven(ejbName =..., dispatchPolicy = "wmBatch") 

Et puis il n'y a pas de codage pour obtenir le gestionnaire de travaux. Cela pourrait fonctionner pour vous.

Questions connexes