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>

Reply via email to