@Claus,
That's for sure may be not correct, but it's how I see it:
To my understanding in the sense of the CRUD operation one can C, U or D an
entity through the JpaProducer, however
only R through a JpaConsumer, so don't get the point why JpaConsumer should
do entityManager.flush() at all, for
example while polling! Other than that I don't think that calling
entityManager.flush() could help in any way in
the case the JPA-Provider throws PersistenceException in JpaConsumer.poll()
and that gets just swallowed & flush()
gets called afterwards. To me that PersistenceException would mean that some
serious problems on the DB occured while
reading through a JPA or Native Query on the JpaConsumer from which we could
ever/never recover ourself:
PersistenceException cause = null;
int messagePolled = 0;
try {
messagePolled = processBatch(CastUtils.cast(answer));
} catch (Exception e) {
if (e instanceof PersistenceException) {
cause = (PersistenceException) e;
} else {
cause = new PersistenceException(e);
}
}
if (cause != null) {
if (!isTransacted()) {
LOG.warn("Error processing last message due: {}.
Will commit all previous successful processed message, and ignore this last
failure.", cause.getMessage(), cause);
entityManager.flush();
} else {
// rollback all by throwning exception
throw cause;
}
}
In the sense of the expected ACID properties I think having that
consumer.transacted default to false would violate the A (all or nothing).
Maybe true would be better. Again that's just my 2 cents which may be not
correct at all.
Thanks, Babak
--
View this message in context:
http://camel.465427.n5.nabble.com/Misleading-jmx-statistics-on-jpa-component-tp4960503p4994753.html
Sent from the Camel - Users mailing list archive at Nabble.com.