Java 客户端使用者未收到JMS回复
我有一个向JMS MDB发送请求的客户端。它可以很好地将消息发送到MDB,但我一辈子都不知道如何让客户端接收MDB发送回它的响应 编辑:客户端代码是同一实例上的web服务,使用Java 客户端使用者未收到JMS回复,java,jms,glassfish-3,Java,Jms,Glassfish 3,我有一个向JMS MDB发送请求的客户端。它可以很好地将消息发送到MDB,但我一辈子都不知道如何让客户端接收MDB发送回它的响应 编辑:客户端代码是同一实例上的web服务,使用@WebService。我不知道这是否会产生影响(例如,对于交易),但除了这个问题之外,这似乎是可行的 MDB代码: private void sendpreply(字符串replyData,javax.jms.Message requestMessage) { 尝试 { info(“收到的sendReply消息的ID为:
@WebService
。我不知道这是否会产生影响(例如,对于交易),但除了这个问题之外,这似乎是可行的
MDB代码:
private void sendpreply(字符串replyData,javax.jms.Message requestMessage)
{
尝试
{
info(“收到的sendReply消息的ID为:+requestMessage.getJMSMessageID());
info(“sendReply消息getJMSReplyTo:+requestMessage.getJMSReplyTo());
Session Session=connection.createSession(false,javax.jms.Session.AUTO_-ACKNOWLEDGE);
最终队列replyQueue=(队列)requestMessage.getJMSReplyTo();
MessageProducer=session.createProducer(replyQueue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
TextMessage=session.createTextMessage();
message.setText(replyData);
message.setJMSCorrelationID(requestMessage.getJMSMessageID());
send(message,DeliveryMode.PERSISTENT,96000);
producer.close();
info(“返回的sendReply消息的ID为:+message.getJMSMessageID());
session.close();
debug(“sendReply发送的回复包含:\n”+replyData);
}
捕获(可丢弃的e)
{
warn(“sendReply()中的异常:”+stackToString(e));
}
}
客户端代码:
connection=connectionFactory.createConnection();
会话=connection.createSession(false,session.AUTO_-ACKNOWLEDGE);
MessageProducer=session.createProducer(请求队列);
Message=null;
//剪报消息的创建
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
final Queue replyQueue=session.createTemporaryQueue();
message.setJMSReplyTo(replyQueue);
consumer=session.createConsumer(replyQueue);
生产者。发送(消息);
producer.close();
log.info(“传输的调用消息具有消息ID:+message.getJMSMessageID());
TextMessage replyMessage=(TextMessage)consumer.receive(JMS_REPLY_TIMEOUT);//30秒
info(“返回的调用消息具有相关ID:+replyMessage.getJMSCOrrationId());
info(“返回的呼叫消息具有消息ID:+replyMessage.getJMSMessageID());
每次我运行它时,行TextMessage replyMessage=(TextMessage)consumer.receive(JMS\u REPLY\u TIMEOUT)代码>返回null。每一次。我做错了什么?MDB代码成功运行-日志消息全部输出相关数据,MDB接收到的消息内容与预期一致。只是这条回复信息让我无法上班
我使用了以下代码来浏览临时队列,这会看到消息!检查消息ID,我发送的回复消息肯定在队列中,但是调用consumer.receive(JMS\u reply\u TIMEOUT)
仍然返回null。。。我简直搞不懂发生了什么事
log.info(“浏览队列”);
QueueBrowser browser=会话.createBrowser(replyQueue);
最终枚举en=browser.getEnumeration();
while(en.hasMoreElements()){
Message m=(Message)en.nextElement();
log.info(“在具有ID[{}]和CorrelID[{}]的浏览器的队列中找到消息”,m.getJMSMessageID(),m.getJMSCorrelationID());
}
browser.close();
我正在Ubuntu 10.04上运行Glassfish 3.1.2.2,Java 1.7.0_04 64位
编辑:我还尝试将发送和接收拆分为单独的事务,如下所示:
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
private void sendMessage(最终会话,最终消息)引发JMSException{
//创建从会话到主题或队列的MessageProducer
final MessageProducer=session.createProducer(请求队列);
试一试{
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
生产者。发送(消息);
}
最后{
producer.close();
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
private TextMessage receiveMessage(会话,目标replyQueue)引发JMSException{
final MessageConsumer=session.createConsumer(replyQueue);
试一试{
final TextMessage m=(TextMessage)consumer.receive(JMS\u REPLY\u超时);
返回m;
}
最后{
consumer.close();
}
}
这并没有解决我的问题,尽管我承认我不确定这是否是确保这些方法中存在新事务所需要做的全部
编辑:将接收方法修改为:
因此,尽管在队列中等待了30秒,但我没有收到一直在队列中的消息。所以有点不对劲。这是我正在做的事吗?还是玻璃鱼的虫子?你必须添加
connection.start()
才能收到回复。您必须添加
connection.start()
能够收到回复
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private TextMessage receiveMessage(Session session, Destination replyQueue) throws JMSException {
final MessageConsumer consumer = session.createConsumer(replyQueue);
try {
log.info("Receiving message on Queue [{}]", replyQueue);
final TextMessage m = (TextMessage)consumer.receive(JMS_REPLY_TIMEOUT);
log.info("Received message [{}]", m);
log.info("Browsing Queue");
QueueBrowser browser = session.createBrowser((Queue) replyQueue);
final Enumeration<?> en = browser.getEnumeration();
while (en.hasMoreElements()) {
Message mess = (Message) en.nextElement();
log.info("Found message in Queue with Browser with ID [{}] and CorrelID [{}]", mess.getJMSMessageID(), mess.getJMSCorrelationID());
}
browser.close();
return m;
}
finally {
consumer.close();
}
}
20130225200939808 CLIENT heartBeat Called.
20130225200939808 CLIENT heartBeat Sending Message...
20130225200940020 CLIENT callMAPSWebServiceMDB building TextMessage
20130225200940057 CLIENT Sending message
20130225200940064 CLIENT Sent message
20130225200940067 CLIENT message transmitted had Message ID: ID:1-192.168.2.105(b5:49:dd:bf:5b:a6)-1-1361776180058
20130225200940077 CLIENT Receiving message on Queue [Oracle GlassFish(tm) Server MQ Destination
getName(): temporary_destination://queue/192.168.2.105/3170601277394174976/1
Class: com.sun.messaging.jms.ra.TemporaryQueue
getVERSION(): 3.0
isReadonly(): false
getProperties(): {imqDestinationName=temporary_destination://queue/192.168.2.105/3170601277394174976/1, imqDestinationDescription=A Description for the Destination Object}]
20130225200940183 SERVER Message Received
20130225200940757 SERVER Function called is: [heartBeat]
20130225200950759 SERVER sendReply message received had ID: ID:1-192.168.2.105(b5:49:dd:bf:5b:a6)-1-1361776180058
20130225200950760 SERVER sendReply message getJMSReplyTo: Oracle GlassFish(tm) Server MQ Destination
getName(): temporary_destination://queue/192.168.2.105/3170601277394174976/1
Class: com.sun.messaging.jms.ra.TemporaryQueue
getVERSION(): 3.0
isReadonly(): false
getProperties(): {imqDestinationName=temporary_destination://queue/192.168.2.105/3170601277394174976/1, imqDestinationDescription=A Description for the Destination Object}
20130225200950777 SERVER Sending reply message
20130225200950779 SERVER Sent reply message
20130225200950780 SERVER sendReply message returned had ID: ID:2-192.168.2.105(b5:49:dd:bf:5b:a6)-1-1361776190777
20130225200950781 SERVER MAPSWebServiceMDB Message Done
20130225201010078 CLIENT Received message [null]
20130225201010080 CLIENT Browsing Queue
20130225201010092 CLIENT Found message in Queue with Browser with ID [ID:2-192.168.2.105(b5:49:dd:bf:5b:a6)-1-1361776190777] and CorrelID [ID:1-192.168.2.105(b5:49:dd:bf:5b:a6)-1-1361776180058]