Java JMS receiveNoWait()是否保证在消息可用时传递消息?
您好,我正在编写某种简单的测试场景,其中执行以下源代码: 这是我的send()方法:Java JMS receiveNoWait()是否保证在消息可用时传递消息?,java,jms,rabbitmq,activemq,jboss-messaging,Java,Jms,Rabbitmq,Activemq,Jboss Messaging,您好,我正在编写某种简单的测试场景,其中执行以下源代码: 这是我的send()方法: public void send() throws JMSException { Session session = null; MessageProducer producer = null; try { session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Des
public void send() throws JMSException {
Session session = null;
MessageProducer producer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
byte[] uselessData = new byte[1024];
BytesMessage message = session.createBytesMessage();
message.writeBytes(uselessData);
producer.send(message);
} finally {
producer.close();
session.close();
}
}
public void receive() throws JMSException {
Session session = null;
MessageConsumer consumer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
consumer = session.createConsumer(destination);
Message hugeMessage = consumer.receiveNoWait();
if (hugeMessage == null) {
System.out.println("Message was not received");
unsucsesfullCount++;
} else {
if (hugeMessage instanceof BytesMessage) {
System.out.println("Message received");
}
}
} finally {
consumer.close();
session.close();
}
}
send();
receive();
这是我的receive()方法:
public void send() throws JMSException {
Session session = null;
MessageProducer producer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
byte[] uselessData = new byte[1024];
BytesMessage message = session.createBytesMessage();
message.writeBytes(uselessData);
producer.send(message);
} finally {
producer.close();
session.close();
}
}
public void receive() throws JMSException {
Session session = null;
MessageConsumer consumer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
consumer = session.createConsumer(destination);
Message hugeMessage = consumer.receiveNoWait();
if (hugeMessage == null) {
System.out.println("Message was not received");
unsucsesfullCount++;
} else {
if (hugeMessage instanceof BytesMessage) {
System.out.println("Message received");
}
}
} finally {
consumer.close();
session.close();
}
}
send();
receive();
我执行:
public void send() throws JMSException {
Session session = null;
MessageProducer producer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
byte[] uselessData = new byte[1024];
BytesMessage message = session.createBytesMessage();
message.writeBytes(uselessData);
producer.send(message);
} finally {
producer.close();
session.close();
}
}
public void receive() throws JMSException {
Session session = null;
MessageConsumer consumer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
consumer = session.createConsumer(destination);
Message hugeMessage = consumer.receiveNoWait();
if (hugeMessage == null) {
System.out.println("Message was not received");
unsucsesfullCount++;
} else {
if (hugeMessage instanceof BytesMessage) {
System.out.println("Message received");
}
}
} finally {
consumer.close();
session.close();
}
}
send();
receive();
receiveNoWait()之后的消息值始终为null
我这里的问题是,receiveNoWait()是否在代理中有消息时保证消息传递?已成功执行发送(),因此目标中至少有一条消息
我在规范中进行了搜索,但没有真正明确的定义,即代理端可用的消息是否应该由客户端的receiveNoWait()显式接收
我还想问,如果receiveNoWait()没有可用的消息,它是否应该在代理中触发一些刷新消费者进程,以便下一个receiveNoWait()将接收消息
我提供的示例代码在ActiveMQ上运行,但我的问题比特定于提供程序的问题更具概念性,因为我对其他JMS提供程序也有相同的观察。否,该规范不保证对
receiveNoWait
的任何调用都会返回消息,它可能会返回,也可能不会返回。使用receiveNoWait
时,必须始终检查是否返回空值,并采取相应措施
在ActiveMQ的情况下,如果代理已向客户端发送了一条消息,并且该消息立即在使用者预取缓冲区中可用,则客户端将返回一条消息,否则它只返回null
其他实现确实会向代理发送轮询请求,例如,Qpid JMS使用AMQP链路耗尽请求请求请求代理向其发送任何可供分派的消息,代理将发送这些消息,或者发出信号表明链路耗尽,并且没有消息准备就绪
简言之,这完全取决于客户机和代理如何实现
receiveNoWait
,但无论您需要做什么,都要考虑到无法从该方法返回消息的可能性 谢谢你的回答,蒂姆。我的理解是一样的,但由于规范中缺乏适当的解释,我决定寻求更多的意见。仅供参考,有一个关于此标准的旧的未解决的错误报告。关于如何提出问题的好例子!