我遇到了消息驱动的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。
答案 0 :(得分:1)
您的应用程序服务器创建了多个OperationsBackgroundService
实例,并将每个实例注册为使用者。每个消费者一次只能处理一条消息,但是当有2个消费者时,可以同时处理2条消息。这是一个功能,而不是错误。
如果要实现单线程处理,只需告诉应用程序服务器每个MDB只创建一个使用者。请参阅应用程序服务器文档以了解如何配置它。