Search code examples
javajava-ee-6weblogic11gejb-2.x

Unable to lookup TimerManager resources in Weblogic


I am trying to lookup a TimerManager resource on a Weblogic Enterprise Application, but no matter what I try I always get a NameNotFoundException. I've been looking at a lot of different solutions online, but haven't found one that works yet:

Here's my ejb-jar.xml:

<ejb-jar>
    <enterprise-beans>
        <session>
            <ejb-name>TimerBean</ejb-name>
            <remote>ejb.generated.TimerBeanRemote</remote>  
            <local>ejb.generated.TimerBeanLocal</local>
            <home>ejb.generated.TimerBeanHomeRemote</home>
            <local-home>ejb.generated.TimerBeanHomeLocal</local-home>
            <ejb-class>ejb.TimerBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>

            <resource-ref>
                <res-ref-name>tm/TimerController</res-ref-name>
                <res-type>commonj.timers.TimerManager</res-type>
                <res-auth>Container</res-auth>
                <res-sharing-scope>Unshareable</res-sharing-scope>
            </resource-ref>
        </session>
    </enterprise-beans>
</ejb-jar>

My weblogic-ejb-jar.xml:

<weblogic-ejb-jar>
    <weblogic-enterprise-bean>
        <ejb-name>TimerBean</ejb-name>
        <local-jndi-name>TimerBeanLocal</local-jndi-name>
        <jndi-name>ejb/TimerBeanRemote</jndi-name>
    <dispatch-policy>ejb-workmanagement</dispatch-policy>

    <reference-descriptor>
        <resource-description>
            <res-ref-name>tm/TimerController</res-ref-name>
            <jndi-name>TimerController</jndi-name>
            <res-type>commonj.timers.TimerManager</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Unshareable</res-sharing-scope>
        </resource-description>
    </reference-descriptor>
</weblogic-ejb-jar>

And my Bean:

// xdocklet generated.
public abstract class TimerBean implements SessionBean {
  public void ejbCreate() {
    Context context = new InitialContext();
    TimerManager mgr = (TimerManager) context.lookup("java:comp/env/tm/TimerController");
    // ...
  }
}

I've tried looking up "java:comp/env/tm/TimerController", "java:/comp/env/tm/TimerController", "tm/TimerController"... Nothing seems to work, I always end up with a NameNotFoundException, always from the entire string, except the java: part, as the remaining name (i.e. it doesn't find anything at all).

edit it also seems that my TimerController resource is not present in Weblogic's jndi tree page.

edit2 After listing the objects in the java:comp/env context using context.list("java:comp/env") it seems that indeed it is ignoring the resource-ref. I'll investigate further.

Here's the full stack trace:

javax.naming.NameNotFoundException: While trying to look up comp/env/tm/TimerController in /app/ejb/my-app-ejb-1.0.0-SNAPSHOT.jar#TimerBean.; remaining name 'comp/env/tm/TimerController'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:144)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:254)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:380)
at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
at weblogic.jndi.internal.AbstractURLContext.lookup(AbstractURLContext.java:130)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at ejb.TimerBean.ejbCreate(TimerBean.java:55)
at ejb.TimerBean_sxsqua_Impl.ejbCreate(TimerBean_sxsqua_Impl.java:162)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at weblogic.ejb.container.pool.StatelessSessionPool.createBean(StatelessSessionPool.java:205)
at weblogic.ejb.container.pool.Pool.createInitialBeans(Pool.java:300)
at weblogic.ejb.container.manager.StatelessManager.initializePool(StatelessManager.java:444)
at weblogic.ejb.container.deployer.EJBDeployer.initializePools(EJBDeployer.java:1546)
at weblogic.ejb.container.deployer.EJBDeployer.start(EJBDeployer.java:1377)
at weblogic.ejb.container.deployer.EJBModule.start(EJBModule.java:589)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:117)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:635)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:212)
at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:16)
at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:162)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:569)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:140)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:106)
at weblogic.deploy.internal.targetserver.operations.StartOperation.doCommit(StartOperation.java:143)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:323)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:820)
at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1227)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:436)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:163)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:181)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:12)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:67)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

Solution

  • Solved it at last!!!!

    turns out the problem lied in the xdoclet generation. I was missing the @ejb.resource-ref tag! Now everything works. I don't even need the ejb-jar.xml and weblogic-ejb-jar.xml anymore.

    So here's the full working Bean:

    /**
     * @ejb.bean
     * name="TimerBean"
     * jndi, home, remote config
     * @ejb.resource-ref
     *  res-ref-name="TimerController"
     *  res-type="commonj.timers.TimerManager"
     *  res-auth="Container"
     *  res-sharing-scope="Shareable"
     */
    public abstract class TimerBean implements SessionBean {
      public void ejbCreate() {
        Context context = new InitialContext();
        TimerManager mgr = (TimerManager) context.lookup("java:comp/env/TimerController");
        // ...
      }
    }