@WebServices look up EJB's on every single http request (not only webservice
requests)
--------------------------------------------------------------------------------------
Key: SEAMFACES-55
URL:
https://jira.jboss.org/browse/SEAMFACES-55
Project: Seam Faces
Issue Type: Bug
Components: CDI Integration
Affects Versions: 3.0.0.Alpha3
Environment: Glassfish 3.0.1 on Windows 7 64 bit, 32 bit jvm (1.6.0_20)
Reporter: Anders Ã…berg
After splitting our application into frontend (JSF2) and backend (EJB3.1 remote) modules
running on different servers, performance in the application became horrible. Rendering an
empty JSF page took about 3 seconds.
It turned out that because of 3 @WebService annotated beans with remote @EJB's
injected, lots of traffic goes to the backend server on every http request (to JSF pages,
css, js etc). We don't know exactly what this traffic is, but adding breakpoints in
@PostConstruct methods in the webservices showed that they are not being instantiated.
After removing seam-faces the problems went away. And if we annotate the webservices with
@Stateless they also went away. So we have a workaround, but would like to know if this
issue could affect other areas as well. Performance is still sub par.
More info here:
http://seamframework.org/Community/SeamFaces300Alpha3WeirdButSeriousPerfo...
I have created some webapps to reproduce the problems:
faces-server: webapp with a remote ejb EchoService
faces-client: webapp with an empty jsf page (meaning just plain text) and an
EchoWebService that injects EchoService using @EJB
faces-client-seamfaces: identical to the one above but with seam-faces-3.0.0.Alpha3 in
WEB-INF/lib. And different name obviously.
Steps to reproduce problem (on Glassfish 3.0.1 at least):
- Deploy faces-server first, and then both faces-client and faces-client-seamfaces.
- Open /faces-client/empty.xhtml and /faces-client-seamfaces/empty.xhtml. Rendering the
first one takes about 4-6ms, the second one takes 60-80ms.
- Undeploy faces-server and try to reload the pages. The first one still works, the second
one gives an exception:
[#|2010-10-22T10:04:35.241+0200|WARNING|glassfish3.0.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=26;_ThreadName=Thread-1;|StandardWrapperValve[Faces
Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: Could not wrap ExternalContext
at
org.jboss.seam.faces.environment.SeamExternalContextFactory.getExternalContext(SeamExternalContextFactory.java:35)
at
com.sun.faces.context.InjectionExternalContextFactory.getExternalContext(InjectionExternalContextFactory.java:109)
at
com.sun.faces.context.FacesContextFactoryImpl.getFacesContext(FacesContextFactoryImpl.java:93)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:302)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at
com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session
into class org.jboss.seam.faces.environment.SeamExternalContext
at
org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:133)
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:47)
at
org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget$1.work(ManagedBean.java:171)
at org.jboss.weld.bean.ManagedBean$FixInjectionPoint.run(ManagedBean.java:142)
at
org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.inject(ManagedBean.java:165)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:332)
at org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112)
at
org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:143)
at
org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
at
org.jboss.seam.faces.environment.SeamExternalContext_$$_javassist_21.setWrapped(SeamExternalContext_$$_javassist_21.java)
at
org.jboss.seam.faces.environment.SeamExternalContextFactory.getExternalContext(SeamExternalContextFactory.java:29)
... 27 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception
attempting to inject Remote ejb-ref name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session
into class org.jboss.seam.faces.environment.SeamExternalContext
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:614)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:384)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:168)
at
org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:126)
... 38 more
Caused by: javax.naming.NamingException: Lookup failed for
'java:comp/env/EchoService' in SerialContext [Root exception is
javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session'
. Actual (possibly internal) Remote JNDI name used for lookup is
'com.example.EchoService#com.example.EchoService' [Root exception is
javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:513)
... 41 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session'
. Actual (possibly internal) Remote JNDI name used for lookup is
'com.example.EchoService#com.example.EchoService' [Root exception is
javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]]
at
com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:174)
at
com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1040)
at
com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:688)
at
com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:657)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:148)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:428)
... 43 more
Caused by: javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at
com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:169)
... 48 more
Caused by: javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found
at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:197)
at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:168)
at
com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:58)
at
com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:101)
at
com.sun.enterprise.naming.interprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
... 50 more
|#]
[#|2010-10-22T10:04:35.241+0200|WARNING|glassfish3.0.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=26;_ThreadName=http-thread-pool-18080-(1);|StandardWrapperValve[Faces
Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: Could not wrap ExternalContext
at
org.jboss.seam.faces.environment.SeamExternalContextFactory.getExternalContext(SeamExternalContextFactory.java:35)
at
com.sun.faces.context.InjectionExternalContextFactory.getExternalContext(InjectionExternalContextFactory.java:109)
at
com.sun.faces.context.FacesContextFactoryImpl.getFacesContext(FacesContextFactoryImpl.java:93)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:302)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at
com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session
into class org.jboss.seam.faces.environment.SeamExternalContext
at
org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:133)
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:47)
at
org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget$1.work(ManagedBean.java:171)
at org.jboss.weld.bean.ManagedBean$FixInjectionPoint.run(ManagedBean.java:142)
at
org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.inject(ManagedBean.java:165)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:332)
at org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112)
at
org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:143)
at
org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
at
org.jboss.seam.faces.environment.SeamExternalContext_$$_javassist_21.setWrapped(SeamExternalContext_$$_javassist_21.java)
at
org.jboss.seam.faces.environment.SeamExternalContextFactory.getExternalContext(SeamExternalContextFactory.java:29)
... 27 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception
attempting to inject Remote ejb-ref name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session
into class org.jboss.seam.faces.environment.SeamExternalContext
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:614)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:384)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:168)
at
org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:126)
... 38 more
Caused by: javax.naming.NamingException: Lookup failed for
'java:comp/env/EchoService' in SerialContext [Root exception is
javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session'
. Actual (possibly internal) Remote JNDI name used for lookup is
'com.example.EchoService#com.example.EchoService' [Root exception is
javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at
com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:513)
... 41 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref
name=EchoService,Remote 3.x interface
=com.example.EchoService,ejb-link=null,lookup=null,mappedName=,jndi-name=com.example.EchoService,refType=Session'
. Actual (possibly internal) Remote JNDI name used for lookup is
'com.example.EchoService#com.example.EchoService' [Root exception is
javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]]
at
com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:174)
at
com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1040)
at
com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:688)
at
com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:657)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:148)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:428)
... 43 more
Caused by: javax.naming.NamingException: Lookup failed for
'com.example.EchoService#com.example.EchoService' in SerialContext [Root
exception is javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at
com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:169)
... 48 more
Caused by: javax.naming.NameNotFoundException:
com.example.EchoService#com.example.EchoService not found
at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:197)
at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:168)
at
com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:58)
at
com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:101)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
... 50 more
|#]
mpl.SerialContext.lookup(SerialContext.java:430)
... 50 more
|#]
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira