java直接消费rabbitmq_RabbitMQ简单Java示例——生产者和消费者

添加Maven依赖:

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

com.rabbitmq

amqp-client

5.3.0

添加账户

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

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

C:\Users\zifeiy>rabbitmqctl add_user zifeiy passwd

Adding user "zifeiy" ...

为zifeiy用户设置所有权限:

C:\Users\zifeiy>rabbitmqctl set_permissions -p / zifeiy ".*" ".*" ".*"

Setting permissions for user "zifeiy" in vhost "/" ...

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

C:\Users\zifeiy>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!

你可能感兴趣的:(java直接消费rabbitmq_RabbitMQ简单Java示例——生产者和消费者)