RabbitMq(二)常用JAVA API

准备清单
Erlang: 23.0.3
RabbitMq: 3.8.7

maven依赖:

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>

一、Quick Start
简单的生产和消费消息

生产者

//1:创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();

//2设置连接工厂的属性
connectionFactory.setHost("172.16.0.82");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("yunji");
connectionFactory.setUsername("huhan");
connectionFactory.setPassword("huhan");

//3:通过连接工厂创建连接对象
Connection connection = connectionFactory.newConnection();

//4:通过连接创建channel
Channel channel = connection.createChannel();

//5:通过channel发送消息
String queueName = "yunji-queue-01";
for(int i=0;i<5;i++) {
String message = "hello--"+i;
/**
* The default exchange is implicitly bound to every queue, with a routing key equal to the queue name.
* It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.
* 说明:加入我们消息发送的时候没有指定具体的交换机的话,那么就会发送到rabbimtq指定默认的交换机上,
* 那么该交换机就会去根据routing_key 查找对应的queueName 然后发送的该队列上.
*
*/
channel.basicPublish("",queueName,null,message.getBytes());
System.out.println("Send message >>> " + message);
}

//6:关闭连接
channel.close();
connection.close();

消费者

//1:创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();

//2设置连接工厂的属性
connectionFactory.setHost("172.16.0.82");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("yunji");
connectionFactory.setUsername("huhan");
connectionFactory.setPassword("huhan");

//3:通过连接工厂创建连接对象
Connection connection = connectionFactory.newConnection();

//4:通过连接创建channel
Channel channel = connection.createChannel();

//声明队列
String queueName = "yunji-queue-01";
/**
* queueName:队列的名称
* durable:是否持久化, 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使用队列持久化,
* 保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库
* exclusive:该队列是否是排它的,如果不是排外的,可以使用两个消费者都访问同一个队列,
* 没有任何问题,如果是排外的,会对当前队列加锁,其他通道channel是不能访问的,如果强制访问会报异常
* com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/', class-id=50, method-id=20)
* 一般等于true的话用于一个队列只能有一个消费者来消费的场景
* autodelete:是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,
* 查看某个队列的消费者数量,当consumers = 0时队列就会自动删除
*/
channel.queueDeclare(queueName,true,false,true,null);
System.out.println("consumer start success,waitting for message...");

//接收消息回调
DeliverCallback deliverCallback = (consumerTag, message) -> {
String msg = new String(message.getBody(), "UTF-8");
System.out.println(" [x] Received '" + msg + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });

二、消息的基本属性
发送消息的时候可以附带消息属性,参考以下demo的basicProperties;

channel.basicPublish("yunji.directchange","yunji.directchange.key",basicProperties,message.getBytes());

构造properties

Map<String,Object> headsMap = new HashMap<>();
headsMap.put("company","yunji");
headsMap.put("name","huhan");

AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder()
.deliveryMode(2)//2标识持久化消息 1标识 服务重启后 消息不会被持久化
.expiration("10000")//消息过期 10s
.contentEncoding("utf-8")
.correlationId(UUID.randomUUID().toString())
.headers(headsMap)
.build();

属性列表如下:
String contentType, – 消息类型
String contentEncoding, – 消息编码格式
Map<String,Object> headers, – 消息头 可以自定义属性
Integer deliveryMode, – 发送模式(是否持久化,1:不持久化,2:持久化)
Integer priority, – 消息优先级
String correlationId, – 关联ID
String replyTo, – 响应消息的路由
String expiration, – 过期时间
String messageId, – 消息ID
Date timestamp, – 消息创建时间
String type, – 消息类型
String userId, – 用户ID
String appId, – 应用ID
String clusterId – 集群ID

三、三种常用交换机
直接交换机:direct – 字符串完全匹配路由
主题交换机:topic – 字符串模糊匹配路由
扇形交换机:fanout – 广播路由

以下省略创建channel之前的代码
生产者

//定义交换机名称
String exchangeName = "yunji.directchange";

//定义routingKey
String routingKey = "yunji.directchange.key11111111";

//消息体内容
String messageBody = "hello yunji ";
channel.basicPublish(exchangeName,routingKey,null,messageBody.getBytes());
System.out.println("Send message -> " + messageBody);

消费者

String exchangeName = "yunji.directchange";
String exchangeType = "direct";
String queueName = "yunji.directqueue";
String routingKey = "yunji.directchange.key11111111";
/**
* 声明一个交换机
* exchange:交换机的名称
* type:交换机的类型 常见的有direct,fanout,topic等
* durable:设置是否持久化。durable设置为true时表示持久化,反之非持久化.持久化可以将交换器存入磁盘,在服务器重启的时候不会丢失相关信息
* autodelete:设置是否自动删除。autoDelete设置为true时,则表示自动删除。自动删除的前提是至少有一个队列或者交换器与这个交换器绑定,之后,所有与这个交换器绑定的队列或者交换器都与此解绑。
* 不能错误的理解—当与此交换器连接的客户端都断开连接时,RabbitMq会自动删除本交换器
* arguments:其它一些结构化的参数,比如:alternate-exchange
*/
channel.exchangeDeclare(exchangeName,exchangeType,true,false,null);

/**
* 声明一个队列
* durable:表示rabbitmq关闭删除队列
* autodelete:表示没有程序和队列建立连接 那么就会自动删除队列
*
*/
channel.queueDeclare(queueName,true,false,false,null);

/**
* 队里和交换机绑定
*/
channel.queueBind(queueName,exchangeName,routingKey);

/**
* 创建一个消费者
*/
DeliverCallback deliverCallback = (consumerTag, message) -> {
String msg = new String(message.getBody(), "UTF-8");
System.out.println(" [x] Received '" + msg + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值