tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Romain Manni-Bucau <rmannibu...@gmail.com>
Subject Re: Activemq embedded + createSession : unable to make it work!
Date Fri, 10 Oct 2014 11:47:35 GMT
normally you can do the same without handling transactions yourself
(and then avoiding potential errors) using CMT. If a runtime exception
is thrown then it will rollback


Romain Manni-Bucau
@rmannibucau
http://www.tomitribe.com
http://rmannibucau.wordpress.com
https://github.com/rmannibucau


2014-10-10 10:24 GMT+02:00 joeleclems <joeleclems@free.fr>:
> Romain Manni-Bucau wrote
>> commit/rollbackis handled with transaction status so don'tcall it yourself
>
> My goal is to be able to call a rollback when a fonctionnal error arrives.
> So i have to manage transaction.
>
>
> Finally, i found what i was looking for (thanks for your help!), only need
> to manage transaction correctly now!
> I had to use @Asynchronous method and BMT (to be able to manage
> transaction).
>
> This is the result :
>
> @Stateless
> @TransactionManagement(TransactionManagementType.BEAN)
> public class MyAsyncReceiver {
>
> ...
>
> @Resource
>         private UserTransaction userTransaction;
>
> /**
>          * receive message.
>          */
>         @Asynchronous
>         @Lock(LockType.READ)
>         @AccessTimeout(-1)
>         public void receiveMessage() {
>                 QueueConnectionFactory connectionFactory = null;
>                 QueueConnection connection = null;
>                 QueueSession session = null;
>                 Queue orderQueue = null;
>                 MessageConsumer msgConsumer = null;
>                 Message inMessage = null;
>
>                 // receive message
>                 while (true) {
>                         try {
>                                 userTransaction.begin();
>                                 try {
>                                         Context ctx = new InitialContext();
>                                         connectionFactory = (QueueConnectionFactory)
ctx
>                                                         .lookup("MyJNDIFactoryName");
>                                         connection = connectionFactory.createQueueConnection();
>
>                                         session = connection.createQueueSession(true,
0);
>
>                                         orderQueue = (Queue) ctx.lookup("MyJNDIQueueName";
>
>                                         connection.start();
>                                         // Create receiver
>                                         msgConsumer = session.createConsumer(orderQueue);
>
>                                 } catch (Exception e) {
>                                         LOGGER.error("Connection problem: " + e.toString());
>                                         userTransaction.rollback();
>                                         continue;
>                                 }
>
>                                 // receive message
>                                 String text = null;
>                                 try {
>                                         inMessage = msgConsumer.receive();
>                                         TextMessage textMessage = (TextMessage) inMessage;
>                                         text = textMessage.getText();
>                                 } catch (JMSException e) {
>                                         userTransaction.rollback();
>                                         continue;
>                                 }
>
>                                 // Call a function witch can throw an exception
>                                 try {
>                                         myFunction(text);
>
>                                         // validate message if no exception occured
>                                         userTransaction.commit();
>                                 } catch (InvalidParameterException e) {
>                                         LOGGER.error("Functionnal error", e);
>                                         // unvalidate message to be able to consume msg
again
>                                         userTransaction.rollback();
>                                 } finally {
>                                         if (connection != null) {
>                                                 try {
>                                                         connection.close();
>                                                 } catch (JMSException e) {
>                                                         LOGGER.error("Error when closing
connections", e);
>                                                 }
>                                         }
>                                 }
>                         } catch (Exception e) {
>                                 LOGGER.error(
>                                                 "Transaction problem : Begin, Commit
or Rollback error",
>                                                 e);
>                         } finally {
>                                 if (connection != null) {
>                                         try {
>                                                 connection.close();
>                                         } catch (JMSException e) {
>                                                 LOGGER.error("Error when closing connections",
e);
>                                         }
>                                 }
>                         }
>                 }
>         }
>
> ...
> }
>
>
> Now, i need to Manage transaction correctly, and i don't think my method is
> a good one because :
>  - What about transaction timeout? I start transaction before calling
> "receive" (wait for a message), if no message arrive and transaction timeout
> occured : how to manage this case?
>
> Thanks in advance
>
>
>
>
>
> --
> View this message in context: http://tomee-openejb.979440.n4.nabble.com/Activemq-embedded-createSession-unable-to-make-it-work-tp4672172p4672203.html
> Sent from the TomEE Users mailing list archive at Nabble.com.

Mime
View raw message