RabbitMQ简单Java示例——生产者和消费者

Posted <・)))><<

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ简单Java示例——生产者和消费者相关的知识,希望对你有一定的参考价值。

添加Maven依赖:

使用rabbitmq-client的最新Maven坐标:

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.3.0</version>
</dependency>

添加账户

默认情况下,访问RabbitMQ服务的用户名和密码都是“guest”,这个账号有限制,默认只能通过本地网络(如localhost)访问,远程网络访问受限,所以在实现生产和消费消息之前,需要另外添加一个用户,并设置相应的访问权限。

添加新用户,用户名为“zifeiy”,密码为“passwd”:

C:Userszifeiy>rabbitmqctl add_user zifeiy passwd
Adding user "zifeiy" ...

为zifeiy用户设置所有权限:

C:Userszifeiy>rabbitmqctl set_permissions -p / zifeiy ".*" ".*" ".*"
Setting permissions for user "zifeiy" in vhost "/" ...

设置用户zifeiy为管理员角色:

C:Userszifeiy>rabbitmqctl set_user_tags zifeiy administrator
Setting tags for user "zifeiy" to [administrator] ...

计算机的世界是从“Hello World!”开始的,这里我们也沿用惯例,首先生产者发送一条消息”Hello World!“至RabbitMQ中,之后由消费者消费。
下面先演示生产者客户端的代码,然后再演示消费者客户端的代码。

生产者客户端代码

package com.zifeiy.springtest.rabbitmq;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

public class RabbitProducer {
    private static final String EXCHANGE_NAME = "exchange_demo";
    private static final String ROUTING_KEY = "routingkey_demo";
    private static final String QUEUE_NAME = "queue_demo";
    private static final String IP_ADDRESS = "127.0.0.1";
    private static final int PORT = 5672;   // RabbitMQ服务端默认端口号为5672
    
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(IP_ADDRESS);
        factory.setPort(PORT);
        factory.setUsername("zifeiy");
        factory.setPassword("passwd");
        Connection connection = factory.newConnection();    // 建立连接
        Channel channel = connection.createChannel();       // 创建信道
        // 创建一个type="direct"、持久化的、非自动删除的交换器
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
        // 创建一个持久化、非排他的、非自动删除的队列
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        // 将交换器和队列通过路由绑定
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
        // 发送一条持久化的消息:hello world!
        String message = "hello,world!";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, 
                    MessageProperties.PERSISTENT_TEXT_PLAIN, 
                    message.getBytes());
        // 关闭资源
        channel.close();
        connection.close();
    }
}

运行。

消费者客户端代码

package com.zifeiy.springtest.rabbitmq;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Address;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.Connection;

public class RabbitConsumer {
    private static final String QUEUE_NAME = "queue_demo";
    private static final String IP_ADDRESS = "127.0.0.1";
    private static final int PORT = 5672;
    
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        Address[] addresses = new Address[] {
                new Address(IP_ADDRESS, PORT)
        };
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("zifeiy");
        factory.setPassword("passwd");
        // 这里的连接方式与生产者的demo略有不同,注意区分
        Connection connection = factory.newConnection(addresses);   // 创建连接
        final Channel channel = connection.createChannel(); // 创建信道
        channel.basicQos(64);   // 设置客户端最多接受未被ack的消息的个数
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, 
                            AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("recv message: " + new String(body));
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        channel.basicConsume(QUEUE_NAME, consumer);
        // 等待回调函数执行完毕后,关闭资源
        TimeUnit.SECONDS.sleep(5);
        channel.close();
        connection.close();
    }
}

运行,命令行输出如下:

recv message: hello,world!

以上是关于RabbitMQ简单Java示例——生产者和消费者的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ第二篇:java简单的实现RabbitMQ

rabbitMQ模式介绍一(生产-消费者)

RabbitMQ基本示例

RabbitMQ介绍4 - 编程(C#客户端示例)

c++实现RabbitMQ简单的生产者和消费者

RabbitMQ/JAVA 客户端测试(补:利用线程)