我设置了一个简单的请求/回复类型场景(JavaEE 7/Netbeans 7 with Glassfish),代码如下:
这是一个执行 JMS 生产者角色的无状态会话 bean,
destination
并被factory
注入到 EJB 中。
public void doStuff(int id) {
try {
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
ObjectMessage message = session.createObjectMessage();
MyObject obj = new MyObject(id);
connection.start();
TemporaryQueue replyQueue = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyQueue);
message.setJMSReplyTo(replyQueue);
message.setObject(obj);
producer.send(message, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, 1800000);
Message reply = consumer.receive();
producer.close();
session.close();
connection.close();
} catch (JMSException ex) {
}
}
我的问题是,当consumer.receive()
被调用时,执行会按预期阻止-但是此消息的使用者永远不会运行。原始消息的使用者(它是一个 MDB)位于部署在同一 Glassfish 服务器上的另一个 netbeans 项目中。
我已经尝试调试两个项目(生产者和消费者),似乎当我的生产者项目被阻塞时,我的消费者项目根本没有做任何事情。
如果我按预期更改consumer.recieve()
为consumer.receive(20000)
20 秒内没有任何反应 - 但是一旦超时突然到期,我的消费者项目就会遇到调试器断点,并且它会正常处理。但是当然没有回复发送回我的生产者项目,因为它不再在听了!
我的另一个项目(消费者项目)看起来像这样:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myQueue")
})
---------------------
@Override
public void onMessage(Message message) {
try {
ObjectMessage objMessage = (ObjectMessage) message;
MyObject obj = (MyObject) objMessage.getObject();
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(message.getJMSReplyTo());
connection.start();
try {
myMethod(obj);
} catch (Exception e) {
Message response = session.createTextMessage(e.getMessage());
producer.send(message.getJMSReplyTo(), response);
}
} catch (JMSException ex) {
}
}
如何让 receive() 方法正常工作?我需要它暂停回复,但是在暂停时我需要我的另一个项目继续工作——如果它们是两个单独部署的项目,我会假设它们无论如何都在不同的线程上。