RabbitMQ基础知识

Routing key由生产者指定。Binding key由消费者指定。二者联合决定一条消息的来去。

[size=large][color=black][b]连接[/b][/color][/size]
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(hostName);
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();


[list]
[*]以上是得到一个rabbitmq连接最最基础的代码,当然了,还可以设置一些诸如用户名密码的事情。
[*]最后这个channel就可以用来收和发消息了。
[/list]

[size=large][color=black][b]消息者线程池[/b][/color][/size]
ExecutorService es = Executors.newFixedThreadPool(20);
Connection conn = factory.newConnection(es);

[list]
[*]消费者时使用,上述自动开了一20个线程的池来搞
[/list]

[size=large][color=black][b]地址数组[/b][/color][/size]
Address[] addrArr = new Address[]{ new Address(hostname1, portnumber1)
, new Address(hostname2, portnumber2)};
Connection conn = factory.newConnection(addrArr);

[list]
[*]上述代码如果连hostname1失败了就去hostname2
[*]factory.newConnection()会触发这个检测
[/list]

[size=large][color=black][b]声明exchange与queue[/b][/color][/size]
channel.exchangeDeclare(exchangeName, "direct", true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, exchangeName, routingKey);


[list]
[*]channel.exchangeDeclare 参数有 交换机名字 类型 是否持久化 不使用时是否自动删除 是否是内部的(不能被客户端使用) 其他参数
[*]channel.queueDeclare 参数有 queue名字 是否持久化 独占的queue(仅供此连接) 不使用时是否自动删除 其他参数
[*]channel.queueBind 参数有 queue名字 交换机名字 此次绑定使用的路由关键字 其他参数
[/list]

[size=large][color=black][b]发出消息[/b][/color][/size]
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

[list]
[*]channel.basicPublish 参数有 要发出的交换机名字 路由关键字 是否强制(设置为true时,找不到收的人时可以通过returnListener返回) 是否立即(其实rabbitmq不支持) 其他属性 消息主体
[/list]

[size=large][color=black][b]线程安全[/b][/color][/size]
[list]
[*]Channel是线程好全的,但是最好是每个线程里用自己的Channel,因为在单个Channel里排队是有可能慢一些的
[/list]

[size=large][color=black][b]最简单的办法消费消息[/b][/color][/size]
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.contentType;
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here ...)
channel.basicAck(deliveryTag, false);
}
});


[list]
[*]一个Channel一个Consumer
[*]channel.basicAck 回发ACK 参数 tag 是否多个
[/list]

[size=large][color=black][b]零碎[/b][/color][/size]
[list]
[*]channel.basicQos 指定服务质量设置 参数 最大的投送字节数 最大的投送消息数量 设置是否要应用到整个channel(而不是一个消费者)
[*]factory.setAutomaticRecoveryEnabled(true) 网络有问题时,好后可自动恢复设置
[*]cf.setRequestedHeartbeat(5) 设置心跳时间
[*]exchange type可用的值:direct topic headers fanout
[*]exchange的类型有一个default,basicPublish没有指定时使用,而且,如果routingKey在指定绑定的时候,会去到绑定的exchange
[*]channel.queueDeclare().getQueue() 得到的是一个随机queue,断开连接后即删除
[*]当exchange为direct的时候routingKey与bindingKey必须完全一致才能消费消息
[/list]

转自:http://www.cnblogs.com/dwlsxj/p/RabbitMQ.html

http://itindex.net/detail/50865-rabbitmq-java-client
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值