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