Pergunta

Eu tenho que executar tópicos longa em execução em um ambiente de servidor WebLogic Bea 10,0 M1. Eu tentei usar WorkManagers para isso. Usando um própria WorkManager me permite especificar o meu próprio tempo limite thread (MaxThreadStuckTime) em vez de ajustar o tempo limite para toda a aplicação de negócio.

Minha configuração é a seguinte:

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>

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

            }
        });
    }
}

Quando tento implantar essas coisas, o servidor me dá as seguintes exceções:

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

Eu tento descobrir como WorkMangers acesso / uso para os dias agora, e ainda obter este ou aquele como uma exceção. Muito frustrante!

Agradecemos antecipadamente!

Foi útil?

Solução

Você precisa remover o refrence WorkManager de sua weblogic-ejb-jar.xml , este refenece deve ir para ejb-jar.xml .

De fato I dúvida se definição de esquema Weblogic "weblogic-ejb-jar.xsd" permitirá que você adicionar um elemento de referência, você deve estar recebendo erros de validação XSD.

De qualquer forma, se livrar do elemento

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

que será parecido com este

weblogic-ejb-jar.xml

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

sua referência WorkManager irá para ejb-jar.xml assim.

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>

Agora, para obter WorkManager de JNDI estou fazendo

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

mas eu anotação Belive vai funcionar igualmente bem.

@Resource(name = "myWorkManager")

minha weblogic-application.xml parece mesmo que compartilhada acima

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

Esse é um trabalho para mim .. deixe-me saber se necessário eu posso compartilhar meu código completo.

Você pode ver o seu WorkManager e carga sobre ele, indo para WebLogic Admin Console Home-> Deployments-> yourApp-> Monitoramento (Tab) -> carga de trabalho (Tab)”

Outras dicas

Você precisa nomear seu gerenciador de trabalho. A forma como o fazemos é no nosso projecto Orelha 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 você parece ter feito)

e depois usamos as anotações para definir o gerente:

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

E então não há nenhuma codificação em torno de obter o gerente trabalho. Este trabalho poder para você.

BEA (em conjunto com a IBM) desenvolveram um quadro especificamente para gerenciar tarefas de longa execução em um ambiente Java EE. Dê uma olhada na CommonJ .

O Spring Framework oferece algumas classes de conveniência em torno deste quadro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top