Weblogic Bea 10.0 M1 e WorkManager
-
12-09-2019 - |
Domanda
Devo eseguire thread di lunga durata in un ambiente server WebLogic Bea 10.0 M1.Ho provato a utilizzare WorkManagers per questo.L'utilizzo di un WorkManager personale mi consente di specificare il timeout del thread (MaxThreadStuckTime) invece di regolare il timeout per l'intera applicazione aziendale.
La mia configurazione è la seguente:
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>
applicazione-weblogic.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>
e il Fagiolo:
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();
}
}
}
});
}
}
Quando provo a distribuire queste cose, il server mi dà le seguenti eccezioni:
[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.
Cerco di capire come accedere / utilizzare WorkMangers ormai da giorni, e continuo a ottenere questo o quello come eccezione.Molto frustrante!
Grazie in anticipo!
Soluzione
Devi rimuovere la referenza WorkManager dal tuo weblogic-ejb-jar.xml, questo riferimento dovrebbe andare a ejb-jar.xml.
Infatti dubito che la definizione dello schema Weblogic "weblogic-ejb-jar.xsd" ti consentirà di aggiungere un elemento di riferimento, devi ricevere errori di convalida xsd.
comunque sbarazzati dell'elemento
descrizione della risorsa da 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>
sembrerà così
weblogic-ejb-jar.xml
<weblogic-enterprise-bean>
<ejb-name>TestBean</ejb-name>
</weblogic-enterprise-bean>
il tuo riferimento a workManager andrà a ejb-jar.xml in questo modo.
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>
Ora sto facendo per ottenere WorkManager da JNDI
InitialContext ctx = new InitialContext();
this.workManager = (WorkManager) ctx.lookup("java:comp/env/myWorkManager");
ma credo che l'annotazione funzionerà altrettanto bene.
@Resource(name = "myWorkManager")
Mio applicazione-weblogic.xml sembra lo stesso condiviso sopra
<weblogic>
<work-manager>
<name>myWorkManager</name>
<ignore-stuck-threads>1</ignore-stuck-threads>
</work-manager>
Questo funziona per me..fammi sapere se necessario posso condividere il mio codice completo.
Puoi visualizzare il tuo manager e caricarlo andando a WebLogic Admin Console Home—> Distribuzioni—> YourApp—> Monitoraggio (Tab) -> Workload (Tab) "
Altri suggerimenti
È necessario assegnare un nome al responsabile lavoro. Il modo in cui lo facciamo è nel nostro orecchio progetto 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>
(che sembrano aver fatto)
e poi usiamo le annotazioni per impostare il manager:
@MessageDriven(ejbName =..., dispatchPolicy = "wmBatch")
E poi non v'è alcuna codifica intorno a ottenere il manager di lavoro. Questo potrebbe funzionare per voi.
BEA (insieme a IBM) hanno sviluppato un quadro specifico per la gestione delle attività a lungo in esecuzione in un ambiente Java EE. Date un'occhiata a CommonJ .
La Spring Framework offre alcune classi di convenienza intorno a questo quadro.