前言:小刘没事复习了下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