如何在java中使用MDB和activemq进行串行处理

时间:2017-09-07 09:19:10

标签: ejb jboss-mdb

我正在使用activemq在ejb mdb上工作,能不能请你帮忙, 我从队列中读取消息并将数据保存到数据库中,我能够将数据保存到数据库中,但是mdb从队列中获取消息,一条消息部分保存到数据库中,然后处理另一条消息。  我想逐个将消息保存到数据库中,任何人都可以帮助我

2 个答案:

答案 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