Throwing a RuntimeException from inside the transaction boundary that bubbles 
across the transaction boundary. So in the example you had previously, you 
could make the exception a RuntimeException and remove the try catch blocks 
that should trigger a rollback.
You are still going to get the original exception rather than a 
TransactionRollbackException this way. If you want a rollback exception you 
could get access to the transaction (say via UserTransaction) and call 
setRollbackOnly.

On 16 Nov 2010, at 14:08, Charles Moulliard wrote:

> How do you simulate an error to have a rollback in your code ?
> 
> On 16/11/10 14:49, Valentin Mahrwald wrote:
>> Agreed :)
>> 
>> The third trace essentially says your transaction is starting. But there is 
>> no matching trace to say it commited :(
>> In error cases though you will get another trace entry, so by the looks all 
>> your transactions succeed ?!
>> 
>> On 16 Nov 2010, at 13:08, Charles Moulliard wrote:
>> 
>>> BTW, I have enable tracing mode for the class org.apache.aries.transaction 
>>> but the trace does not report begin and commit or rollback
>>> 
>>> 14:05:42,952 | DEBUG | tenerContainer-1 | TxComponentMetaDataHelperImpl    
>>> | on.TxComponentMetaDataHelperImpl  185 | 271 - 
>>> org.apache.aries.transaction.blueprint - 0.2.0.incubating | Getting the 
>>> txAttribute for the component {0} and method {1}
>>> 14:05:42,952 | DEBUG | tenerContainer-1 | TxComponentMetaDataHelperImpl    
>>> | on.TxComponentMetaDataHelperImpl  197 | 271 - 
>>> org.apache.aries.transaction.blueprint - 0.2.0.incubating | Return the 
>>> txAttribute {0} for the component and method
>>> 14:05:42,953 | DEBUG | tenerContainer-1 | TxInterceptorImpl                
>>> | es.transaction.TxInterceptorImpl  110 | 271 - 
>>> org.apache.aries.transaction.blueprint - 0.2.0.incubating | Method: public 
>>> void 
>>> org.apache.camel.example.reportincident.dao.impl.IncidentDAOImpl.saveIncident(org.apache.camel.example.reportincident.model.Incident),
>>>  has transaction strategy: REQUIRED
>>> 1
>>> 
>>> This should be nice to have this info because for the moment we have no 
>>> idea if the transaction occurs or not.
>>> 
>>> On 16/11/10 13:44, Charles Moulliard wrote:
>>>> You are right. I made a mistake in my code to simulate an error + rollback
>>>> 
>>>> On 16/11/10 12:21, Valentin Mahrwald wrote:
>>>>> I am a bit confused by the scenario. If I understand this correctly the 
>>>>> saveIncident method throws an exception and catches it inside the method 
>>>>> itself. So the transaction that spans around the saveIncident method 
>>>>> would be unaffected ?!
>>>>> 
>>>>> What are you trying to simulate?
>>>>> 
>>>>> Just looking over it there is not a lot of trace. However, 
>>>>> org.apache.aries.transaction.TxInterceptorImpl logs (at debug) when 
>>>>> transactions start and if they fail.
>>>>> 
>>>>> On 16 Nov 2010, at 10:37, Charles Moulliard wrote:
>>>>> 
>>>>>> That does not work. In fact I'm not even sure that a transaction has 
>>>>>> been initiated
>>>>>> 
>>>>>> I have made the following modification
>>>>>> 
>>>>>> 1) DAO
>>>>>> 
>>>>>> <bean id="incidentDAO"
>>>>>>       
>>>>>> class="org.apache.camel.example.reportincident.dao.impl.IncidentDAOImpl">
>>>>>> <!--<tx:transaction method="*" value="Required" />   -->
>>>>>> <jpa:context property="entityManager" unitname="ReportIncident" />
>>>>>> </bean>
>>>>>> 
>>>>>> 2) Service
>>>>>> 
>>>>>> <bean id="incidentService" 
>>>>>> class="org.apache.camel.example.reportincident.service.impl.IncidentServiceImpl">
>>>>>> 
>>>>>> <tx:transaction method="*" value="Required" />
>>>>>> 
>>>>>> <property name="incidentDAO">
>>>>>> <reference 
>>>>>> interface="org.apache.camel.example.reportincident.dao.IncidentDAO"/>
>>>>>> </property>
>>>>>> 
>>>>>> </bean>
>>>>>> 
>>>>>> 3) Simulation of an error
>>>>>> 
>>>>>> public class IncidentServiceImpl implements IncidentService {
>>>>>> 
>>>>>>   private static final transient Log LOG = 
>>>>>> LogFactory.getLog(IncidentServiceImpl.class);
>>>>>> 
>>>>>>   /** The incident dao. */
>>>>>>   private IncidentDAO incidentDAO;
>>>>>> 
>>>>>>   public void saveIncident(Incident incident) {
>>>>>> 
>>>>>>       try {
>>>>>>           getIncidentDAO().saveIncident(incident);
>>>>>>           throw new Exception(">>   Generate Error to simulate 
>>>>>> RollBack");
>>>>>>       } catch (RuntimeException e) {
>>>>>>           e.printStackTrace();
>>>>>>       }  catch (Exception ex) {
>>>>>>           ex.printStackTrace();
>>>>>>       }
>>>>>> 
>>>>>>   }
>>>>>> 
>>>>>> Is there a way to trace in log the Aries Transaction ?
>>>>>> 
>>>>>> Regards,
>>>>>> 
>>>>>> Charles
>>>>>> 
>>>>>> On 16/11/10 10:49, Valentin Mahrwald wrote:
>>>>>>> On 16 Nov 2010, at 09:42, Charles Moulliard wrote:
>>>>>>> 
>>>>>>>> There was a conflict with another ServiceMix bundle providing too jndi 
>>>>>>>> context. I have remove it and restart my project. Everything works 
>>>>>>>> fine.
>>>>>>>> 
>>>>>>>> This is easier to configure compare to Spring + Hibernate stuffs on 
>>>>>>>> OSGI. I will produce a tutorial with camel + aries + jpa + transaction 
>>>>>>>> + wicket about that and show How Aries JPA/Transaction simplifies our 
>>>>>>>> lives on OSGI platform.
>>>>>>>> 
>>>>>>>> Question : In all the examples (Blog, AriesTrader), the transaction is 
>>>>>>>> defined in the DAO layer (= layer containing the entityManager). Could 
>>>>>>>> it be possible that I define the tx within the Service layer (in 
>>>>>>>> charge to call the DAO) ?
>>>>>>> Yes, for all I know that should work. The JPA and Transaction 
>>>>>>> extensions are entirely independent. The transaction extensions manages 
>>>>>>> the transaction bound to the current thread while the JPA extension 
>>>>>>> manages EntityManagers (and -Factories) that access
>>>>>>> the transaction currently active on the thread.
>>>>>>> 
>>>>>>>> Regards,
>>>>>>>> 
>>>>>>>> Charles
>>>>>>>> 
>>>>>>>> On 16/11/10 10:26, Alasdair Nottingham wrote:
>>>>>>>>> That is very odd. Something has not worked because the stack trace 
>>>>>>>>> shows the InitialContextFactoryBuilder has not been registered.
>>>>>>>>> 
>>>>>>>>> Could there be a timing issue? Perhaps the jndi bundle starts after 
>>>>>>>>> your test. Certainly the jndi bundle has the highest id.
>>>>>>>>> 
>>>>>>>>> Alasdair Nottingham
>>>>>>>>> 
>>>>>>>>> On 16 Nov 2010, at 09:11, Charles Moulliard<[email protected]>     
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Yes. The Aries JNDI bundle is started
>>>>>>>>>> 
>>>>>>>>>> [ 178] [Active     ] [            ] [       ] [   60] Apache Aries 
>>>>>>>>>> JNDI Bundle (0.2.0.incubating)
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On 16/11/10 09:52, Alasdair Nottingham wrote:
>>>>>>>>>>> Hi,
>>>>>>>>>>> 
>>>>>>>>>>> Have you deployed and started the jndi bundle?
>>>>>>>>>>> 
>>>>>>>>>>> Alasdair
>>>>>>>>>>> 
>>>>>>>>>>> On 16 Nov 2010, at 08:18, Charles Moulliard<[email protected]>   
>>>>>>>>>>>    wrote:
>>>>>>>>>>> 
>>>>>>>>>>>> Hi,
>>>>>>>>>>>> 
>>>>>>>>>>>> Based on the Blog example of Aries, I have created a small project 
>>>>>>>>>>>> that I deploy on Fuse ESB (=Apache ServiceMix 4). The project 
>>>>>>>>>>>> includes a DAO layer (=JPA), Service layer, Camel route (where a 
>>>>>>>>>>>> bean calls my service layer).
>>>>>>>>>>>> 
>>>>>>>>>>>> The following error is reported :
>>>>>>>>>>>> 
>>>>>>>>>>>> Caused by: java.lang.RuntimeException: The DataSource 
>>>>>>>>>>>> osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/reportincidentdb)
>>>>>>>>>>>>  could not be used.
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getDs(DelayedLookupDataSource.java:47)
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:60)
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:137)
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:112)
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:239)
>>>>>>>>>>>>   ... 100 more
>>>>>>>>>>>> Caused by: javax.naming.NoInitialContextException: Need to specify 
>>>>>>>>>>>> class name in environment or system property, or as an applet 
>>>>>>>>>>>> parameter, or in an application resource file:  
>>>>>>>>>>>> java.naming.factory.initial
>>>>>>>>>>>>   at 
>>>>>>>>>>>> javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
>>>>>>>>>>>>   at 
>>>>>>>>>>>> javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)[:1.6.0_22]
>>>>>>>>>>>>   at 
>>>>>>>>>>>> javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)[:1.6.0_22]
>>>>>>>>>>>>   at 
>>>>>>>>>>>> javax.naming.InitialContext.lookup(InitialContext.java:392)[:1.6.0_22]
>>>>>>>>>>>>   at 
>>>>>>>>>>>> org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getDs(DelayedLookupDataSource.java:43)
>>>>>>>>>>>> 
>>>>>>>>>>>> Here is the bundle that I deploy to use Aries
>>>>>>>>>>>> 
>>>>>>>>>>>> [   7] [Active     ] [Created     ] [       ] [   20] Apache Aries 
>>>>>>>>>>>> Blueprint Bundle (0.2.0.incubating)
>>>>>>>>>>>> [  49] [Active     ] [            ] [       ] [   60] Apache Aries 
>>>>>>>>>>>> Transaction Manager (0.2.0.incubating)
>>>>>>>>>>>> [ 167] [Active     ] [Created     ] [       ] [   60] Aries JPA 
>>>>>>>>>>>> Container blueprint integration for Aries blueprint 
>>>>>>>>>>>> (0.2.0.incubating)
>>>>>>>>>>>> [ 170] [Active     ] [Created     ] [       ] [   60] Apache Aries 
>>>>>>>>>>>> Transaction Blueprint (0.2.0.incubating)
>>>>>>>>>>>> [ 171] [Active     ] [            ] [       ] [   60] Aries JPA 
>>>>>>>>>>>> Container (0.2.0.incubating)
>>>>>>>>>>>> [ 172] [Active     ] [            ] [       ] [   60] Apache Aries 
>>>>>>>>>>>> Util (0.2.0.incubating)
>>>>>>>>>>>> [ 175] [Active     ] [            ] [       ] [   60] Aries JPA 
>>>>>>>>>>>> Container Managed Contexts (0.2.0.incubating)
>>>>>>>>>>>> [ 178] [Active     ] [            ] [       ] [   60] Apache Aries 
>>>>>>>>>>>> JNDI Bundle (0.2.0.incubating)
>>>>>>>>>>>> 
>>>>>>>>>>>> [ 166] [Active     ] [Created     ] [       ] [   60] 
>>>>>>>>>>>> Reportincident :: Persistence JPA :: Aries (1.0.0.SNAPSHOT)
>>>>>>>>>>>> [ 176] [Active     ] [Created     ] [       ] [   60] 
>>>>>>>>>>>> Reportincident :: Service Bundle :: Aries (1.0.0.SNAPSHOT)
>>>>>>>>>>>> 
>>>>>>>>>>>> What is the reason ? Is there a bundle that I miss to deploy ?
>>>>>>>>>>>> 
>>>>>>>>>>>> Regards,
>>>>>>>>>>>> 
>>>>>>>>>>>> Charles M.
>>>>>>>>>>>> Apache Committer (Camel, Servicmix and Karaf)

Reply via email to