I've added the proposed APIs to the doc.

On 29 Feb 2012, at 14:18, Gerhard Petracek wrote:

> i agree with pete.
> we can create a draft at [1].
> 
> regards,
> gerhard
> 
> [1]
> https://cwiki.apache.org/confluence/display/DeltaSpike/CDI+1.1+Proposals#CDI1.1Proposals-ContextManagement
> 
> 
> 
> 2012/2/29 Pete Muir <pm...@redhat.com>
> 
>> This just reinforces my feeling that CDIControl and context lifecycle
>> management should be two separate APIs. Context control is relevant in Java
>> EE and SE. Container start/stop is only relevant in JavaSE.
>> 
>> I would suggest that context lifecycle management should be dependent
>> scoped injectable bean(s), so that you can access it either in a CDI bean
>> or outside a CDI bean (and then control the other scopes).
>> 
>> For inspiration for the context control, we could look at Weld, which
>> defines an API for context lifecycle management. As a quick example:
>> 
>> class Foo {
>> 
>>   @Inject RequestContext requestContext;
>> 
>>   void ensureRequestContextActive() {
>>       if (!requestContext.isActive()) {
>>           requestContext.activate();
>>       }
>>   }
>> 
>>   void endRequest() {
>>       if (requestContext.isActive()) {
>>           // e.g. Make sure any conversation that have timed out are
>> cleaned up, we split this out so that we don't force people to do this, in
>> case they are just restarting the request context for some reason
>>           requestContext.invalidate();
>>           requestContext.deactivate();
>>       }
>>   }
>> 
>> }
>> 
>> The API looks like:
>> 
>> // We use an empty subclass to allow injecting by type
>> public interface RequestContext extends ManagedContext {}
>> 
>> // Context is the standard CDI SPI
>> public interface ManagedContext extends Context {
>> 
>>  /**
>>   * Activate the Context.
>>   */
>>  public void activate();
>> 
>>  /**
>>   * Deactivate the Context, destroying any instances if the context is
>> invalid.
>>   */
>>  public void deactivate();
>> 
>>  /**
>>   * Mark the context as due for destruction when deactivate is called.
>>   */
>>  public void invalidate();
>> 
>> }
>> 
>> Note that Weld mixes this lifecycle management API in with an abstraction
>> over the context backing store (allowing you to use e.g. the http session,
>> or a plain map you manage yourself, or whatever you want). I don't think we
>> necessarily need to introduce that to Deltaspike right now.
>> 
>> A requested enhancement to this API for Weld, which I think we should
>> support is the ability to inject not only built in context objects, but any
>> that the user creates. I would suggest we do this based on extending
>> ManagedContext.
>> 
>> When I wrote this, I modelled Request and Session identically (as above).
>> ApplicationContext (and SingletonContext) is not modelled as a managed
>> context, as I don't expect a user to be able to activate or deactivate it.
>> The Dependent context is also not modelled as a managed context, as it has
>> no lifecycle. I did create an interface for it, which simply extends
>> Context with no more methods, to allow consistent use of injection.
>> 
>> Conversation context is obviously the more complex one ;-) It's modelled
>> as a managed context, and adds:
>> 
>> * a method to access and mutate the parameter name used to carry the
>> conversation id (the parameter is got from the request context object). I
>> don't think we should have this in Deltaspike, as it's outside the spec by
>> a long way ;-)
>> * a method to access and mutate the concurrent access timeout *default*
>> for the app. This is useful I think, and I would assume all impls do
>> support this in some way
>> * a method to access and mutate the conversation inactivity timeout
>> *default* for the app. This is useful I think, and I would assume all impls
>> do support this in some way
>> * a method to get a list of all conversations the container knows about
>> (for this session), returns a List<ManagedConversation>, more below
>> * a method to get the conversation by ID, returns ManagedConversation
>> * a method to have the container generate a new conversation id using
>> whatever algorithm it wants
>> * a method to get the current active conversation
>> 
>> ManagedConversation is a subclass of Conversation, and adds:
>> 
>> * ability to lock and unlock the conversation (concurrent access)
>> * get the timestamp the conversation was last used
>> * "touch" which updates the last used timestamp to now
>> 
>> I'm not sure Deltaspike needs ManagedConversation.
>> 
>> You can read the full API at
>> https://github.com/weld/api/tree/master/weld/src/main/java/org/jboss/weld/context-
>>  but ignore the sub packages, and the BoundContext interface, as they
>> relate to abstracting out the backing store.
>> 
>> I think this approach would give a powerful, easy to use API for context
>> lifecycle management. It also has the benefit of ironing out the
>> differences between built in and user provided contexts, and provides a
>> model for extensions to create context lifecycle management APIs based on.
>> 
>> WDYT?
>> 
>> On 29 Feb 2012, at 07:53, Mark Struberg wrote:
>> 
>>> Hi!
>>> 
>>> Pete did ask me a few days ago if the CdiContainer is really only
>> targeted to JavaSE.
>>> Well, basically it _was_. But yesterday I reviewed the 3 Quartz
>> Extensions from Ronald, OpenKnowledge and Seam3 and when looking at the
>> first 2 I saw that
>>> 
>>> 1.) OpenKnowledge introduces an own Context named @ThreadScoped and
>> start it manually in the newly started Quartz thread.
>>> 
>>> 2.) our TISS Quartz Extension (done by Ronald) uses OWB specific code to
>> start a RequestScope for the newly started thread in which Quartz runs.
>>> 
>>> I've not looked into the Seam3 extension in detail because it does a
>> hell lot more and I'm not sure if we really need all that. A few things
>> look really good but I didn't have enough time to plug them apart.
>>> 
>>> What are the pros and cons of 1.) and 2.) so far?
>>> 1.) is CDI container independent but you must not use @RequestScoped
>> because this Context is not active in the new thread. You can use the new
>> @ThreadScoped but if you use the same @Transactional services for the
>> Quartz job and the rest of your app, then you must not use a @RequestScoped
>> EntityManager.
>>> 
>>> 
>>> 2.) Sharing the services between the Quartz job and the rest of the app
>> is perfectly fine but it's currently Container specific how the
>> @RequestScoped can get activated for a freshly created thread.
>>> 
>>> 
>>> And then Pete's words jumped into my head.
>>> 
>>> 
>>> So, what about using the CdiContainer#startContext(RequestScoped.class);
>> in that CDI Extension?
>>> That looks pretty much perfect to me!
>>> 
>>> We could also provide multiple impls, e.g for: WeldSE, WeldEE, OwbSE,
>> OwbEE, ResinEE,
>>> 
>>> Anyone could easily implement the control part himself if the standard
>> container integration doesn't work out of the box for a certain EE
>> container.
>>> If e.g. OwbEE will not work on WebSphere-8.0.2, then its easy to just
>> write an own!
>>> 
>>> 
>>> 
>>> wdyt?
>>> 
>>> LieGrue,
>>> strub
>>> 
>>> 
>>> PS: Pete we might add some kind of Context-Control to the CDI-1.1 spec,
>> wdyt?
>>> 
>> 
>> 

Reply via email to