channel.ExchangeDeclare(string exchange: "cjlTest",string type: "direct/topic/header/fanout",bool durable: true);服务器
参数解析:函数
exchange:名称fetch
type:有fanout、direct、topic、header;选择合适本身的ui
durable:是否开启持久化exchangespa
autoDelete: 当已经没有消费者时,服务器是否能够删除该exchangeblog
fanout类型的Exchange路由规则很是简单,它会把全部发送到该Exchange的消息路由到全部与它绑定的Queue中。 队列
上图中,生产者(P)发送到Exchange(X)的全部消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费。事件
direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key彻底匹配的Queue中。ip
以上图的配置为例,以routingKey=”error”发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);若是咱们以routingKey=”info”或routingKey=”warning”来发送消息,则消息只会路由到Queue2。若是咱们以其余routingKey发送消息,则消息不会路由到这两个Queue中。路由
前面讲到direct类型的Exchange路由规则是彻底匹配binding key与routing key,但这种严格的匹配方式在不少状况下不能知足实际业务需求。
topic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchage类似,也是将消息路由到binding key与routing key相匹配的Queue中,但这里的匹配规则有些不一样,它约定:
以上图中的配置为例,routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);
routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,由于它们没有匹配任何bindingKey。
headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。 该类型exchange不太经常使用
channel.basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
参数解析:
prefetchSize:消息的大小
prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息尚未ack,则该consumer将block掉,直到有消息ack
global:是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的仍是consumer级别
void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException;
参数解析:
exchange:名称
routingKey:路由键,#匹配0个或多个单词,*匹配一个单词,在topic exchange作消息转发用
mandatory:为true时若是exchange根据自身类型和消息routeKey没法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者。
为false时出现上述情形broker会直接将消息扔掉
immediate:为true时若是exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的全部queue(一个或多个)都没有消费者时,该消息会经过basic.return方法返还给生产者。
props:须要注意的是BasicProperties.deliveryMode,1:不持久化 2:持久化 这里指的是消息的持久化,配合channel(durable=true),queue(durable)能够实现,即便服务器宕机,消息仍然保留
body:要发送的信息
void basicAck(long deliveryTag, boolean multiple) throws IOException;
参数解析
deliveryTag:该消息的index
multiple:是否批量处理.true:将一次性ack全部小于deliveryTag的消息。
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
参数解析
deliveryTag:该消息的index
multiple:是否批量.true:将一次性拒绝全部小于deliveryTag的消息。
requeue:被拒绝的是否从新入队列
void basicReject(long deliveryTag, boolean requeue) throws IOException;
参数解析
deliveryTag:该消息的index
requeue:被拒绝的是否从新入队列
channel.basicNack 与 channel.basicReject 的区别在于basicNack能够拒绝多条消息,而basicReject一次只能拒绝一条消息
String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
参数解析
queue:队列名称
autoAck:是否自动ack,若是不自动ack,须要使用channel.ack、channel.nack、channel.basicReject 进行消息应答callback:回调函数,一个事件
用于经过绑定bindingkey讲queue到exchange,以后即可以进行消息接收
Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
durable:true、false true:在服务器重启时,可以存活
exclusive :是否为当前链接的专用队列,在链接断开后,会自动删除该队列,生产环境中应该不多用到吧。
autodelete:当没有任何消费者使用时,自动删除该队列