为了防止众所周知的身份信息用于生产环境的系统,guest只能用来访问本地。
channel可以主动关闭,但是这不是必须的,在关闭它所依赖的连接时,channel也会自动被关闭。
connection设计为长连接。
有个no wait 版本的队列
1
2 1channel.queueDeclareNoWait(queueName, true, false, false, null);
2
这种队列不接收rabbitmq的返回消息。效率更高,但是安全性低。只适合复杂拓扑结构的生产情景。依赖心跳机制发现错误操作。
删除队列
1
2 1channel.queueDelete("queue-name")
2
只删除空队列
1
2 1channel.queueDelete("queue-name", false, true)
2
只删除不被使用(没有消费者连接)的队列
1
2 1channel.queueDelete("queue-name", true, false)
2
清空一个队列
1
2 1channel.queuePurge("queue-name")
2
添加消息头
1
2
3
4
5
6
7
8
9
10 1Map<String, Object> headers = new HashMap<String, Object>();
2headers.put("latitude", 51.5252949);
3headers.put("longitude", -0.0905493);
4
5channel.basicPublish(exchangeName, routingKey,
6 new AMQP.BasicProperties.Builder()
7 .headers(headers)
8 .build()),
9 messageBodyBytes);
10
带过期时间的消息:
1
2
3
4
5
6 1channel.basicPublish(exchangeName, routingKey,
2 new AMQP.BasicProperties.Builder()
3 .expiration("60000")
4 .build()),
5 messageBodyBytes);
6
通道和并发注意事项
- 避免在多个线程中共享通道,而是每个线程一个通道。
- 通道中的一些操作可以并发执行,一些不行(比如可能会导致二次ack)
- 为每一个publish创建一个channel也是不可取的,channel被设计为长连接,可以复用,创建太多影响性能。