前言:小刘没事复习了下MQ并且记录了下来!
消息队列-----Rabbit Mq
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
五种情况的消息队列
1.--HelloWorld
最简单的工作队列模式
2.--Work queues 工作队列模式
相较于第一种----多了消费者,消费者以轮询的方式分担队列中的任务
3.--Publish/Subscribe 发布、订阅
相对于第二种多了交换机。由交换机绑定到队列中,队列同时获取该交换机发布的内容。
4.--Routing 路由模式
相较于第三种,。多了routing key..通过过不同的routing key 分发不同的内容。
5.--Topics 通配符模式
/**
* 通配符 . 一个字符
* #一个或者多个字符
*/
Hello World简单代码:
package com.example;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/**最简单的工作队列* -----第二种工作队列我没写---就是多一个消费者,已轮询的方式分担任务* Hello world!**/
public class ProducerDemo01
{private final static String QUEUE_NAME = "hello";public static void main( String[] args ){ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setPort(5672);//接口factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");Connection connection = null;Channel channel = null;
// channel.queueDeclare------参数说明//String queue, 队列名称,如果mq没有该队列则自动创建// boolean durable, 是否持久化,关闭mq服务再次开启队列依然存在// boolean exclusive, 是否独自占领连接connection// boolean autoDelete, 自动删除-----该队列// Map<String, Object> arguments -----其他参数// channel.basicPublish发送参数//String exchange, 交换机---如果不指定,将使用mq的默认交换机// String routingKey, 路由key--交换机根据路由key将相机转发到指定的队列,如果使用默认的交换机,routingKey设置为队列的名称// BasicProperties props, 消息的属性---不常用try {connection = factory.newConnection();channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello World!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");} catch (Exception e) {e.printStackTrace();} finally {
// 因为Connection和Channel都实现了java.io.Closeable。这样我们就不需要在代码中明确地关闭它们。//通道关闭try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}//连接关闭try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}
消费者:
package com.example;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;/**-----也是工作队列模式* Hello world!**/
public class ConsumeDemo01
{private final static String QUEUE_NAME = "hello";public static void main( String[] args ){ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setPort(5672);//接口factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");Connection connection =null;Channel channel=null;try {connection= factory.newConnection();channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });//String queue, -----------队列// boolean autoAck, -------自动回复mq,告诉他已经接受。// DeliverCallback deliverCallback,------消费方法// CancelCallback cancelCallback} catch (Exception e) {e.printStackTrace();}finally {//消费者方通道不用关闭,需要保持持久化}}
}
温馨提示:其他模式,不再多写,无非是交换机,路由key,等参数的修改。请注重灵活运用。
如有不解,请加java爱好群大家交流:852665736;群里都是热心好客的小伙伴,大家一同进步。
无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注微信公众号:gh_817962068649