You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hivemind.apache.org by Kaspar Fischer <fi...@inf.ethz.ch> on 2007/12/05 13:32:09 UTC

Using Hivemind to wrap a transaction around a request

[Note: This is a cross-post; I have initially posted to the list
users@tapestry.apache.org but I guess the issue is more related to  
hivemind,
so I post here.]

Hi list,

I need to wrap "begin transaction" and "end transaction" actions around
a task (a Tapestry web request, actually). I've read about Hivemind,

   http://www.nabble.com/hivemind-factory-service-tf251931.html#a704856

and configured a service point (see below). This works very well: my
transaction is created, but I cannot see when it is ended (committed/
rolled back).

More precisely, I am struggling with:

* What method is called on the object created by the factory when it
   is discarded? It is threadDidDiscardService(), right?

* How can I catch exceptions from my actual task so that I can do a  
rollback
  instead of a commit?

I am new to Hivemind, so please excuse these rather simple questions.

Many thanks for you patience!
Kaspar

-- 
Here's my configuration:

  <service-point  
interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"  
id="alfrescoContext">
   <invoke-factory service-id="AlfrescoTransactionFactory"  
model="threaded" />
  </service-point>
  <service-point  
interface="org.apache.hivemind.ServiceImplementationFactory"  
id="AlfrescoTransactionFactory" parameters-occurs="none">
   <create-instance  
class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
  </service-point>

Here is my factory:

