0

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

4

2 回答 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的方法。


请参阅: 消息驱动 Bean 中的并发性 - 线程安全 Java EE5 与 EE6

于 2017-09-15T10:56:30.793 回答