它其实主要就是接受和转发消息,你可以把他理解成邮箱,当你把你想要发布的邮件信箱,可以肯定的是,邮差先生最终会交付收件人的邮件。在这个比喻中,RabbitMQ信箱,一个邮局和一个邮差。
RabbitMQ和邮局之间的主要区别是,它不处理,相反,它接受数据,消息的存储和转发的二进制文件。
· 发布者,相当于是寄信人。把你所需要传递的消息丢到邮箱:
· 消费者,相当于收件人。消费者大多是一个程序,等待接收消息:
· RabbitMQ新建一个队列,这个队列相当于信箱。尽管通过RabbitMQ消息流和应用程序,他们只能存储在一个队列。队列只受主人的内存和磁盘限制,它本质上是一个大消息缓冲区。许多生产商可以将消息发送到一个队列,和许多消费者可以接收数据从一个队列。这就是我们如何代表一个队列:
在下面的图中,“P”是我们的发布者,“C”是我们消费者。中间的框是一个队列
Windows环境搭建:http://www.cnblogs.com/ericli-ericli/p/5902270.html
将RabbitMQ环境变量搭好以后,访问:http://127.0.0.1:15672/,使用刚创建的用户进行登录。
进入admin的配置界面,配置虚拟主机的读取权限
RabbitMQ关闭、开启指令
net stop rabbitMQ 关闭
net start rabbitMQ 开启
下载客户端库及其依赖项(SLF4J API和SLF4J简单)
Maven的pom依赖如下
<dependency>
<groupId>com.rabbitmqgroupId>
<artifactId>amqp-clientartifactId>
<version>3.3.4version>
dependency>
客户端库:rabbitmq-client.jar
依赖库:slf4j-api-1.7.21.jar、slf4j-simple-1.7.22.jar
发布者发布消息到队列,代码如下
package MQ;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public classSend {
private final static String QUEUE_NAME ="hello";
public static void main(String[] args)throws IOException,TimeoutException {
// 创建连接连接到MabbitMQ
ConnectionFactoryfactory = newConnectionFactory();
// 设置MabbitMQ所在主机ip或者主机名
factory.setHost("127.0.0.1");
// factory.setUsername("yuanh");
// factory.setPassword("yuanh");
// factory.setPort(5672);
// factory.setVirtualHost("y_yuanh");
Connectionconnection = factory.newConnection();
// 创建一个频道
Channelchannel = connection.createChannel();
// 创建一个队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
Stringmessage = "Hello World!";
// 将消息放到队列里面
channel.basicPublish("",QUEUE_NAME,null, message.getBytes());
System.out.println("发送 '" + message +"'");
//关闭通道和连接
channel.close();
connection.close();
}
}
当你有配置虚拟主机,以及用户需要密码验证的时候,则需要加上
factory.setUsername("yuanh");
factory.setPassword("yuanh");
factory.setPort(5672);
factory.setVirtualHost("y_yuanh");
RabbitMQ中的hello队列接收发送消息,后台显示有一条为送出的记录,如图
为虚拟主机添加用户
消费者从队列中取出消息,消费者保持运行监听消息并打印出来。代码如下
package MQ;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
@SuppressWarnings("deprecation")
public classRecv {
private final static String QUEUE_NAME ="hello";
public static void main(String[] argv)throws Exception {
// 创建连接连接到MabbitMQ
ConnectionFactoryfactory = newConnectionFactory();
// 设置MabbitMQ所在主机ip或者主机名
factory.setHost("127.0.0.1");
factory.setUsername("yuanh");
factory.setPassword("yuanh");
factory.setPort(5672);
factory.setVirtualHost("y_yuanh");
Connectionconnection = factory.newConnection();
Channelchannel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
System.out.println(" [*] Waiting for messages. To exit pressCTRL+C");
QueueingConsumerconsumer = newQueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME,true, consumer);
try {
while (true) {
QueueingConsumer.Deliverydelivery = consumer.nextDelivery();
Stringmessage = newString(delivery.getBody());
System.out.println(" [x] Received '"+ message +"'");
}
}catch(Exception e) {
channel.close();
connection.close();
}
}
}
hello队列中的消息被消化