rabbitmq.channel参数详解
channel.exchangeDeclare():使用fanout类型创建的交换机
1、type:有direct、fanout、topic三种
2、durable:true、false true:服务器重启会保留下来Exchange。警告:仅设置此选项,不代表消息持久化。即不保证重启后消息还在
3、autoDelete:true、false.true:当已经没有消费者时,服务器是否可以删除该Exchange
Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
chanel.basicQos(): 同一时刻服务器发多少条消息给消费者
1、prefetchSize:0
2、prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack
3、global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别
void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
channel.basicPublish(): 向server发布一条消息
1、routingKey:路由键,#匹配0个或多个单词,*匹配一个单词,在topic exchange做消息转发用
2、mandatory:true:如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者。false:出现上述情形broker会直接将消息扔掉
3、mmediate:true:如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。
4、BasicProperties :需要注意的是BasicProperties.deliveryMode,0:不持久化 1:持久化 这里指的是消息的持久化,配合channel(durable=true),queue(durable)可以实现,即使服务器宕机,消息仍然保留
简单来说:mandatory标志告诉服务器至少将该消息route到一个队列中,否则将消息返还给生产者;immediate标志告诉服务器如果该消息关联的queue上有消费者,则马上将消息投递给它,如果所有queue都没有消费者,直接把消息返还给生产者,不用将消息入队列等待消费者了。
void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
throws IOException;
channel.basicAck(): 消息处理完成,手动确认提交
1、deliveryTag:该消息的index
2、multiple:是否批量.true:将一次性ack所有小于deliveryTag的消息。
void basicAck(long deliveryTag, boolean multiple) throws IOException;
channel.basicConsume(): 消息消费完成确认
1、autoAck:是否自动ack,如果不自动ack,需要使用channel.ack、channel.nack、2、channel.basicReject 进行消息应答
String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
channel.queueDeclare(): 声明一个队列
1、durable:true、false true:在服务器重启时,能够存活
2、exclusive :是否为当前连接的专用队列,在连接断开后,会自动删除该队列,生产环境中应该很少用到吧。
3、autodelete:当没有任何消费者使用时,自动删除该队列。
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
channel.queueBind(): 将队列跟交换器进行绑定
1、queue:队列名称
2、exchange:交换机名称
3、routingKey:队列跟交换机绑定的键值
channel.queueBind(queueName, EXCHANGE_NAME, "black");