【发布时间】:2016-02-26 14:17:12
【问题描述】:
我有一个无状态会话 bean。在以下方法中,我循环列表以将每个用户插入到表“用户”中。
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 中,我想从表“用户”中获取所有用户,包括最后插入的用户(当循环仍在迭代列表时,可能尚未提交)。获取过程发生在另一个由 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() 以获得预期的结果。我想知道的是:
- 可以这样做吗?
- 第一个插入事务何时提交?
- MDB 可以读取表中未提交的更改吗?
- 从 EJB 触发的 MDB 中读取表更改的正确方法是什么?
- 是否有其他方法可以做到这一点?
【问题讨论】:
标签: java jdbc ejb jms message-driven-bean