RabbitMQ-HelloWorld

90 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

编写第一个RabbitMQ程序

我们将用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印 出来的消费者。

导入相关依赖

    <!-- rabbitmq 客户端依赖  -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>ampq-client</artifactId>
        <version>5.8.0</version>
    </dependency>
    
    <!-- 文件流操作依赖 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

编写生产者代码

public class Producer { 

    private final static String QUEUE_NAME = "hello"; 
    public static void main(String[] args) throws Exception 
    { 
        //创建一个连接工厂 
        ConnectionFactory factory = new ConnectionFactory(); 
        factory.setHost("182.92.234.71"); 
        factory.setUsername("admin"); 
        factory.setPassword("123"); 

        //channel 实现了自动 close 接口 自动关闭 不需要手动关闭 
        try(Connection connection =factory.newConnection();
           Channel channel = connection.createChannel()){ 
           
        channel.queueDeclare(QUEUE_NAME,false,false,false,null); 
        String message="hello world";
 
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); 
        
        System.out.println("消息发送完毕"); 
        }
    } 
}

代码解释:

  • 创建一个连接的工厂

    • 设置链接地址

    • 设置连接用户名及密码

  • 创建一个数据传输的信道

    • 生成一个队列:channel.queueDeclare(QUEUE_NAME,false,false,false,null)

    • 参数说明:

      1.队列名称

      2.队列里面的消息是否持久化 默认消息存储在内存中

      3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费

      4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除

      5.其他参数

  • 发送一个消息:channel.basicPublish("",QUEUE_NAME,null,message.getBytes())

    1.发送到那个交换机

    2.路由的 key 是哪个

    3.其他的参数信息

    4.发送消息的消息体

编写消费者代码

public class Consumer { 

    private final static String QUEUE_NAME = "hello"; 
    public static void main(String[] args) throws Exception { 

        ConnectionFactory factory = new ConnectionFactory(); 
        factory.setHost("182.92.234.71"); 
        factory.setUsername("admin"); 
        factory.setPassword("123"); 

        Connection connection = factory.newConnection(); 
        Channel channel = connection.createChannel(); 
        System.out.println("等待接收消息...."); 
        
        //推送的消息如何进行消费的接口回调
        DeliverCallback deliverCallback=(consumerTag,delivery)->{ 
            String message= new String(delivery.getBody()); 
            System.out.println(message); 
        }; 

        //取消消费的一个回调接口 如在消费的时候队列被删除掉了 
        CancelCallback cancelCallback=(consumerTag)->{ 
            System.out.println("消息消费被中断"); 
        };

        channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback); 
    } 
}

参数说明:

  • 消费者消费消息:channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);

1.消费哪个队列

2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答

3.消费者未成功消费的回调

结果: 当生产者程序每次运行生成消息时消费者会接收到生成的消息并打印。