Hi, I hope you are talking about the missing userTransaction.rollback(); inside the catch(Throwable ignore) block. The code for sending of jms message can be moved out of the try block. Because it is ok to get any exception while sending the jms message and still the database batchorder entity shall be created in the database.
By the way we didn't had any jms rollback occured that day, because the jms message was consumed properly by the other jms queue consumer application. Kalyan On Sun, Nov 2, 2014 at 7:32 PM, Romain Manni-Bucau <[email protected]> wrote: > If you forget tge rollback your tx state will be broken and you ll > potentially get more issues. > > Can be linked to jms, no jms rollback? Maybe add more logs (activemq ones) > Hi, > > Anyway after a while of reading and browsing I came to the following > conclusion. I have rewritten my BatchManager class to use > @TransactionManagement(TransactionManagementType.BEAN). > > > @Stateless > *@TransactionManagement(TransactionManagementType.BEAN) * > public class BatchManager{ > @EJB > private BatchOrderDao batchOrderDao; > > @Resource > private UserTransaction userTransaction; > > @Asynchronous > @Lock(LockType.READ) > public void createBatchMessage(...){ > try{ > *userTransaction.begin();* > ...Some code to read Invoice table... > > batchOrderDao.create(batchOrder); > *userTransaction.commit();* > > ...Some more code to send jms message... > } catch (final Throwable ignore) { > ignore.printStackTrace(); > } > > } > } > > This way I can be sure if the usertransaction is commited then the record > is created in the database and we can send jms message without any problem. > > Please correct me if my approach is incorrect. > > Regards > Kalyan > > > > > On Sun, Nov 2, 2014 at 1:18 PM, Radhakrishna Kalyan <[email protected]> > wrote: > > > Hi, > > > > I am sorry, I am not clear, what do you mean by random execution order. > > Our requirement is, we have 2 tasks : > > > > *Task1:* The @Asynchronous method, BatchManager.createBatchMessage() is > > triggered by a different application through a http rest request. > > As I mentioned previously, the goal of this method is to > create > > a BatchOrder entity in database and send jms message by reading Invoices > > table, with all the invoices as xml to a different application. The > reason > > to use @Asynchronous because the method can take 30-50 minutes to > complete > > and we don't the http request to wait so long. > > > > *Task2:* OverdueBatchTimerService is scheduled to run every 5 minutes to > > find all the batchorders with certain criteria and send an email if the > > criteria matches. > > > > If you observe in both tasks the common is the BatchOrder table. Task1 is > > inserting into that table and Task2 is selecting from that table. > > > > I believe that both tasks run in 2 different threads, so I am not clear > > how can an exception caused in Task2 caused rollback of the transaction > in > > Task1. > > Is it possible? > > > > > > > > > > > > On Sun, Nov 2, 2014 at 8:45 AM, Romain Manni-Bucau < > [email protected]> > > wrote: > > > >> I think async usage leadd to some random execution order. Ensure it is > not > >> random then it should work > >> Le 2 nov. 2014 08:38, "Nrkkalyan" <[email protected]> a écrit : > >> > >> > Hi > >> > > >> > Thank you. Can you please elaborate what do you mean by synchronously. > >> > > >> > Regards > >> > /Kalyan > >> > 0733312584 > >> > > >> > PS: I am bad at spelling because I use mobile. > >> > > >> > > On 2 nov 2014, at 08:04, Romain Manni-Bucau <[email protected]> > >> > wrote: > >> > > > >> > > This is an app exception and surely a timing issue. Rewrite the app > >> > > synchronously it will work so i sadly think it is on your side > >> > > Le 1 nov. 2014 22:24, "Radhakrishna Kalyan" <[email protected]> a > >> > écrit : > >> > > > >> > >> Sorry > >> > >> Please find the exception at the following url > >> > >> > >> > >> > >> > >> > >> > > >> > > https://drive.google.com/file/d/0B9j0dIS5bS0wYy1OOE5iaFNKaUU/view?usp=sharing > >> > >> > >> > >> > >> > >> On Sat, Nov 1, 2014 at 10:20 PM, Romain Manni-Bucau < > >> > [email protected] > >> > >> wrote: > >> > >> > >> > >>> Hi > >> > >>> > >> > >>> I dont see any attached file, can you gist or pastebin it? > >> > >>> Le 1 nov. 2014 21:23, "Radhakrishna Kalyan" <[email protected]> > a > >> > >> écrit > >> > >>> : > >> > >>> > >> > >>>> > >> > >>>> > >> > >>>> Hi, > >> > >>>> > >> > >>>> Yesterday we had deployed our application in our production for > the > >> > >> first > >> > >>>> time which was developed using OpenEJB standalone. > >> > >>>> But we got an exception after a while when we tried to perform > >> certain > >> > >>>> operation. > >> > >>>> Please find the attached exception file. > >> > >>>> > >> > >>>> The application shall read certain data from a table(Invoice) in > >> > >> database > >> > >>>> and create an entry in an another table (BatchOrder). After that > it > >> > >> shall > >> > >>>> create an xml message using that data > >> > >>>> and send to a jms queue. > >> > >>>> In the console log everything looks fine and the jms message has > >> been > >> > >>> sent. > >> > >>>> In the console log the id of the newly created BatchOrder record > is > >> > >>>> printed, but at the end when we check the database no record has > >> been > >> > >>>> created in the table BatchOrder. > >> > >>>> > >> > >>>> The classes involved are 3: > >> > >>>> BatchManager > >> > >>>> BatchOrderDao > >> > >>>> OverdueBatchTimerService > >> > >>>> > >> > >>>> Here is the following code snippet of my application. > >> > >> > >> > > >> > > --------------------------------------------------------------------------------------------------------------------------- > >> > >>>> @Stateless > >> > >>>> public class BatchManager{ > >> > >>>> @EJB > >> > >>>> private BatchOrderDao batchOrderDao; > >> > >>>> > >> > >>>> @Asynchronous > >> > >>>> @Lock(LockType.READ) > >> > >>>> public void createBatchMessage(...){ > >> > >>>> ...Some code to read Invoice table... > >> > >>>> > >> > >>>> batchOrderDao.create(batchOrder); > >> > >>>> > >> > >>>> ...Some more code to send jms message... > >> > >>>> > >> > >>>> } > >> > >>>> } > >> > >> > >> > > >> > > --------------------------------------------------------------------------------------------------------------------------- > >> > >>>> @Stateless > >> > >>>> public class BatchOrderDao{ > >> > >>>> > >> > >>>> @PersistenceContext(unitName = "datasource") > >> > >>>> private EntityManager entityManager; > >> > >>>> > >> > >>>> public void create(BatchOrder entity){ > >> > >>>> entityManager.persist(entity); > >> > >>>> entityManager.flush(); > >> > >>>> } > >> > >>>> > >> > >>>> @SuppressWarnings("unchecked") > >> > >>>> public List<Long> findBatchesWithOverdueReceipts(final Date > >> date) { > >> > >>>> final Criteria criteria = > >> > >>>> getSession().createCriteria(BatchOrder.class); > >> > >> > >> > > >> > criteria.setProjection(Projections.distinct(Projections.property("iId"))); > >> > >>>> criteria.add(Restrictions.isNull("iAlarmed")); > >> > >>>> ....Some more Restrictions..... > >> > >>>> return criteria.list(); > >> > >>>> } > >> > >>>> > >> > >>>> } > >> > >> > >> > > >> > > --------------------------------------------------------------------------------------------------------------------------- > >> > >>>> @Entity > >> > >>>> @Cacheable > >> > >>>> @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) > >> > >>>> @Table(name = "BATCH_ORDER") > >> > >>>> public class BatchOrder { > >> > >>>> private static final long serialVersionUID = 1L; > >> > >>>> > >> > >>>> @Id > >> > >>>> @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = > >> > >>> "IdSeq") > >> > >>>> @SequenceGenerator(name = "IdSeq", sequenceName = "BOID_SEQ", > >> > >>>> allocationSize = 1) > >> > >>>> @Column(name = "BO_ID", unique = true, nullable = false, > >> updatable = > >> > >>>> false) > >> > >>>> private Long iId; > >> > >>>> > >> > >>>> @Column(name = "BO_ALARMED", unique = false, nullable = true, > >> > >> updatable > >> > >>>> = true) > >> > >>>> private Date iAlarmed; > >> > >>>> > >> > >>>> .... Some more fields.... > >> > >>>> > >> > >>>> } > >> > >> > >> > > >> > > --------------------------------------------------------------------------------------------------------------------------- > >> > >>>> @Singleton > >> > >>>> @Startup > >> > >>>> @Lock(LockType.READ) > >> > >>>> private class OverdueBatchTimerService{ > >> > >>>> @Inject > >> > >>>> private BatchOrderDao dao; > >> > >>>> @Resource > >> > >>>> private TimerService timerService; > >> > >>>> private static final long _5MINUTES_IN_MILLISECONDS = 5l * 60l > * > >> > >>> 1000l; > >> > >>>> > >> > >>>> @PostConstruct > >> > >>>> public void initialize() throws Exception { > >> > >>>> > >> timerService.createSingleActionTimer(_5MINUTES_IN_MILLISECONDS, > >> > >>>> new TimerConfig()); > >> > >>>> } > >> > >>>> > >> > >>>> @Timeout > >> > >>>> public void onTimeout(final Timer timer) { > >> > >>>> try{ > >> > >>>> .. Some Code.... > >> > >>>> dao.findBatchesWithOverdueReceipts(time); > >> > >>>> .... Some more code.... > >> > >>>> } catch (final Exception ignore) { > >> > >>>> LOG.error("Some exception occured while excecuting > >> > >> onTimeout, > >> > >>>> but IGNORED.", ignore); > >> > >>>> } finally { > >> > >>>> > >> > >>>> timerService.createSingleActionTimer(_5MINUTES_IN_MILLISECONDS, > new > >> > >>>> TimerConfig()); > >> > >>>> } > >> > >>>> } > >> > >>>> } > >> > >> > >> > > >> > > --------------------------------------------------------------------------------------------------------------------------- > >> > >>>> > >> > >>>> Please let me know if I am making any mistake. > >> > >>>> > >> > >>>> > >> > >>>> -- > >> > >>>> Thanks and Regards > >> > >>>> N Radhakrishna Kalyan > >> > >>>> > >> > >>>> P: +46 733 312 584 > >> > >>>> http://about.me/nrkkalyan > >> > >>>> <http://about.me/nrkkalyan> > >> > >> > >> > >> > >> > >> > >> > >> -- > >> > >> Thanks and Regards > >> > >> N Radhakrishna Kalyan > >> > >> > >> > >> P: +46 733 312 584 > >> > >> http://about.me/nrkkalyan > >> > >> <http://about.me/nrkkalyan> > >> > >> > >> > > >> > > > > > > > > -- > > Thanks and Regards > > N Radhakrishna Kalyan > > > > P: +46 733 312 584 > > http://about.me/nrkkalyan > > <http://about.me/nrkkalyan> > > > > > > -- > Thanks and Regards > N Radhakrishna Kalyan > > P: +46 733 312 584 > http://about.me/nrkkalyan > <http://about.me/nrkkalyan> > -- Thanks and Regards N Radhakrishna Kalyan P: +46 733 312 584 http://about.me/nrkkalyan <http://about.me/nrkkalyan>
