Hi,
We don't know if the issue was with hibernate and some kind of
configuration.
One thing I can say that I had an annotation in the BatchOrder class.
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "BATCH_ORDER")
public class BatchOrder extends BaseEntity {
}
However we didn't able to reproduce the same on our QA. I will try this
week on our Acceptence and see if we can able to reproduce the exception.
But if not then at the end I will stick with the UserTransaction and see
how it will work on prod.
Kalyan
On Sun, Nov 2, 2014 at 9:26 PM, Romain Manni-Bucau <[email protected]>
wrote:
> Le 2 nov. 2014 20:23, "Radhakrishna Kalyan" <[email protected]> a écrit
> :
> >
> > Hi,
> >
> > I hope you are talking about the missing userTransaction.rollback();
> inside
> > the catch(Throwable ignore) block.
>
> Yes mainly, just ensure the transaction is finished
>
> > 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.
> >
>
> Then can be a hibernate config issue no?
>
> > 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>
>
--
Thanks and Regards
N Radhakrishna Kalyan
P: +46 733 312 584
http://about.me/nrkkalyan
<http://about.me/nrkkalyan>