当前位置: 代码迷 >> 综合 >> Rabbit Mq的简单使用
  详细解决方案

Rabbit Mq的简单使用

热度:14   发布时间:2023-12-15 13:06:36.0

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