Exchange 和 Message 和 Queue 都要持久化 以保证服务器重启消息不丢失。
- Exchange :生产者消费者
channel.exchangeDeclare(EXCHANGE_NAME, "direct",true);
- Message :MessageProperties.PERSISTENT_TEXT_PLAIN 生产者
channel.basicPublish(EXCHANGE_NAME, "debug",MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
-
Queue :消费者
channel.queueDeclare(queueName, true, false, false, null);
import com.mq.rabbit.Test.ConnectionUtil;
import com.rabbitmq.client.*;
import java.io.IOException;
public class Produce {
private static final String EXCHANGE_NAME = "direct_02";
private static final String DIRECT = "debug";
private static void product() throws Exception {
// 创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 创建一个持久化的交换器
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
String message = "testMessage";
// 创建一个持久化的消息 MessageProperties.PERSISTENT_TEXT_PLAIN
channel.basicPublish(EXCHANGE_NAME, DIRECT, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
System.out.println("生产者发送" + message + "'");
// 关闭频道和连接
channel.close();
connection.close();
}
public static void customer() throws Exception {
// 创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 指定一个持久化交换器
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
String queueName = "hello";
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, EXCHANGE_NAME, DIRECT);
// 创建队列消费者
final Consumer 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("消费者接收到消息 '" + message + "'");
}
};
channel.basicConsume(queueName, true, consumer);
}
public static void main(String[] args) throws Exception {
customer();
product();
}
}