RabbitMQ 消费者没有收到生产者发送的消息
RabbitMQ Consumer not receiving messages sent from Producer
您好,我正在尝试通过 rabbitMQ 发送消息。我正在声明一个直接交换并将其路由到我在生产者端的队列,但我无法在我的消费者处接收消息。以下是我的消费者的代码:
package com.rabbit.consumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.*;
public class Consumer {
private final static String QUEUE_NAME = "credit1";
public static void main(String[] args) throws IOException, TimeoutException {
boolean autoAck = false;
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
//channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
/* DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);*/
channel.basicConsume(QUEUE_NAME, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here ...)
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'" + "Routing Key : "+ routingKey);
channel.basicAck(deliveryTag, false);
}
@Override
public void handleShutdownSignal(String consumerTag,
ShutdownSignalException sig) {
// TODO Auto-generated method stub
System.out.println("Recieving Ended");
System.out.println("Channel Closed : " + sig.getMessage());
}
});
}
}
而我的生产者代码如下:
package com.rabbit.producer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP.Exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import com.rabbitmq.client.ReturnListener;
import com.rabbitmq.client.AMQP.BasicProperties;
public class Producer {
private static final String QUEUE_NAME = "credit1";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("offerExchange", "direct", true);
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, "offerExchange", "credit");
channel.addReturnListener(new ReturnListener() {
public void handleReturn(int replyCode,
String replyText,
String exchange,
String routingKey,
BasicProperties properties,
byte[] body) throws IOException {
// TODO Auto-generated method stub
System.out.println("Message Failed" + replyText);
}
});
String message = "Hello rabbit just hop !";
/* for(int i=1;i<=100000;i++){*/
channel.basicPublish("offerExchange", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
/* }*/
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
好的,我得到的答案错误是在这一行
channel.queueBind(QUEUE_NAME, "offerExchange", "credit");
我声明了队列 credit1 并绑定到 credit。愚蠢的错误。
您好,我正在尝试通过 rabbitMQ 发送消息。我正在声明一个直接交换并将其路由到我在生产者端的队列,但我无法在我的消费者处接收消息。以下是我的消费者的代码:
package com.rabbit.consumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.*;
public class Consumer {
private final static String QUEUE_NAME = "credit1";
public static void main(String[] args) throws IOException, TimeoutException {
boolean autoAck = false;
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
//channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
/* DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);*/
channel.basicConsume(QUEUE_NAME, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here ...)
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'" + "Routing Key : "+ routingKey);
channel.basicAck(deliveryTag, false);
}
@Override
public void handleShutdownSignal(String consumerTag,
ShutdownSignalException sig) {
// TODO Auto-generated method stub
System.out.println("Recieving Ended");
System.out.println("Channel Closed : " + sig.getMessage());
}
});
}
}
而我的生产者代码如下:
package com.rabbit.producer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP.Exchange;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import com.rabbitmq.client.ReturnListener;
import com.rabbitmq.client.AMQP.BasicProperties;
public class Producer {
private static final String QUEUE_NAME = "credit1";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("offerExchange", "direct", true);
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, "offerExchange", "credit");
channel.addReturnListener(new ReturnListener() {
public void handleReturn(int replyCode,
String replyText,
String exchange,
String routingKey,
BasicProperties properties,
byte[] body) throws IOException {
// TODO Auto-generated method stub
System.out.println("Message Failed" + replyText);
}
});
String message = "Hello rabbit just hop !";
/* for(int i=1;i<=100000;i++){*/
channel.basicPublish("offerExchange", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
/* }*/
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
好的,我得到的答案错误是在这一行
channel.queueBind(QUEUE_NAME, "offerExchange", "credit");
我声明了队列 credit1 并绑定到 credit。愚蠢的错误。