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 >>>>> >>>>> >>>>> >>>>> >>>>> >>> >> >

