【发布时间】:2013-02-22 05:13:17
【问题描述】:
我有一个实现消息生产者的 Java 类,它将消息发送到名为 test 的队列。我有另一个类作为客户端,它从同一个队列中获取消息。我对如何知道客户端是否已收到消息感到困惑。我在某处读到我应该使用message.acknowledge(),但我不知道执行此操作的正确方法。我的代码如下所示:
制作人:
public class Producer {
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static String subject = "que";
public static void main(String[] args) throws JMSException,
InterruptedException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
MessageProducer producer = session.createProducer(destination);
//
int i = 0;
//while(true)
// {
TextMessage message = session
.createTextMessage("this is a gfjfjf " + i);
Thread.sleep(2000);
//
producer.send(message);
i++;
System.out.println("Sent message '" + message.getText() + "'");
System.out.println(ActiveMQConnection.DEFAULT_BROKER_URL);
MessageListener ML = session.getMessageListener();
System.out.println(ML);
connection.close();
}
}
消费者:
public class Consumer {
private static String url = "failover://tcp://192.168.1.17:61616";
private static String subject = "que";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
MessageConsumer consumer = session.createConsumer(destination);
// while(true)
// {
Message message = consumer.receive();
System.out.println(message);
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received message '" + textMessage.getText()
+ "'");
}
if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) {
System.out.println(session.getAcknowledgeMode());
System.out.println(Session.CLIENT_ACKNOWLEDGE);
message.acknowledge();
}
System.out.println(session.getAcknowledgeMode());
System.out.println(Session.CLIENT_ACKNOWLEDGE);
message.acknowledge();
}
}
任何帮助表示赞赏。
【问题讨论】:
-
@Perception 你知道如何解决这个问题吗?
-
很少使用客户端确认。你需要它有什么特别的原因吗?如果是这样,在您的客户端,使用
connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);创建您的会话。请注意,在自动确认模式下,运行时会为您处理所有这些,包括消息重新传递。 -
@Perception 没问题,但我将如何检查确认
-
@Perception 如果它被确认,那么它会发送一个真/假或任何东西
-
不,确认模式控制接收者(客户端)和 JMS 提供者(不是消息生产者)之间的交互。在这种情况下,生产者基本上是一劳永逸,让提供者和接收者确定是否需要重新传递消息等。Here 是您可以就该主题做的一些阅读。
标签: java queue jms activemq producer-consumer