6 保证消息不丢失

1 消息持久化

1.1 exchange持久化

/*
 * 声明消息队列,且为可持久化的
 *
 * EXCHANGE_NAME: 交换机名称(name)
 * direct: 交换机类型(type)
 * true: 是否持久化(durable)
 * false: 是否自动删除(autoDelete)
 * null: 其他参数(arguments)
 */
 channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);

1.2 queue持久化

/*
 * 声明消息队列,且为可持久化的
 *
 * QUEUE_NAME: 队列名称(name)
 * true: 是否持久化(durable)
 * false: 是否为排他性队列(exclusive)
    1: 只对首次声明它的连接(Connection)可见
        1.1 首次声明: 因为另外一个连接无法声明一个同样的排他性队列
        1.2 只区别连接(Connection)而不是通道(Channel),从同一个连接创建的不同的通道可以同时访问某一个排他性的队列

    2: 会在其连接断开的时候自动删除
        2.1 无论队列是否被声明成持久性的(Durable =true),只要调用连接的Close方法或者客户端程序退出,RabbitMQ都会删除这个队列
        2.2 注意这里是连接断开的时候,而不是通道断开。这个其实前一点保持一致,只区别连接而非通道。

 * false: 是否自动删除(autoDelete)
 * null: 其他参数(arguments)
 */
channel.queueDeclare(QUEUE_NAME, true, false,  false,null);

1.3 消息持久化

// 消息持久化
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
// 1:不持久化 2:持久化
builder.deliveryMode(2);
AMQP.BasicProperties properties = builder.build();
/*
 * EXCHANGE_NAME: 交换机名称
 * "" : 路由key
 * properties: 基本属性
 * message: 消息体
 */
channel.basicPublish(EXCHANGE_NAME, "", properties, message.getBytes());

2 ACK确认机制

2.1 自动确认

// 自动确认
channel.basicConsume(QUEUE_NAME, true, consumer);

只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。

2.2 手动确认

// 手动确认
channel.basicConsume(QUEUE_NAME, false, consumer);

// 向服务端确认消息已被消费
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

3 AMQP事务机制


// 开启事务
try {
    String message = "I am simple_queue!";
    // 开启事务
    channel.txSelect();
    // 往队列中发出一条消息,使用rabbitmq默认交换机
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    // 提交事务
    channel.txCommit();
} catch (Exception e) {
    e.printStackTrace();
    // 事务回滚
    channel.txRollback();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值