我正在使用activemq处理ejb mdb,你能帮我吗,我从队列中读取消息并将数据保存到数据库中,我能够将数据保存到数据库中,但是mdb从队列中获取消息,一条消息是部分保存到数据库中,然后处理另一条消息。我想将消息一一保存到数据库中,任何人都可以帮助我
问问题
122 次
2 回答
1
EJB 有助于分布式处理。MDB 通过处理到达绑定到队列或主题的多条消息来帮助您扩展系统。
有一个配置说明池中应该有多少 bean 并使用消息。您可以将其配置为 1,它将按照您期望的方式运行(假设您有一个应用服务器)。
但是,如果您真的想一个接一个地处理消息,那么使用 MDB 是没有意义的。您可以编写一个实现 MessageListener 的普通 java 类。但这会减慢您的整个过程,并且有可能消息会不断堆积在队列中。
于 2017-09-07T13:48:43.650 回答
0
@Amit 的解释是正确的,如果您将 maxSession 配置为 1,则行为将是您所期望的。这是实现单一咨询的最干净的方式。
如果您不需要每次只运行 1 个 MDB,而只是确保在特定时间只有一个线程执行代码(例如 db update),那么您可以使用 EJB3.1 中存在的 Singleton。您的代码将类似于:
@MessageDriven(...)
public class MessageReceiver implements MessageListener {
@EJB(name = "DBSingleton")
private DBSingleton dbSingleton;
public void onMessage(Message jmsMessage) {
//here a lot of, time consuming operations
User u; //get it from jmsMessage
dbSingleton.updateUser(u);
}
}
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
public class DBSingleton {
@EJB(name = "UserService")
private UserService userService;
@Lock(LockType.READ)
public User getUsers() {
return userService.getUser();
}
@Lock(LockType.WRITE)
public void updateUser(User user) {
userService.updateUser(user);
}
}
UserService uses EntityManager to persist in DB (directly or indirectly through a DAO class)
实现这一点的最后一种方法是使用同步块,但不鼓励特定于 ejb的方法。
于 2017-09-15T10:56:30.793 回答