Hi,

Ok thanks for the interest shown, I can only connect tonight to the
IRC. Will see if you are there then.

Thanks
Pieter

On 8/3/11, Gerhard Petracek <[email protected]> wrote:
> 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