Weblogic Bea 10.0 M1和WorkManager

时间:2009-07-09 16:21:58

标签: java java-ee weblogic weblogic-10.x

我必须在WebLogic Bea 10.0 M1服务器环境中执行长时间运行的线程。我尝试使用WorkManagers。使用自己的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>

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

            }
        });
    }
}

当我尝试部署这些东西时,服务器给了我以下例外:

[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 个答案:

答案 0 :(得分:2)

您需要从 weblogic-ejb-jar.xml 中删除WorkManager参考,此参考应该转到 ejb-jar.xml

事实上,我怀疑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的EJB-jar.xml中

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

现在从JNDI获取WorkManager我正在做

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

但我相信注释也同样有效。

@Resource(name = "myWorkManager")

我的 weblogic-application.xml 与上面共享的内容相同

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

这对我有用..如果需要,请告诉我,我可以分享我的完整代码。

您可以通过访问Weblogic管理控制台查看您的WorkManager并加载它 主页 - &gt;部署 - &gt; yourApp-&gt;监控(标签) - &gt; WorkLoad(标签)“

答案 1 :(得分:0)

BEA(与IBM一起)开发了一个专门用于管理Java EE环境中长时间运行任务的框架。看看CommonJ

Spring Framework为这个框架提供了一些便利类。

答案 2 :(得分:0)

您需要为您的工作经理命名。我们的方式是在我们的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")

然后没有关于获得工作经理的代码。这可能适合你。