JMS和MessageDriven EJB Bean

时间:2012-02-05 20:19:54

标签: java jms message-driven-bean

我遇到了消息驱动的EJB问题。 我也有包含MessageDrivenBean的应用程序Web Service和EJB应用程序。

向JMS发送消息我正在使用ObjectMessage: 这是我的代码:

        Connection connection = connectionFactory.createConnection();
        Session session = connection.createSession(false, 1);
        MessageProducer messageProducer = session.createProducer(queue);
        ObjectMessage outMessage = session.createObjectMessage();
        outMessage.setObject(((Serializable) operation));
        LOGGER.debug("Sending message...");
        messageProducer.send(outMessage);
        LOGGER.debug("Sending message: done.");
        messageProducer.close();
        session.close();
        connection.close();

当我调用我的Web服务时,我也在调用此方法。该消息在MDB上运行并开始处理。这是我的MDB代码:

    @MessageDriven(mappedName = "jms/cbsDestination", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
    public class OperationsBackgroundService implements MessageListener {
          //Some code....
         public void onMessage(Message message) {
    LOGGER.debug("Got message: " + message.toString());
    if (message instanceof ObjectMessage) {

        ObjectMessage objectMessage = (ObjectMessage) message;
        Operation operation = null;
    }

一切都好,我收到消息,它开始处理,它按照我的预期结束。

但问题是: 当我向MDB发送第一条消息时,它开始处理它(OK),然后,当第一条消息处理时,我向我的MDB发送第二条消息,它也开始处理它。我知道JMS的特点是,如果我发送一条消息而另一条消息正在处理,其他消息将等待,直到第一条消息被处理。或者我在这里遗漏了什么?请帮忙。也许我忘了设置一些属性?

感谢id advance。

1 个答案:

答案 0 :(得分:1)

您的应用程序服务器创建了多个OperationsBackgroundService实例,并将每个实例注册为使用者。每个消费者一次只能处理一条消息,但是当有2个消费者时,可以同时处理2条消息。这是一个功能,而不是错误。

如果要实现单线程处理,只需告诉应用程序服务器每个MDB只创建一个使用者。请参阅应用程序服务器文档以了解如何配置它。