一.RabbitMq的术语解释
exchange:交换机,一个交换机可以有多个路由(而每一个路由分别指向一个队列)。
queue:队列,一个队列可以对应多个交换机。
route-key:路由key,绑定交换机与队列的关系
交换机和队列是多对多的关系。
注意:
- 一个broker中,交换机的name名字是唯一的,队列的name名字也是唯一的。
- 发送消息的时候,必须指定发送的交换机和路由key,才能发送到对应的队列中
- 接收消息的时候,只需要指定队列的名称,便可消费消息。
二.消息中间件的结构流程图--发送消息
说明:
1.连接到rabbitmq的一个broker,得到一个channel通道
2.声明一个交换机,如果不存在就创建,如果存在就忽略
3.声明一个队列,如果不存在就创建,如果存在就忽略
4.通过路由key绑定交换机和队列的关系
5.发送消息时,指定交换机,路由。然后交换机就根据路由发送到对应的队列上。
三.消息中间件的结构流程图--接收消息
说明:
1.连接到rabbitmq的一个broker,得到一个channel通道
2.指明队列,获取消息
3.处理消息
四.java代码
消息发送代码:
public static void main(String[] args) throws IOException, TimeoutException { //创建连接工厂 ConnectionFactory cf=new ConnectionFactory(); //设置用户信息,用户名-密码 cf.setUsername("guest"); cf.setUsername("guest"); //broker的ip,端口号 cf.setHost("127.0.0.1"); cf.setPort(5672); //得到连接 Connection conn= cf.newConnection(); //创建一个通道 Channel channel=conn.createChannel(); //durable-消息是否持久化(true,broker重启后消息还存在) //声明一个交换机,不存在就创建,存在就什么也不做 Exchange.DeclareOk declare=channel.exchangeDeclare("test.exchange1", "direct", true); //声明一个队列,不存在就创建,存在就什么也不做 String queue=channel.queueDeclare("test.queue", false, false, false, null).getQueue(); //通过一个路由绑定交换机与队列的关系,不存在就创建,存在就什么也不做 channel.queueBind(queue, "test.exchange", "test"); //发送消息,指明交换机名称,路由。交换机收到消息后,通过路由发送到对应的队列中 channel.basicPublish("test.exchange", "test", null, "hello world".getBytes()); conn.close(); }
消息接收代码:
public static void main(String[] args) throws IOException, TimeoutException { //创建连接工厂 ConnectionFactory cf=new ConnectionFactory(); //设置用户信息,用户名-密码 cf.setUsername("guest"); cf.setUsername("guest"); //broker的ip,端口号 cf.setHost("127.0.0.1"); cf.setPort(5672); //得到连接 Connection conn= cf.newConnection(); //创建一个通道 Channel channel=conn.createChannel(); //指明要获取哪个队列的消息 GetResponse response= channel.basicGet("test.queue", true); System.out.println(new String(response.getBody())); conn.close(); }