[jboss-jira] [JBoss JIRA] (WFLY-6663) NPE o.j.a.ejb3.component.stateful.StatefulSessionComponent.createSession(StatefulSessionComponent.java:238)

jaikiran pai (JIRA) issues at jboss.org
Sat Oct 8 11:35:00 EDT 2016


    [ https://issues.jboss.org/browse/WFLY-6663?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13304553#comment-13304553 ] 

jaikiran pai edited comment on WFLY-6663 at 10/8/16 11:34 AM:
--------------------------------------------------------------

I see what's going on (and am able to reproduce it within the WildFly testsuite). It isn't related to anything transaction management. The root cause of the issue is that the startup singleton bean injects a *remote view of a stateful session bean*. Internally, when the injection process on that singleton startup bean is in progress, it triggers a session creation on the stateful session bean, even before the (MSC service backing the) stateful component has started. 

The relevant piece of code in WildFly is (I think) this https://github.com/wildfly/wildfly/blob/master/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbInjectionSource.java#L93 where it skips adding a dependency and instead sets up the RemoteViewManagedReferenceFactory which later on just goes ahead and tries to create a component session for the stateful bean https://github.com/wildfly/wildfly/blob/master/ejb3/src/main/java/org/jboss/as/ejb3/remote/RemoteViewManagedReferenceFactory.java#L95

I have been away from WildFly code for a while now and can't think of a way to fix this properly, given that ejb: lookups in theory don't need to depend on the component, if the component is really "remote" and doesn't reside on the same server, which is not the case in the example above. Someone else in the WildFly dev team, I believe, will be able to fix this properly.

The only workaround that I can think of is, if your MainEjb which I believe is a stateful bean has a local business interface too, then use that interface for injection instead of the remove business interface here:

{code}

        @EJB
        private MainEjb mainEjb;  // use a local business interface instead of a remote one

{code}






was (Author: jaikiran):
I see what's going on (and am able to reproduce it within the WildFly testsuite). It isn't related to anything transaction management. The root cause of the issue is that the startup singleton bean injects a *remote view of a stateful session bean*. Internally, when the injection process on that singleton startup bean is in progress, it triggers a session creation on the stateful session bean, even before the (MSC service backing the) stateful component has started. 

The relevant piece of code in WildFly is (I think) this https://github.com/wildfly/wildfly/blob/master/ejb3/src/main/java/org/jboss/as/ejb3/deployment/processors/EjbInjectionSource.java#L93 where it skips adding a dependency and instead sets up the RemoteViewManagedReferenceFactory which later on just goes ahead and tries to create a component session for the stateful bean https://github.com/wildfly/wildfly/blob/master/ejb3/src/main/java/org/jboss/as/ejb3/remote/RemoteViewManagedReferenceFactory.java#L95

I have been away from WildFly code for a while now and can't think of a way to fix this properly, given that ejb: lookups in theory don't need to depend on the component, if the component is really "remote" and doesn't reside on the same server, which is not the case in the example above. Someone else in the WildFly dev team, I believe, will be able to fix this properly.

The only workaround that I can think of is, if you MainEjb which I believe is a stateful bean has a local business interface too, then use that interface for injection instead of the remove business interface here:

{code}

        @EJB
        private MainEjb mainEjb;  // use a local business interface instead of a remote one

{code}





> NPE o.j.a.ejb3.component.stateful.StatefulSessionComponent.createSession(StatefulSessionComponent.java:238)
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: WFLY-6663
>                 URL: https://issues.jboss.org/browse/WFLY-6663
>             Project: WildFly
>          Issue Type: Bug
>          Components: EJB
>    Affects Versions: 10.0.0.Final, 10.1.0.Final
>         Environment: Win7 64bit + JDK8 64bit
>            Reporter: Darryl Miles
>
> 1 in 8 deployments fail to deploy, usually a redeploy fixes it.
> If there is anyway to get a module state logging out of it, I can send over two logs to compare, one that deploy ok and one that fails.  I guess there is a race bug there somewhere.
> 09:42:01,687 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 529) MSC000001: Failed to start service jboss.deployment.subunit."com.domain.ear-0.0.1-SNAPSHOT.ear"."com-domain-ejb.main-0.0.1-SNAPSHOT.jar".component.MainStartupEjbImpl.START: org.jboss.msc.service.StartException in service jboss.deployment.subunit."com.domain.ear-0.0.1-SNAPSHOT.ear"."com-domain-ejb.main-0.0.1-SNAPSHOT.jar".component.MainStartupEjbImpl.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
> 	at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:57)
> 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 	at java.lang.Thread.run(Thread.java:745)
> 	at org.jboss.threads.JBossThread.run(JBossThread.java:320)
> Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
> 	at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163)
> 	at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134)
> 	at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88)
> 	at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:124)
> 	at org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:138)
> 	at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:54)
> 	... 6 more
> Caused by: javax.ejb.EJBException: java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: env/com.domain.ejb.main.impl.MainStartupEjbImpl/mainEjb
> 	at org.jboss.as.ejb3.tx.BMTInterceptor.handleException(BMTInterceptor.java:83)
> 	at org.jboss.as.ejb3.tx.EjbBMTInterceptor.checkStatelessDone(EjbBMTInterceptor.java:91)
> 	at org.jboss.as.ejb3.tx.EjbBMTInterceptor.handleInvocation(EjbBMTInterceptor.java:106)
> 	at org.jboss.as.ejb3.tx.BMTInterceptor.processInvocation(BMTInterceptor.java:58)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
> 	at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
> 	at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
> 	... 11 more
> Caused by: java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: env/com.domain.ejb.main.impl.MainStartupEjbImpl/mainEjb
> 	at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:319)
> 	at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:97)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:107)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:107)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:107)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:28)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.weld.ejb.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:100)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
> 	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
> 	at org.jboss.as.ejb3.tx.EjbBMTInterceptor.handleInvocation(EjbBMTInterceptor.java:103)
> 	... 26 more
> Caused by: javax.naming.NamingException: WFLYNAM0062: Failed to lookup env/com.domain.ejb.main.impl.MainStartupEjbImpl/mainEjb [Root exception is java.lang.RuntimeException: WFLYEJB0423: Could not create session for stateful bean MainEjbImpl]
> 	at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:157)
> 	at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
> 	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
> 	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
> 	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
> 	at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:316)
> 	... 43 more
> Caused by: java.lang.RuntimeException: WFLYEJB0423: Could not create session for stateful bean MainEjbImpl
> 	at org.jboss.as.ejb3.remote.RemoteViewManagedReferenceFactory.getReference(RemoteViewManagedReferenceFactory.java:99)
> 	at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143)
> 	... 48 more
> Caused by: java.lang.NullPointerException
> 	at org.jboss.as.ejb3.component.stateful.StatefulSessionComponent.createSession(StatefulSessionComponent.java:238)
> 	at org.jboss.as.ejb3.remote.LocalEjbReceiver.openSession(LocalEjbReceiver.java:296)
> 	at org.jboss.ejb.client.EJBClient.createSessionWithPossibleRetries(EJBClient.java:225)
> 	at org.jboss.ejb.client.EJBClient.createSession(EJBClient.java:202)
> 	at org.jboss.ejb.client.EJBClient.createSession(EJBClient.java:176)
> 	at org.jboss.as.ejb3.remote.RemoteViewManagedReferenceFactory.getReference(RemoteViewManagedReferenceFactory.java:97)
> 	... 49 more



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list