我正在使用activemq在ejb mdb上工作,能不能请你帮忙, 我从队列中读取消息并将数据保存到数据库中,我能够将数据保存到数据库中,但是mdb从队列中获取消息,一条消息部分保存到数据库中,然后处理另一条消息。 我想逐个将消息保存到数据库中,任何人都可以帮助我
答案 0 :(得分:1)
EJB有助于分布式处理。 MDB通过处理到达绑定的队列或主题的多个消息来帮助您扩展系统。
有一个配置说明池中应该有多少bean并使用这些消息。您可以将其配置为1,它将按照您期望的方式运行(假设您有一个应用服务器)。
但是,如果你真的想要一个接一个地处理消息,那么使用MDB是没有意义的。您可以编写一个实现MessageListener的普通java类。但这会降低整个过程的速度,并且有可能消息不断堆积在队列中。
答案 1 :(得分: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 ,是使用synchronized块。
看到:
Concurrency in Message Driven Bean - Thread safe Java EE5 vs. EE6