RabbitMq概念
基本概念
-
虚拟机
-
交换器
- 交换器类型
-
队列
-
路由键
-
绑定关系
权衡
- 失败通知
- 发送者确认
- 备用交换器
- 交换器、队列、消息的持久化
- 消费者应答
RabbitMq与AMQP
- 客户端与RabbitMq的连接
无论是生产者还是消费者,都使用TCP/IP连接,并通过信道进行交互消息传递
-
包含要素
生产者、消费者、消息
交换器、队列、绑定、路由键 -
虚拟主机
-
交换器
RabbitMq使用原始java客户端进行消息通信
交换器的使用
消息发布时的权衡
-
失败通知
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Channel rabbitmqChannel = RabbitmqFactory.createRabbitmqChannel(); //添加失败返回监听 rabbitmqChannel.addReturnListener(new ReturnListener() { @Override public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("replyCode: " + replyCode); System.out.println("replyText: " + replyText); System.out.println("exchange: " + exchange); System.out.println("routingKey: " + routingKey); System.out.println("body: " + new String(body)); System.out.println("--------------------------"); } }); String[] routeKeys = {"Jaye.java", "Wang.java"}; for (int i = 0; i < routeKeys.length; i++) { String routeKey = routeKeys[i]; String msg = "Hello " + routeKey; //发送消息 /* mandatory 设置为true,开启失败通知 void basicPublish(String exchange, String routingKey, boolean mandatory, BasicProperties props, byte[] body) throws IOException;*/ rabbitmqChannel.basicPublish(RabbitmqFactory.EXCHANGE_NAME, routeKey, true, null, msg.getBytes()); System.out.println("--------------------------"); System.out.println("Send: " + routeKey + " : " + msg); Thread.sleep(1000); } RabbitmqFactory.closeRabbitmq(); }
-
发送方确认
//一般确认 public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Channel rabbitmqChannel = RabbitmqFactory.createRabbitmqChannel(); //启用发布者确认 rabbitmqChannel.confirmSelect(); String[] routeKeys = {"king.java", "mark.java", "james.java"}; for (int i = 0; i < routeKeys.length; i++) { String routeKey = routeKeys[i]; String msg = "Hello " + routeKey; //发送消息 rabbitmqChannel.basicPublish(RabbitmqFactory.EXCHANGE_NAME, routeKey, null, msg.getBytes()); System.out.println("--------------------------"); System.out.println("Send: " + routeKey + " : " + msg); //确定是否成功 if (rabbitmqChannel.waitForConfirms()) { System.out.println("send success"); } else { System.out.println("send failure"); } System.out.println("--------------------------"); } RabbitmqFactory.closeRabbitmq(); }
//批量确认 public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Channel rabbitmqChannel = RabbitmqFactory.createRabbitmqChannel(); //启用发布者确认 rabbitmqChannel.confirmSelect(); String[] routeKeys = {"king.java", "mark.java", "james.java"}; for (int i = 0; i < routeKeys.length; i++) { String routeKey = routeKeys[i]; String msg = "Hello " + routeKey; //发送消息 rabbitmqChannel.basicPublish(RabbitmqFactory.EXCHANGE_NAME, routeKey, null, msg.getBytes()); System.out.println("--------------------------"); System.out.println("Send: " + routeKey + " : " + msg); } //批量确认 rabbitmqChannel.waitForConfirmsOrDie(); RabbitmqFactory.closeRabbitmq(); }
//异步监听确认 public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Channel rabbitmqChannel = RabbitmqFactory.createRabbitmqChannel(); //启用发布者确认 rabbitmqChannel.confirmSelect(); //异步监听-确认发布结果 rabbitmqChannel.addConfirmListener(new ConfirmListener() { @Override public void handleAck(long deliveryTag, boolean multiple) throws IOException { System.out.println("deliveryTag = [" + deliveryTag + "], multiple = [" + multiple + "]"); System.out.println("send: Ack success"); } @Override public void handleNack(long deliveryTag, boolean multiple) throws IOException { System.out.println("deliveryTag = [" + deliveryTag + "], multiple = [" + multiple + "]"); System.out.println("send: Nack fail"); } }); String[] routeKeys = {"king.java", "mark.java", "james.java"}; for (int i = 0; i < 12; i++) { String routeKey = routeKeys[i%routeKeys.length]; String msg = "Hello " + routeKey; //发送消息 rabbitmqChannel.basicPublish(RabbitmqFactory.EXCHANGE_NAME, routeKey, null, msg.getBytes()); System.out.println("--------------------------"); System.out.println("Send: " + routeKey + " : " + msg); } Thread.sleep(1000 * 5); RabbitmqFactory.closeRabbitmq(); }
-
备用交换机
-
事务
事务主要是对通道(channel)的设置,比如:启动事务,提交事务,回滚事务
但使用事务会造成严重的性能问题,并是生产者应用程序产生同步