[英]EJB Container Managed Transaction with JDBC Result Set and MDB
我有一个无状态会话bean。 在以下方法中,我循环列表以将每个用户插入表“ user”中。
void saveUserList(List<User> users) {
try {
conn = dataSource.getConnection();
PreparedStatement ps;
try {
ps = conn.prepareStatement(INSERT_USER_LIST);
for (User user : users) {
ps.setString(1, user.getName);
if (ps.executeUpdate() > 0) {
sendJMSMessage();
}
}
}
} catch (SQLException e) {
// catch error!!
} finally {
closeResource(conn);
}
}
每次成功插入后,触发标志都将发送到MDB。 这是sendJMSMessage方法...
void sendJMSMessage() {
conn = connectionFactory.createQueueConnection();
qsession = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = qsession.createSender(queue);
conn.start();
TextMessage flag = qsession.createTextMessage("triggerFlag");
flag.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
sender.send(flag);
}
然后它将调用MDB的onMessage方法。 在这里,我想在onMessage中从表“ user”中获取所有用户,包括最后插入的用户(当循环仍在迭代列表时,可能尚未提交)。 提取过程发生在由onMessage调用的另一个无状态EJB中。 我希望那里有唱片。 但是结果集什么也没有。
void onMessage(Message message) {
TextMessage obj = (TextMessage) message;
if (obj.getText.equals("triggerFlag")) {
ArrayList<User> users = someBean.getUsers();
// Do something with them, as well as the new user.
}
}
使用当前代码,我通常需要通过传递不同的列表来重新执行saveUserList()以获得预期的结果。 我想知道的是:
EntityManager
解开包装,那么在您(第一个输入的)EJB方法返回时,事务将自动提交(默认情况下是这样,即如果没有其他注释!) UserTransaction
,而不是Container Managed Transactions(CMT))。 仅当整个用户列表(不是现在的每个用户)以及提交事务(通过UserTransaction
编程)后,您才完成,您的第二个无状态Bean将看到您的所有用户都是100%。 在这种情况下,您应该只发送一次消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.