hi pieter,

since it's quite different from the classical approach and it depends on the
concrete usage, i would suggest that we talk about it in our irc channel
(afterwards we post the solution).

regards,
gerhard

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces



2011/8/3 Gerhard Petracek <[email protected]>

> hi pieter,
>
> ok - in this case that won't work (that's a logical cycle).
> i thought more about a producer which creates a dependent scoped
> transaction. however, as i see that won't help you in this special case.
> imo something like a lazy transaction should work. i'll think about it and
> create a demo.
>
> regards,
> gerhard
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>
>
>
> 2011/8/3 Pieter Martin <[email protected]>
>
>> Hi,
>>
>> The code below does have a producer for the transaction. But it threw an
>> exception.
>> I changed the code slightly now but am still getting the same exception.
>>
>>
>> public class ConversationListener {
>>
>>    @ApplicationScopedDb
>>    @Inject
>>    NakedGraph db;
>>
>>    @ConversationScoped
>>    @Produces
>>    public Transaction getTransaction() {
>>        db.setTransactionMode(Mode.**MANUAL);
>>        db.startTransaction();
>>        return db.getTransaction();
>>    }
>>
>>    public void onStartConversation(@Observes StartConversationEvent event,
>> Transaction t) {
>>        System.out.println(t);
>>
>>    }
>>
>>    public void onCloseConversation(@Observes CloseConversationEvent event)
>> {
>>        db.stopTransaction(Conclusion.**SUCCESS);
>>    }
>>
>> }
>>
>> The StartConversationEvent is fired but the transaction parameter can not
>> be resolved. Getting the following exception
>>
>>
>> Caused by: java.lang.NullPointerException
>>    at org.apache.myfaces.extensions.**cdi.core.impl.scope.**conversation.
>> **ConversationContextAdapter.**get(**ConversationContextAdapter.**
>> java:100)
>>    at org.apache.webbeans.context.**CustomContextImpl.get(**
>> CustomContextImpl.java:48)
>>    at org.apache.webbeans.context.**CustomPassivatingContextImpl.**get(**
>> CustomPassivatingContextImpl.**java:47)
>>    at org.apache.webbeans.intercept.**NormalScopedBeanInterceptorHan**
>> dler.getContextualInstance(**NormalScopedBeanInterceptorHan**
>> dler.java:127)
>>    at org.apache.webbeans.intercept.**NormalScopedBeanInterceptorHan**
>> dler.invoke(**NormalScopedBeanInterceptorHan**dler.java:95)
>>    at org.javassist.tmp.java.lang.**Object_$$_javassist_26.**
>> toString(Object_$$_javassist_**26.java)
>>    at java.lang.String.valueOf(**String.java:2838)
>>    at java.io.PrintStream.println(**PrintStream.java:788)
>>    at org.nakeduml.environment.**ConversationListener.**
>> onStartConversation(**ConversationListener.java:38)
>>
>> Not sure why the producer method can not be called. Is the producer method
>> incorrect, does it need a qualifier?
>>
>> Thanks
>> Pieter
>>
>>
>> On 02/08/2011 21:19, Gerhard Petracek wrote:
>>
>>> hi pieter,
>>>
>>> the concept of outjection is deprecated.
>>>
>>> you could create a producer method for the transaction.
>>> if you need the transaction in an observer, you just have to add it as
>>> additional parameter and the produced transaction will be injected into
>>> the
>>> observer method by cdi.
>>>
>>> regards,
>>> gerhard
>>>
>>> http://www.irian.at
>>>
>>> Your JSF powerhouse -
>>> JSF Consulting, Development and
>>> Courses in English and German
>>>
>>> Professional Support for Apache MyFaces
>>>
>>>
>>>
>>>
>>> 2011/8/2 Pieter Martin<[email protected]**>
>>>
>>>  Hi,
>>>>
>>>> I have the following requirement / problem.
>>>>
>>>> I would like to implement a long running transaction that is in sync
>>>> with a
>>>> conversation. I.e. I want to start a transaction when the conversation
>>>> starts and commit the transaction when the conversation ends.
>>>>
>>>> So the transaction will be suspended and resumed in between requests.
>>>>
>>>> So far I am able to observe the StartConversationEvent and start a
>>>> transaction. But I do not know how then to make sure that the
>>>> transaction
>>>> will be available in the conversation context.
>>>>
>>>> The code is as follows.
>>>>
>>>> @RequestScoped
>>>> public class ConversationListener {
>>>>
>>>>    @ApplicationScopedDb
>>>>    @Inject
>>>>    NakedGraph db;
>>>>    Transaction transaction;
>>>>
>>>>    @ConversationScoped
>>>>    @Produces
>>>>    public Transaction getTransaction() {
>>>>        return this.transaction;
>>>>    }
>>>>
>>>>    public void onStartConversation(@Observes StartConversationEvent
>>>> event)
>>>> {
>>>>        db.startTransaction();
>>>>        transaction = db.getTransaction();
>>>>        // Force producer to be called, to plonk the transaction in the
>>>>        // conversation
>>>>        // Like seam 2 outjection
>>>>        Transaction t = getInstance(Transaction.class)****;
>>>>        //This throws a NullPointerException
>>>>        t.toString();
>>>>    }
>>>>
>>>>    public void onCloseConversation(@Observes CloseConversationEvent
>>>> event)
>>>> {
>>>>        //The faces listener would have made sure the correct transaction
>>>> is
>>>> associated with this thread
>>>>        db.stopTransaction(Conclusion.****SUCCESS);
>>>>    }
>>>>
>>>>    public<T>  T getInstance(Class<T>  type, Annotation... qualifiers) {
>>>>        BeanManager beanManager = getBeanManager();
>>>>        Bean<T>  bean = (Bean<T>) beanManager.resolve(****
>>>> beanManager.getBeans(type,
>>>> qualifiers));
>>>>        CreationalContext<?>  ctx = beanManager.**
>>>> createCreationalContext(bean);
>>>>        return (T) beanManager.getReference(bean, type, ctx);
>>>>    }
>>>>
>>>>    private BeanManager getBeanManager() {
>>>>        return BeanManagerProvider.****getInstance().getBeanManager()**
>>>> **;
>>>>    }
>>>>
>>>> }
>>>>
>>>> The above code does not work, it throws the following exception
>>>>
>>>> Caused by: java.lang.NullPointerException
>>>>    at org.apache.myfaces.extensions.****cdi.core.impl.scope.****
>>>> conversation.*
>>>> *ConversationContextAdapter.****get(****ConversationContextAdapter.****
>>>> java:100)
>>>>    at org.apache.webbeans.context.****CustomContextImpl.get(**
>>>> CustomContextImpl.java:48)
>>>>    at org.apache.webbeans.context.****CustomPassivatingContextImpl.***
>>>> *get(**
>>>> CustomPassivatingContextImpl.****java:47)
>>>>    at org.apache.webbeans.intercept.******
>>>> NormalScopedBeanInterceptorHan****
>>>> dler.getContextualInstance(****NormalScopedBeanInterceptorHan****
>>>> dler.java:127)
>>>>    at org.apache.webbeans.intercept.******
>>>> NormalScopedBeanInterceptorHan****
>>>> dler.invoke(****NormalScopedBeanInterceptorHan****dler.java:95)
>>>>
>>>>    at org.javassist.tmp.java.lang.****Object_$$_javassist_26.**
>>>> toString(Object_$$_javassist_****26.java)
>>>>
>>>> If this were to work the idea is then to suspend and resume the code in
>>>> faces listeners
>>>>
>>>> @RequestScoped
>>>> public class FacesListener {
>>>>    @ApplicationScopedDb
>>>>    @Inject
>>>>    NakedGraph db;
>>>>    @Inject
>>>>    Logger logger;
>>>>
>>>>    public void beforeFacesRequest(@Observes @BeforeFacesRequest
>>>> FacesContext ctx) {
>>>>        logger.fine("****beforeFacesRequest, setting db on thread");
>>>>        GraphDb.setDb(db);
>>>>        //Need to check here somehow if a conversation has been started
>>>> or
>>>> not.
>>>>        Transaction t = CdiEnvironment.getInstance().****
>>>> getComponent(Transaction.****class);
>>>>        db.resume(t);
>>>>    }
>>>>
>>>>    public void afterFacesRequest(@Observes @AfterFacesRequest
>>>> FacesContext
>>>> ctx) {
>>>>        logger.fine("****afterFacesRequest, suspend transaction and
>>>> removing
>>>> db from thread");
>>>>        Transaction t = db.suspend();
>>>>        //Do not need to anything with this transaction as it is already
>>>> in
>>>> the conversation context
>>>>        GraphDb.remove();
>>>>    }
>>>>
>>>> }
>>>>
>>>> Hope it makes sense.
>>>> Is there a (better) way to do this?
>>>>
>>>> Thanks
>>>> Pieter
>>>>
>>>>
>>>>
>>>>
>>>>
>>
>

Reply via email to