Frage

Ich habe zu lange laufende Threads in einem WebLogic Bea 10,0 M1-Server-Umgebung ausführen. Ich habe versucht, WorkManagers für diesen Einsatz. einen eigenen Workmanager verwenden, kann ich meinen eigenen Thread Timeout angeben (MaxThreadStuckTime) statt dem Timeout für die gesamte Business-Anwendung anpassen.

Mein Setup ist wie folgt:

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>

und die Bean:

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

            }
        });
    }
}

Wenn ich versuche, diese Dinge zu implementieren, der Server gibt mir folgende Ausnahmen:

[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.

Ich versuche, herauszufinden, wie / jetzt Tage Nutzung WorkMangers zugreifen zu können, und noch dieses oder jenes als Ausnahme bekommen. Sehr frustrierend!

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sie müssen die Work refrence entfernen aus Ihrem weblogic-ejb-jar.xml , sollte diese refenece gehen auf ejb-jar.xml .

Infact Ich zweifle, ob Weblogic-Schema-Definition "weblogic-ejb-jar.xsd" ermöglicht es Ihnen, ein Referenzelement hinzufügen möchten, müssen Sie XSD-Validierungsfehler bekommen.

Wie auch immer, erhalten von dem Element zu befreien

  

Ressource-Beschreibung 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> 

es wird so aussehen

  

weblogic-ejb-jar.xml

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

Ihr Work Bezug auf ejb-jar.xml so gehen wird.

  

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>

Jetzt bekommen Work von JNDI ich tue

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

, aber ich glaube Annotation gleich gut funktionieren wird.

@Resource(name = "myWorkManager")

meine weblogic-application.xml sieht wie oben

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

Dies ist für mich zu arbeiten .. lassen Sie mich, wenn nötig wissen kann ich meinen vollen Code teilen.

Sie können Ihre Work und Last auf sie, indem Sie auf Weblogic Admin Console anzeigen Home-> Deployments-> yourApp-> Monitoring (Tab) -> WorkLoad (Tab)“

Andere Tipps

Sie müssen Ihre Arbeit Manager nennen. Die Art, wie wir es tun, ist in unserem Ohr Projekt 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>

(die Sie scheinen getan zu haben)

und dann verwenden wir die Anmerkungen die Manager zu setzen:

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

Und dann gibt es keine Codierung um die Arbeit Manager bekommen. Dies könnte für Sie arbeiten.

BEA (zusammen mit IBM) hat einen Rahmen speziell für die Verwaltung von langlaufende Aufgaben in einer Java EE-Umgebung entwickelt. Schauen Sie sich auf CommonJ .

Das Spring Framework bietet einige Komfort-Klassen, um dieses Rahmens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top