RabbitMQ基础学习01

// base demo

ConnectionFactory connectionFactory = newConnectionFactory();
connectionFactory.setHost("127.0.0.1");
Connection connection =connectionFactory.newConnection();
Channel channel =connection.createChannel();
channel.queueDeclare(QUEUE_NAME,false, false, false, null);
String message = "Hi,I am Leo";
channel.basicPublish("",QUEUE_NAME, null, message.getBytes());
System.out.println(" sent'"+message+"' ");
channel.close();
connection.close();


ConnectionFactory connectionFactory = newConnectionFactory();
connectionFactory.setHost("127.0.0.1");
Connection connection =connectionFactory.newConnection();
Channel channel =connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false,null);
System.out.println(" [*] waiting formessage. ");

QueueingConsumer consumer = newQueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true,consumer);

while(true){
QueueingConsumer.Deliverydelivery = consumer.nextDelivery(); //Delivery 传送
Stringmessage = new String(delivery.getBody());
System.out.println(" received '"+message+"' ");
}


Connection: 就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQServer的。从上面的demo可以看到,程序的起始处就是建立这个TCP连接。

Channels: 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。

[b]创建connection(TCP连接) --> 创建channel --> 声明消息队列 [/b]

在RabbitMQ中,无论是生产者发送消息、还是消费者接收消息,都需要先声明一个消息队列(MessageQueue)。这就存在一个问题:是生产者声明还是消费者声明?要解决这个问题,首先需要明确:

1. 消费者是无法订阅或者获取不存在的队列中的消息

2. 消息被Exchange接收以后,如果没有匹配的Queue,则会被丢弃

从第1点可以知道消费者在接收消息之前需要声明队列,否则可能会导致无法订阅/获取

从第2点可以知道生产者需要在发送消息之前声明队列,否则可能会导致消息丢失

所以无论生产者还是消费者,在生产/接受之前都需要声明队列,并且如果客户端声明一个已经存在的队列,RabbitMQ不会做任何操作,直接返回成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值