[weld-dev] ApplicationScoped event fires on service invocation
Mark Struberg
struberg at yahoo.de
Sun Aug 21 06:32:12 EDT 2016
But the ServletContextEvent is available much earlier.
I think this might rather be an integration issue.
In OWB we don't fire the @Intialized for the ApplicationContext inside the ApplicationContext implementation but as part of the integration code, means TomEE, Geronimo, SAP, etc.
The interplay and boot order between EJB @Startup @Singleton and the CDI container is imo not really well defined. We just did what we think is best. Afair that means that in TomEE we fire the @Initialized _before_ we do @Startup but _after_ all the metadata parsing and EJB and CDI Extension handling was done.
LieGrue,
strub
> On Friday, 19 August 2016, 15:37, Martin Kouba <mkouba at redhat.com> wrote:
> > Hi Benjanmin,
>
> for a web application the payload of
> @Initialized(ApplicationScoped.class) must be the relevant
> ServletContext. That's why Weld is waiting for a webapp to be ready
> (implemented as
> javax.servlet.ServletContextListener.contextInitialized(ServletContextEvent)).
>
> Martin
>
> Dne 19.8.2016 v 14:17 Benjamin Confino napsal(a):
>> We have a user scenario where we wishes to replace @Singleton @Startup
>> EJB beans with CDI beans. This was attempted by observing the
>> ApplicationScoped initialization event to trigger the replacement code.
>>
>> However, the event was fired only after the service invocation, which
>> was too late. Apparently OWB fires this event much earlier.
>> The CDI spec states:
>>
>> The /application context /is provided by a built-in context object for
>> the built-in scope type
>> @ApplicationScoped. The application scope is active:
>> • during the service() method of any servlet in the web application,
>> during the doFilter()
>> method of any servlet filter and when the container calls any
>> ServletContextListener,
>> HttpSessionListener, AsyncListener or ServletRequestListener,
>> • during any Java EE web service invocation,
>> • during any remote method invocation of any EJB, during any
>> asynchronous method invocation
>> of any EJB, during any call to an EJB timeout method and during message
>> delivery to any EJB
>> message-driven bean,
>> • when the disposer method or @PreDestroy callback of any bean with any
>> normal scope other
>> than @ApplicationScoped is called, and
>> *• during **@PostConstruct **callback of any bean.*
>>
>> The application context is shared between all servlet requests, web
>> service invocations, EJB
>> remote method invocations, EJB asynchronous method invocations, EJB
>> timeouts and message
>> deliveries to message-driven beans that execute within the same
>> application. The application
>> context is destroyed when the application is shut down.
>>
>> An event with qualifier @Initialized(ApplicationScoped.class) is fired
>> when the application
>> context is initialized and an event with qualifier
>> @Destroyed(ApplicationScoped.class) is fired
>> when the application is destroyed. The event payload is:
>> • the ServletContext if the application is a web application deployed to
>> a Servlet container, or
>> • any java.lang.Object for other types of application.
>>
>> How do you interpret "initialized"? Does it mean the event is
> fired only
>> after the context is *active?*
>>
>> Is it possible to make the event firing a bit earlier, say around
>> AfterDeploymentValidation?
>>
>> Below is the app to demonstrate the timing along with the server.xml:
>>
>>
>>
>>
>> And here is the results of running it
>>
>>
>> [AUDIT ] CWWKE0001I: The server defaultServer has been launched.
>> [AUDIT ] CWWKE0100I: This product is licensed for development, and
>> limited production use. The full license terms can be viewed here:
>>
> https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/base_ilan/ilan/16.0.0.2/lafiles/en.html
>>
>> [AUDIT ] CWWKZ0058I: Monitoring dropins for applications.
>> *---> ApplicationScopedExtension, AfterDeploymentValidation event
>> received, before looking up and touching @ApplicationScoped dummy bean*
>> *---> ApplicationScopedDummyBean, @PostConstruct init method called*
>> *---> ApplicationScopedExtension, after looking up and touching
>> @ApplicationScoped dummy bean*
>> [AUDIT ] CWWKT0016I: Web application available (default_host):
>> http://localhost:9080/70383.180.846.test-application/
>> *---> ApplicationScopedObserverBean, observed
>> @Initialized(ApplicationScoped.class) event.*
>> [AUDIT ] CWWKZ0001I: Application 70383.180.846.test-application
>> started in 1.165 seconds.
>> [AUDIT ] CWWKF0012I: The server installed the following features:
>> [jsp-2.3, ejbLite-3.2, managedBeans-1.0, jsf-2.2, beanValidation-1.1,
>> servlet-3.1, ssl-1.0, jndi-1.0, jsonp-1.0, appSecurity-2.0, jdbc-4.1,
>> jaxrs-2.0, jaxrsClient-2.0, el-3.0, json-1.0, cdi-1.2,
>> distributedMap-1.0, webProfile-7.0, websocket-1.1, jpa-2.1].
>> [AUDIT ] CWWKF0011I: The server defaultServer is ready to run a
>> smarter planet.
>>
>> As you can see, the *ApplicationScopedDummyBean, @PostConstruct init
>> method called*proves that the applicationContext was active before the
>> event was fired. Why is this applicationscoped initialization event not
>> fired earlier?
>>
>>
>> Regards
>> Benjamin
>> Unless stated otherwise above:
>> IBM United Kingdom Limited - Registered in England and Wales with number
>> 741598.
>> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
>>
>> Unless stated otherwise above:
>> IBM United Kingdom Limited - Registered in England and Wales with number
>> 741598.
>> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
>>
>>
>> _______________________________________________
>> weld-dev mailing list
>> weld-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/weld-dev
>>
>
> --
> Martin Kouba
> Software Engineer
> Red Hat, Czech Republic
>
> _______________________________________________
> weld-dev mailing list
> weld-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/weld-dev
>
More information about the weld-dev
mailing list