Weblogic Bea 10.0 M1 и WorkManager - PullRequest
4 голосов
/ 09 июля 2009

Мне нужно выполнить долго работающие потоки в среде сервера WebLogic Bea 10.0 M1. Я пытался использовать WorkManager для этого. Использование собственного WorkManager позволяет мне указать собственное время ожидания потока (MaxThreadStuckTime) вместо настройки времени ожидания для всего бизнес-приложения.

Моя настройка следующая:

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>

и Боб:

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

            }
        });
    }
}

Когда я пытаюсь развернуть это, сервер выдает мне следующие исключения:

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

Я пытаюсь выяснить, как получить доступ / использовать WorkMangers в течение нескольких дней, и все равно получаю то или иное в качестве исключения. Очень расстраивает!

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 12 января 2010

Вам необходимо удалить ссылку WorkManager из вашего weblogic-ejb-jar.xml , это восстановление должно перейти к ejb-jar.xml .

Infact Я сомневаюсь, что если определение схемы Weblogic "weblogic-ejb-jar.xsd" позволит вам добавить ссылочный элемент, вы должны получать ошибки проверки xsd.

в любом случае, избавься от стихии

описание ресурса из 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> 

это будет выглядеть так

WebLogic-jar.xml-EJB

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

Ваша ссылка на WorkManager будет идти в ejb-jar.xml следующим образом.

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>

Теперь, чтобы получить WorkManager от JNDI, я делаю

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

но я верю, что аннотация будет работать одинаково хорошо.

@Resource(name = "myWorkManager")

my weblogic-application.xml выглядит так же, как указано выше

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

Это работает для меня .. дайте мне знать, если нужно, я могу поделиться своим полным кодом.

вы можете просмотреть ваш WorkManager и загрузить его, перейдя в консоль администратора Weblogic Домашняя страница—> Развертывания—> yourApp—> Мониторинг (вкладка) -> WorkLoad (вкладка) ”

0 голосов
/ 21 ноября 2009

Вам необходимо указать имя вашего руководителя работы. То, как мы это делаем, находится в нашем 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>

(что вы, похоже, сделали)

и затем мы используем аннотации для установки менеджера:

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

И тогда нет необходимости искать менеджера по работе. Это может сработать для вас.

0 голосов
/ 10 июля 2009

Компания BEA (совместно с IBM) разработала среду, специально предназначенную для управления долгосрочными задачами в среде Java EE.Взгляните на CommonJ .

Spring Framework предлагает несколько удобных классов вокруг этой платформы.

...