Why @PostConstruct is called twice on @Singleton

I am running a simple .war file under Glassfish 4.0-b87 that was created in Eclipse Kepler M6 using M2E as a simple project with the addition of an optional dynamic web module using Oracle Java 7 JDK / JVM.

There is essentially one class for which I expect the post_construct method will be called exactly once. But it is called twice, first at application deployment, and one more time at the first and only the first HTTP request.

The following is the class (log output):

 package com.example.main; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.LocalBean; import javax.ejb.PostActivate; import javax.ejb.PrePassivate; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.enterprise.inject.spi.PassivationCapable; import javax.ws.rs.ApplicationPath; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Application; @Singleton @Startup @LocalBean @ApplicationPath("/rest") @Path("/life") public class Life extends Application implements PassivationCapable { @PostConstruct public void post_construct () { System.out.println("hello world!"); } @PreDestroy public void pre_destroy () { System.out.println("so long and thanks for the fish!"); } @PrePassivate public void pre_passivate () { System.out.println("taking a break"); } @PostActivate public void post_activate () { System.out.println("back from break"); } @Override public String getId () { return "life"; } @GET public String greet () { return "hi"; } } 

The log output is as follows with a dashed line dividing the part before the first HTTP call and the part after the HTTP call:

 [2013-05-09T19:42:26.660-1000] [glassfish 4.0] [INFO] [NCLS-DEPLOYMENT-00027] [javax.enterprise.system.tools.deployment.autodeploy] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546660] [levelValue: 800] [[ Selecting file /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/singleton.war for autodeployment]] [2013-05-09T19:42:26.692-1000] [glassfish 4.0] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546692] [levelValue: 800] [[ visiting unvisited references]] [2013-05-09T19:42:26.702-1000] [glassfish 4.0] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546702] [levelValue: 800] [[ visiting unvisited references]] [2013-05-09T19:42:26.706-1000] [glassfish 4.0] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546706] [levelValue: 800] [[ visiting unvisited references]] [2013-05-09T19:42:26.709-1000] [glassfish 4.0] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546709] [levelValue: 800] [[ visiting unvisited references]] [2013-05-09T19:42:26.749-1000] [glassfish 4.0] [INFO] [ejb.portable_jndi_names] [javax.enterprise.system.container.ejb.com.sun.ejb.containers] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546749] [levelValue: 800] [[ EJB5181:Portable JNDI names for EJB Life: [java:global/singleton/Life, java:global/singleton/Life!com.example.main.Life]]] [2013-05-09T19:42:26.959-1000] [glassfish 4.0] [WARNING] [] [org.jboss.weld.Bootstrap] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546959] [levelValue: 900] [[ WELD-001473 javax.enterprise.inject.spi.Bean implementation org.glassfish.jms.injection.JMSCDIExtension$LocalBean@cbcbf4a declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.]] [2013-05-09T19:42:26.970-1000] [glassfish 4.0] [INFO] [] [] [tid: _ThreadID=59 _ThreadName=Thread-3] [timeMillis: 1368164546970] [levelValue: 800] [[ hello world!]] [2013-05-09T19:42:26.982-1000] [glassfish 4.0] [INFO] [] [org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546982] [levelValue: 800] [[ Registering the Jersey servlet application, named com.example.main.Life, at the servlet mapping /rest/*, with the Application class of the same name.]] [2013-05-09T19:42:26.988-1000] [glassfish 4.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164546988] [levelValue: 800] [[ Loading application [singleton] at [/singleton]]] [2013-05-09T19:42:27.003-1000] [glassfish 4.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164547003] [levelValue: 800] [[ singleton was successfully deployed in 332 milliseconds.]] [2013-05-09T19:42:27.006-1000] [glassfish 4.0] [INFO] [NCLS-DEPLOYMENT-00035] [javax.enterprise.system.tools.deployment.autodeploy] [tid: _ThreadID=59 _ThreadName=AutoDeployer] [timeMillis: 1368164547006] [levelValue: 800] [[ [AutoDeploy] Successfully autodeployed : /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/singleton.war.]] 

------------------------------ AFTER FIRST HTTP CALL ------------- - ---------------

 [2013-05-09T19:42:44.940-1000] [glassfish 4.0] [INFO] [] [] [tid: _ThreadID=21 _ThreadName=Thread-3] [timeMillis: 1368164564940] [levelValue: 800] [[ hello world!]] [2013-05-09T19:42:44.940-1000] [glassfish 4.0] [INFO] [] [org.glassfish.jersey.server.ApplicationHandler] [tid: _ThreadID=21 _ThreadName=http-listener-1(4)] [timeMillis: 1368164564940] [levelValue: 800] [[ Initiating Jersey application, version Jersey: 2.0-rc2 2013-04-23 12:04:25...]] [2013-05-09T19:42:44.956-1000] [glassfish 4.0] [INFO] [] [org.glassfish.jersey.gf.ejb.EjbComponentProvider] [tid: _ThreadID=21 _ThreadName=http-listener-1(4)] [timeMillis: 1368164564956] [levelValue: 800] [[ The Jersey EJB interceptor is bound. JAX-RS EJB integration support is enabled.]] 
+4
source share
1 answer

<update> this is a Glassfish bug https://java.net/jira/browse/GLASSFISH-20505 </update>

It seems that @Singleton and @ApplicationPath + extends Application do not play with each other. Perhaps the correct behavior is that JAX-RS needs to instantiate the Application class once, and EJB needs to instantiate @Singleton once, but until someone points to the corresponding part of the standards, it is best to consider it as an error. Jersey should recognize the @Singleton annotation and look for the extends Application class, and not create its own.

A workaround for a probable Jersey error is to not use the same class as @Singleton and the Jersey Application class.

+1
source

Source: https://habr.com/ru/post/1480046/


All Articles