1.rabbitmq的原理图:
每个Channel都是一个小的Tcp socket连接,刚开始做的都是socket连接事情,注意队列也是个数据结构,需要主动建立,channel本身也要设置。
package com.xuecheng.test.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer01 {
private static final String QUEUE="helloworld";
public static void main(String[] args) {
ConnectionFactory connectionFactory=new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);//用于本消费者连接主机(MQ)哪个端口进行通信
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//设置虚拟机,一个mq服务可以设置多个虚拟机,每个虚拟机相当于一个独立的Mq
connectionFactory.setVirtualHost("/");
Connection connection = null;
try {
connection= connectionFactory.newConnection();
//创建会话通道,生产者和mq服务所有通信都在channel通道中完成
Channel channel= connection.createChannel();
//声明队列,如果队列在mq中没有则要创建
// * 参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
// * 1、队列名称
// * 2、是否持久化,true表示持久化,当mq重启之后此队列还在
// 3、是否独占连接,队列里只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果此参数设置true可用于临时队列的创建
// 4、autoDelete 自动删除、队列不在使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队里不用了就自动删除)
// 5、可以设置一个队列的扩展参数,比如:可以设置存货时间
channel.queueDeclare(QUEUE,true,false,false,null);
//发送消息,指定交换机
//参数String exchange, String routingKey, BasicProperties props, byte[] body
/**
* 1、exchange 、交换机,如果不指定将使用Mq的默认交换机(设置为空串)
* 2、routingkey、路由key,交换机根据路由key来将消息转发到指定的队列、如果使用默认交换机、routingkey设置为队列的名称
* 3、props,消息的属性
* 4、消息体(内容)
*/
String message="hello world,i am producer";
channel.basicPublish("",QUEUE,null,message.getBytes());
System.out.println("send to mq "+ message);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
打开localhost:15672可以看到,生产者端口52067(系统自定义给定)向rabbitmq提供给生产者的通信端口发了一个信息
默认的交换机处理了这条信息
队伍queue helloworld有一条代发信息
在队伍中可以查看这个待发信息到底是什么