public class AlfrescoTransactionFactory implements  
ServiceImplementationFactory, Discardable {

   public Object createCoreServiceImplementation 
(ServiceImplementationFactoryParameters factoryParameters)
   {
     System.err.println("createCoreServiceImplementation"); // gets  
called!
     UserTransaction transaction;
     ServiceRegistry serviceRegistry;
     try {
       transaction =  
AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction 
(true);
       serviceRegistry =  
AlfrescoApplicationInitializer.getServiceRegistry();
     }
     catch (Exception e) {
       throw new ApplicationRuntimeException("Could not create an  
Alfresco transactoin.", e);
     }
     return new AlfrescoTransactionContextImpl(transaction,  
serviceRegistry);
   }

   public void threadDidDiscardService()
   {
     System.err.println("threadDidDiscardService"); // never called!
     // ... end the transaction here (todo)
   }
}

Re: Using Hivemind to wrap a transaction around a request

Posted by James Carman <ja...@carmanconsulting.com>.
By the way, you can login using anonymous/anon.

On 12/11/07, James Carman <ja...@carmanconsulting.com> wrote:
> You might also want to take a look at some of the HiveMind-based
> projects at JavaForge.  In particular, look at:
>
> http://svn.javaforge.com/svn/hivemind/hivemind-transaction
> http://svn.javaforge.com/svn/hivemind/hivemind-hibernate3
>
> Those two projects basically set up the Spring transaction/hibernate
> support for you in HiveMind.  I wrote those two projects after my
> article.
>
> On 12/11/07, Alebu <al...@gmail.com> wrote:
> > Hi Kaspar,
> > There is a tutorial on TSS about Hivemind by James Carman.
> > http://www.theserverside.com/tt/articles/article.tss?l=HivemindBuzz
> > And as example of interceptor there is a TransactionInterceptor.
> > Perhaps it can help you to start your own solution.
> > And dont be shy to ask help in mailing list. Hivemind is a great product
> > but lack of
> > documentation is most is thing about it, so others people help is very
> > important.
> >
> > Kaspar Fischer wrote:
> > > Dear Jean-François,
> > >
> > > Thank you for your email. I think I get the basic idea of what you are
> > > saying:
> > > Tell Hivemind to put the "begin()" and "commit()" around the relevant
> > > methods
> > > of Tapestry (and make it call "rollback()" on uncaught exceptions). Is
> > > this
> > > correct, so far?
> > >
> > > One first uncertainty in this is what Tapestry method I should intercept?
> > > It can't be around a single page-request as redirecting, rewinding,
> > > etc. won't
> > > work then. Do you happen to know what might be the right method?
> > >
> > > I've taken a look at HiveTranse and understand parts of it. However, I do
> > > not know where to start -- obviously, I need to inject my own "begin()"
> > > and "commit()" as I am neither running Hibernate, not JDBC, etc.
> > > directly.
> > >
> > > Could you maybe provide a few directions on how to write my HiveMind
> > > interceptor?
> > > Maybe it's easier without HiveTranse first?
> > >
> > > I am sorry if my questions are very basic, and I imagine it's probably
> > > boring
> > > for you. I can promise that I will post a solution to the tapestry
> > > list and
> > > also extend the article I've written at the Alfresco Wiki:
> > >
> > >
> > > http://wiki.alfresco.com/wiki/Alfresco_and_Tapestry_on_the_Same_Tomcat_Installation
> > >
> > >
> > > With this, you're help will hopefully not just help me but others as
> > > well.
> > >
> > > Best,
> > > Kaspar
> > >
> > > On 05.12.2007, at 14:09, Jean-Francois Poilpret wrote:
> > >
> > >> Hi Kaspar,
> > >>
> > >> I think you'd rather take a look at HiveMind interceptors rather than
> > >> factories.
> > >> You can create an Interceptor that will be called before and after any
> > >> method of another service.
> > >> There are several ways to create interceptors in HiveMind, take a
> > >> look at
> > >> HiveMind website to see simple examples.
> > >>
> > >> If you want to see a real-life implementation of such a system you
> > >> may take
> > >> a look at hivetranse (http://hivetranse.sourceforge.net) which
> > >> implements
> > >> the same kind of behavior as you are looking for. I think you could
> > >> quite
> > >> easily adapt one of the numerous hivetranse interceptors (choose one
> > >> -the
> > >> simples- as an example).
> > >>
> > >> Cheers
> > >>
> > >> Jean-Francois
> > >>
> > >> -----Original Message-----
> > >> From: Kaspar Fischer [mailto:fischerk@inf.ethz.ch]
> > >> Sent: Wednesday, December 05, 2007 7:32 PM
> > >> To: user@hivemind.apache.org
> > >> Subject: Using Hivemind to wrap a transaction around a request
> > >>
> > >> [Note: This is a cross-post; I have initially posted to the list
> > >> users@tapestry.apache.org but I guess the issue is more related to
> > >> hivemind,
> > >> so I post here.]
> > >>
> > >> Hi list,
> > >>
> > >> I need to wrap "begin transaction" and "end transaction" actions around
> > >> a task (a Tapestry web request, actually). I've read about Hivemind,
> > >>
> > >>    http://www.nabble.com/hivemind-factory-service-tf251931.html#a704856
> > >>
> > >> and configured a service point (see below). This works very well: my
> > >> transaction is created, but I cannot see when it is ended (committed/
> > >> rolled back).
> > >>
> > >> More precisely, I am struggling with:
> > >>
> > >> * What method is called on the object created by the factory when it
> > >>    is discarded? It is threadDidDiscardService(), right?
> > >>
> > >> * How can I catch exceptions from my actual task so that I can do a
> > >> rollback
> > >>   instead of a commit?
> > >>
> > >> I am new to Hivemind, so please excuse these rather simple questions.
> > >>
> > >> Many thanks for you patience!
> > >> Kaspar
> > >>
> > >> --
> > >> Here's my configuration:
> > >>
> > >>   <service-point
> > >> interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"
> > >> id="alfrescoContext">
> > >>    <invoke-factory service-id="AlfrescoTransactionFactory"
> > >> model="threaded" />
> > >>   </service-point>
> > >>   <service-point
> > >> interface="org.apache.hivemind.ServiceImplementationFactory"
> > >> id="AlfrescoTransactionFactory" parameters-occurs="none">
> > >>    <create-instance
> > >> class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
> > >>   </service-point>
> > >>
> > >> Here is my factory:
> > >>
> > >> public class AlfrescoTransactionFactory implements
> > >> ServiceImplementationFactory, Discardable {
> > >>
> > >>    public Object createCoreServiceImplementation
> > >> (ServiceImplementationFactoryParameters factoryParameters)
> > >>    {
> > >>      System.err.println("createCoreServiceImplementation"); // gets
> > >> called!
> > >>      UserTransaction transaction;
> > >>      ServiceRegistry serviceRegistry;
> > >>      try {
> > >>        transaction =
> > >> AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction
> > >> (true);
> > >>        serviceRegistry =
> > >> AlfrescoApplicationInitializer.getServiceRegistry();
> > >>      }
> > >>      catch (Exception e) {
> > >>        throw new ApplicationRuntimeException("Could not create an
> > >> Alfresco transactoin.", e);
> > >>      }
> > >>      return new AlfrescoTransactionContextImpl(transaction,
> > >> serviceRegistry);
> > >>    }
> > >>
> > >>    public void threadDidDiscardService()
> > >>    {
> > >>      System.err.println("threadDidDiscardService"); // never called!
> > >>      // ... end the transaction here (todo)
> > >>    }
> > >> }
> > >>
> > >
> > >
> >
> >
>

Re: Using Hivemind to wrap a transaction around a request

Posted by James Carman <ja...@carmanconsulting.com>.
You might also want to take a look at some of the HiveMind-based
projects at JavaForge.  In particular, look at:

http://svn.javaforge.com/svn/hivemind/hivemind-transaction
http://svn.javaforge.com/svn/hivemind/hivemind-hibernate3

Those two projects basically set up the Spring transaction/hibernate
support for you in HiveMind.  I wrote those two projects after my
article.

On 12/11/07, Alebu <al...@gmail.com> wrote:
> Hi Kaspar,
> There is a tutorial on TSS about Hivemind by James Carman.
> http://www.theserverside.com/tt/articles/article.tss?l=HivemindBuzz
> And as example of interceptor there is a TransactionInterceptor.
> Perhaps it can help you to start your own solution.
> And dont be shy to ask help in mailing list. Hivemind is a great product
> but lack of
> documentation is most is thing about it, so others people help is very
> important.
>
> Kaspar Fischer wrote:
> > Dear Jean-François,
> >
> > Thank you for your email. I think I get the basic idea of what you are
> > saying:
> > Tell Hivemind to put the "begin()" and "commit()" around the relevant
> > methods
> > of Tapestry (and make it call "rollback()" on uncaught exceptions). Is
> > this
> > correct, so far?
> >
> > One first uncertainty in this is what Tapestry method I should intercept?
> > It can't be around a single page-request as redirecting, rewinding,
> > etc. won't
> > work then. Do you happen to know what might be the right method?
> >
> > I've taken a look at HiveTranse and understand parts of it. However, I do
> > not know where to start -- obviously, I need to inject my own "begin()"
> > and "commit()" as I am neither running Hibernate, not JDBC, etc.
> > directly.
> >
> > Could you maybe provide a few directions on how to write my HiveMind
> > interceptor?
> > Maybe it's easier without HiveTranse first?
> >
> > I am sorry if my questions are very basic, and I imagine it's probably
> > boring
> > for you. I can promise that I will post a solution to the tapestry
> > list and
> > also extend the article I've written at the Alfresco Wiki:
> >
> >
> > http://wiki.alfresco.com/wiki/Alfresco_and_Tapestry_on_the_Same_Tomcat_Installation
> >
> >
> > With this, you're help will hopefully not just help me but others as
> > well.
> >
> > Best,
> > Kaspar
> >
> > On 05.12.2007, at 14:09, Jean-Francois Poilpret wrote:
> >
> >> Hi Kaspar,
> >>
> >> I think you'd rather take a look at HiveMind interceptors rather than
> >> factories.
> >> You can create an Interceptor that will be called before and after any
> >> method of another service.
> >> There are several ways to create interceptors in HiveMind, take a
> >> look at
> >> HiveMind website to see simple examples.
> >>
> >> If you want to see a real-life implementation of such a system you
> >> may take
> >> a look at hivetranse (http://hivetranse.sourceforge.net) which
> >> implements
> >> the same kind of behavior as you are looking for. I think you could
> >> quite
> >> easily adapt one of the numerous hivetranse interceptors (choose one
> >> -the
> >> simples- as an example).
> >>
> >> Cheers
> >>
> >> Jean-Francois
> >>
> >> -----Original Message-----
> >> From: Kaspar Fischer [mailto:fischerk@inf.ethz.ch]
> >> Sent: Wednesday, December 05, 2007 7:32 PM
> >> To: user@hivemind.apache.org
> >> Subject: Using Hivemind to wrap a transaction around a request
> >>
> >> [Note: This is a cross-post; I have initially posted to the list
> >> users@tapestry.apache.org but I guess the issue is more related to
> >> hivemind,
> >> so I post here.]
> >>
> >> Hi list,
> >>
> >> I need to wrap "begin transaction" and "end transaction" actions around
> >> a task (a Tapestry web request, actually). I've read about Hivemind,
> >>
> >>    http://www.nabble.com/hivemind-factory-service-tf251931.html#a704856
> >>
> >> and configured a service point (see below). This works very well: my
> >> transaction is created, but I cannot see when it is ended (committed/
> >> rolled back).
> >>
> >> More precisely, I am struggling with:
> >>
> >> * What method is called on the object created by the factory when it
> >>    is discarded? It is threadDidDiscardService(), right?
> >>
> >> * How can I catch exceptions from my actual task so that I can do a
> >> rollback
> >>   instead of a commit?
> >>
> >> I am new to Hivemind, so please excuse these rather simple questions.
> >>
> >> Many thanks for you patience!
> >> Kaspar
> >>
> >> --
> >> Here's my configuration:
> >>
> >>   <service-point
> >> interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"
> >> id="alfrescoContext">
> >>    <invoke-factory service-id="AlfrescoTransactionFactory"
> >> model="threaded" />
> >>   </service-point>
> >>   <service-point
> >> interface="org.apache.hivemind.ServiceImplementationFactory"
> >> id="AlfrescoTransactionFactory" parameters-occurs="none">
> >>    <create-instance
> >> class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
> >>   </service-point>
> >>
> >> Here is my factory:
> >>
> >> public class AlfrescoTransactionFactory implements
> >> ServiceImplementationFactory, Discardable {
> >>
> >>    public Object createCoreServiceImplementation
> >> (ServiceImplementationFactoryParameters factoryParameters)
> >>    {
> >>      System.err.println("createCoreServiceImplementation"); // gets
> >> called!
> >>      UserTransaction transaction;
> >>      ServiceRegistry serviceRegistry;
> >>      try {
> >>        transaction =
> >> AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction
> >> (true);
> >>        serviceRegistry =
> >> AlfrescoApplicationInitializer.getServiceRegistry();
> >>      }
> >>      catch (Exception e) {
> >>        throw new ApplicationRuntimeException("Could not create an
> >> Alfresco transactoin.", e);
> >>      }
> >>      return new AlfrescoTransactionContextImpl(transaction,
> >> serviceRegistry);
> >>    }
> >>
> >>    public void threadDidDiscardService()
> >>    {
> >>      System.err.println("threadDidDiscardService"); // never called!
> >>      // ... end the transaction here (todo)
> >>    }
> >> }
> >>
> >
> >
>
>

Re: Using Hivemind to wrap a transaction around a request

Posted by Alebu <al...@gmail.com>.
Hi Kaspar,
There is a tutorial on TSS about Hivemind by James Carman.
http://www.theserverside.com/tt/articles/article.tss?l=HivemindBuzz
And as example of interceptor there is a TransactionInterceptor.
Perhaps it can help you to start your own solution.
And dont be shy to ask help in mailing list. Hivemind is a great product 
but lack of
documentation is most is thing about it, so others people help is very 
important.

Kaspar Fischer wrote:
> Dear Jean-François,
>
> Thank you for your email. I think I get the basic idea of what you are 
> saying:
> Tell Hivemind to put the "begin()" and "commit()" around the relevant 
> methods
> of Tapestry (and make it call "rollback()" on uncaught exceptions). Is 
> this
> correct, so far?
>
> One first uncertainty in this is what Tapestry method I should intercept?
> It can't be around a single page-request as redirecting, rewinding, 
> etc. won't
> work then. Do you happen to know what might be the right method?
>
> I've taken a look at HiveTranse and understand parts of it. However, I do
> not know where to start -- obviously, I need to inject my own "begin()"
> and "commit()" as I am neither running Hibernate, not JDBC, etc. 
> directly.
>
> Could you maybe provide a few directions on how to write my HiveMind 
> interceptor?
> Maybe it's easier without HiveTranse first?
>
> I am sorry if my questions are very basic, and I imagine it's probably 
> boring
> for you. I can promise that I will post a solution to the tapestry 
> list and
> also extend the article I've written at the Alfresco Wiki:
>
>   
> http://wiki.alfresco.com/wiki/Alfresco_and_Tapestry_on_the_Same_Tomcat_Installation 
>
>
> With this, you're help will hopefully not just help me but others as 
> well.
>
> Best,
> Kaspar
>
> On 05.12.2007, at 14:09, Jean-Francois Poilpret wrote:
>
>> Hi Kaspar,
>>
>> I think you'd rather take a look at HiveMind interceptors rather than
>> factories.
>> You can create an Interceptor that will be called before and after any
>> method of another service.
>> There are several ways to create interceptors in HiveMind, take a 
>> look at
>> HiveMind website to see simple examples.
>>
>> If you want to see a real-life implementation of such a system you 
>> may take
>> a look at hivetranse (http://hivetranse.sourceforge.net) which 
>> implements
>> the same kind of behavior as you are looking for. I think you could 
>> quite
>> easily adapt one of the numerous hivetranse interceptors (choose one 
>> -the
>> simples- as an example).
>>
>> Cheers
>>
>> Jean-Francois
>>
>> -----Original Message-----
>> From: Kaspar Fischer [mailto:fischerk@inf.ethz.ch]
>> Sent: Wednesday, December 05, 2007 7:32 PM
>> To: user@hivemind.apache.org
>> Subject: Using Hivemind to wrap a transaction around a request
>>
>> [Note: This is a cross-post; I have initially posted to the list
>> users@tapestry.apache.org but I guess the issue is more related to
>> hivemind,
>> so I post here.]
>>
>> Hi list,
>>
>> I need to wrap "begin transaction" and "end transaction" actions around
>> a task (a Tapestry web request, actually). I've read about Hivemind,
>>
>>    http://www.nabble.com/hivemind-factory-service-tf251931.html#a704856
>>
>> and configured a service point (see below). This works very well: my
>> transaction is created, but I cannot see when it is ended (committed/
>> rolled back).
>>
>> More precisely, I am struggling with:
>>
>> * What method is called on the object created by the factory when it
>>    is discarded? It is threadDidDiscardService(), right?
>>
>> * How can I catch exceptions from my actual task so that I can do a
>> rollback
>>   instead of a commit?
>>
>> I am new to Hivemind, so please excuse these rather simple questions.
>>
>> Many thanks for you patience!
>> Kaspar
>>
>> -- 
>> Here's my configuration:
>>
>>   <service-point
>> interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"
>> id="alfrescoContext">
>>    <invoke-factory service-id="AlfrescoTransactionFactory"
>> model="threaded" />
>>   </service-point>
>>   <service-point
>> interface="org.apache.hivemind.ServiceImplementationFactory"
>> id="AlfrescoTransactionFactory" parameters-occurs="none">
>>    <create-instance
>> class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
>>   </service-point>
>>
>> Here is my factory:
>>
>> public class AlfrescoTransactionFactory implements
>> ServiceImplementationFactory, Discardable {
>>
>>    public Object createCoreServiceImplementation
>> (ServiceImplementationFactoryParameters factoryParameters)
>>    {
>>      System.err.println("createCoreServiceImplementation"); // gets
>> called!
>>      UserTransaction transaction;
>>      ServiceRegistry serviceRegistry;
>>      try {
>>        transaction =
>> AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction
>> (true);
>>        serviceRegistry =
>> AlfrescoApplicationInitializer.getServiceRegistry();
>>      }
>>      catch (Exception e) {
>>        throw new ApplicationRuntimeException("Could not create an
>> Alfresco transactoin.", e);
>>      }
>>      return new AlfrescoTransactionContextImpl(transaction,
>> serviceRegistry);
>>    }
>>
>>    public void threadDidDiscardService()
>>    {
>>      System.err.println("threadDidDiscardService"); // never called!
>>      // ... end the transaction here (todo)
>>    }
>> }
>>
>
>


Re: Using Hivemind to wrap a transaction around a request

Posted by Kaspar Fischer <fi...@inf.ethz.ch>.
Dear Jean-François,

Thank you for your email. I think I get the basic idea of what you  
are saying:
Tell Hivemind to put the "begin()" and "commit()" around the relevant  
methods
of Tapestry (and make it call "rollback()" on uncaught exceptions).  
Is this
correct, so far?

One first uncertainty in this is what Tapestry method I should  
intercept?
It can't be around a single page-request as redirecting, rewinding,  
etc. won't
work then. Do you happen to know what might be the right method?

I've taken a look at HiveTranse and understand parts of it. However,  
I do
not know where to start -- obviously, I need to inject my own "begin()"
and "commit()" as I am neither running Hibernate, not JDBC, etc.  
directly.

Could you maybe provide a few directions on how to write my HiveMind  
interceptor?
Maybe it's easier without HiveTranse first?

I am sorry if my questions are very basic, and I imagine it's  
probably boring
for you. I can promise that I will post a solution to the tapestry  
list and
also extend the article I've written at the Alfresco Wiki:

   http://wiki.alfresco.com/wiki/ 
Alfresco_and_Tapestry_on_the_Same_Tomcat_Installation

With this, you're help will hopefully not just help me but others as  
well.

Best,
Kaspar

On 05.12.2007, at 14:09, Jean-Francois Poilpret wrote:

> Hi Kaspar,
>
> I think you'd rather take a look at HiveMind interceptors rather than
> factories.
> You can create an Interceptor that will be called before and after any
> method of another service.
> There are several ways to create interceptors in HiveMind, take a  
> look at
> HiveMind website to see simple examples.
>
> If you want to see a real-life implementation of such a system you  
> may take
> a look at hivetranse (http://hivetranse.sourceforge.net) which  
> implements
> the same kind of behavior as you are looking for. I think you could  
> quite
> easily adapt one of the numerous hivetranse interceptors (choose  
> one -the
> simples- as an example).
>
> Cheers
>
> Jean-Francois
>
> -----Original Message-----
> From: Kaspar Fischer [mailto:fischerk@inf.ethz.ch]
> Sent: Wednesday, December 05, 2007 7:32 PM
> To: user@hivemind.apache.org
> Subject: Using Hivemind to wrap a transaction around a request
>
> [Note: This is a cross-post; I have initially posted to the list
> users@tapestry.apache.org but I guess the issue is more related to
> hivemind,
> so I post here.]
>
> Hi list,
>
> I need to wrap "begin transaction" and "end transaction" actions  
> around
> a task (a Tapestry web request, actually). I've read about Hivemind,
>
>    http://www.nabble.com/hivemind-factory-service- 
> tf251931.html#a704856
>
> and configured a service point (see below). This works very well: my
> transaction is created, but I cannot see when it is ended (committed/
> rolled back).
>
> More precisely, I am struggling with:
>
> * What method is called on the object created by the factory when it
>    is discarded? It is threadDidDiscardService(), right?
>
> * How can I catch exceptions from my actual task so that I can do a
> rollback
>   instead of a commit?
>
> I am new to Hivemind, so please excuse these rather simple questions.
>
> Many thanks for you patience!
> Kaspar
>
> -- 
> Here's my configuration:
>
>   <service-point
> interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"
> id="alfrescoContext">
>    <invoke-factory service-id="AlfrescoTransactionFactory"
> model="threaded" />
>   </service-point>
>   <service-point
> interface="org.apache.hivemind.ServiceImplementationFactory"
> id="AlfrescoTransactionFactory" parameters-occurs="none">
>    <create-instance
> class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
>   </service-point>
>
> Here is my factory:
>
> public class AlfrescoTransactionFactory implements
> ServiceImplementationFactory, Discardable {
>
>    public Object createCoreServiceImplementation
> (ServiceImplementationFactoryParameters factoryParameters)
>    {
>      System.err.println("createCoreServiceImplementation"); // gets
> called!
>      UserTransaction transaction;
>      ServiceRegistry serviceRegistry;
>      try {
>        transaction =
> AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction
> (true);
>        serviceRegistry =
> AlfrescoApplicationInitializer.getServiceRegistry();
>      }
>      catch (Exception e) {
>        throw new ApplicationRuntimeException("Could not create an
> Alfresco transactoin.", e);
>      }
>      return new AlfrescoTransactionContextImpl(transaction,
> serviceRegistry);
>    }
>
>    public void threadDidDiscardService()
>    {
>      System.err.println("threadDidDiscardService"); // never called!
>      // ... end the transaction here (todo)
>    }
> }
>


RE: Using Hivemind to wrap a transaction around a request

Posted by Jean-Francois Poilpret <jf...@yahoo.fr>.
Hi Kaspar,

I think you'd rather take a look at HiveMind interceptors rather than
factories.
You can create an Interceptor that will be called before and after any
method of another service.
There are several ways to create interceptors in HiveMind, take a look at
HiveMind website to see simple examples.

If you want to see a real-life implementation of such a system you may take
a look at hivetranse (http://hivetranse.sourceforge.net) which implements
the same kind of behavior as you are looking for. I think you could quite
easily adapt one of the numerous hivetranse interceptors (choose one -the
simples- as an example).

Cheers

Jean-Francois

-----Original Message-----
From: Kaspar Fischer [mailto:fischerk@inf.ethz.ch] 
Sent: Wednesday, December 05, 2007 7:32 PM
To: user@hivemind.apache.org
Subject: Using Hivemind to wrap a transaction around a request

[Note: This is a cross-post; I have initially posted to the list
users@tapestry.apache.org but I guess the issue is more related to  
hivemind,
so I post here.]

Hi list,

I need to wrap "begin transaction" and "end transaction" actions around
a task (a Tapestry web request, actually). I've read about Hivemind,

   http://www.nabble.com/hivemind-factory-service-tf251931.html#a704856

and configured a service point (see below). This works very well: my
transaction is created, but I cannot see when it is ended (committed/
rolled back).

More precisely, I am struggling with:

* What method is called on the object created by the factory when it
   is discarded? It is threadDidDiscardService(), right?

* How can I catch exceptions from my actual task so that I can do a  
rollback
  instead of a commit?

I am new to Hivemind, so please excuse these rather simple questions.

Many thanks for you patience!
Kaspar

-- 
Here's my configuration:

  <service-point  
interface="org.my.tapestry.alfresco.AlfrescoTransactionContext"  
id="alfrescoContext">
   <invoke-factory service-id="AlfrescoTransactionFactory"  
model="threaded" />
  </service-point>
  <service-point  
interface="org.apache.hivemind.ServiceImplementationFactory"  
id="AlfrescoTransactionFactory" parameters-occurs="none">
   <create-instance  
class="org.my.tapestry.alfresco.AlfrescoTransactionFactory" />
  </service-point>

Here is my factory:

public class AlfrescoTransactionFactory implements  
ServiceImplementationFactory, Discardable {

   public Object createCoreServiceImplementation 
(ServiceImplementationFactoryParameters factoryParameters)
   {
     System.err.println("createCoreServiceImplementation"); // gets  
called!
     UserTransaction transaction;
     ServiceRegistry serviceRegistry;
     try {
       transaction =  
AlfrescoApplicationInitializer.createAndBeginAuthenticatedTransaction 
(true);
       serviceRegistry =  
AlfrescoApplicationInitializer.getServiceRegistry();
     }
     catch (Exception e) {
       throw new ApplicationRuntimeException("Could not create an  
Alfresco transactoin.", e);
     }
     return new AlfrescoTransactionContextImpl(transaction,  
serviceRegistry);
   }

   public void threadDidDiscardService()
   {
     System.err.println("threadDidDiscardService"); // never called!
     // ... end the transaction here (todo)
   }
}