RabbitMQ生产者和消费者helloworld&踩坑指北

1.生产者代码:

package com.atguigu.rabitmq.one;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Producer {
    private final static String QUEUE_NAME = "hello";
    public static void main(String[] args) throws Exception {
        //创建一个连接工厂
        ConnectionFactory factory=new ConnectionFactory();
        //工厂ip连接Rabbitmq的队列
        factory.setHost("192.168.1.189");
        //用户名
        factory.setUsername("root");
        factory.setPassword("123");
        //创建链接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        //创建一个队列
        // /**
        // * 生成一个队列
        // * 1.队列名称
        // * 2.队列里面的消息是否持久化 默认消息存储在内存中
        // * 3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
        // * 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
        // * 5.其他参数
        // */
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        String message="hello world";
        System.out.println("消息正在发送");
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("消息已发送");
//channel 实现了自动 close 接口 自动关闭 不需要显示关闭
    }
}

2.消费者代码:

package com.atguigu.rabitmq.one;

import com.rabbitmq.client.*;

public class Consumer {
    //队列名称
    public static final String QUEUE_NAME="hello";
    //接收消息
    public static void main(String[] args) throws Exception{
        //创建连接工厂
        ConnectionFactory factory=new ConnectionFactory();
        //工厂ip连接Rabbitmq的队列
        factory.setHost("192.168.1.189");
        //用户名
        factory.setUsername("root");
        factory.setPassword("123");
        Connection connection = factory.newConnection();

        Channel channel = connection.createChannel();

        //声明,接受消息回调
        DeliverCallback deliverCallback=(consumerTag,message)->{
            System.out.println(new String(message.getBody()));
        };

        //声明,取消消息回调
        CancelCallback cancelCallback=consumerTag->{
            System.out.println("消息消费中断");
        };
        //接收消息
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
    }
}

3.过程&结果

首先运行生产者,结果:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
消息正在发送
消息已发送

运行消费者后,需要再次运行生产者,显示结果:

hello world

4.踩坑1,

RabbitMQ需要配置两个安全规则,一个管理工具的端口15672,一个5672。
打开15672端口:
[root@node04 network-scripts]# firewall-cmd --add-port=15672/tcp --permanent

打开5672端口:
[root@node04 network-scripts]# firewall-cmd --zone=public --add-port=5672/tcp --permanent
success
[root@node04 network-scripts]# firewall-cmd --reload
success
[root@node04 network-scripts]# firewall-cmd --list-ports
15672/tcp 5672/tcp

5.踩坑2

点进账号里面,把Virtua lHost为【/】的set permission给用户,然后再重新启动项目,
项目是springboot结构,win10下安装RabbitMQ,自己配置的一个虚拟主机和用户账号,在RabbitMQ管理界面上有把虚拟主机分配给用户,但是没有把系统默认的Virtua lHost为【/】分配给用户造成的,所以解决办法把Virtua lHost为【/】分配给用户就可解决。
参考:
原博主解答


版权声明:本文为weixin_43899452原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。