在项目中使用到了RabbitMQ,简单的记录一下使用过程中的一些问题。
1、项目是一些医院之间Server进行文件的转发,医院转发关系在云端Server上维护,需求中有一个问题,医院的关系是可以变化的。所以RabbitMQ与Spring的整合就不能使用配置文件固定下来。这部分单独提取出来,在服务器启动的时候先请求云端Server,获取到转发关系,然后初始化MQ。
2、RabbitMQ的消息Exchange模式是direct模式,在文档中看到可以使用多重绑定,查了好久,最后在RabbitMQ的DEMO中找到了Direct模式使用多重绑定的例子。
每个医院使用自己的uuid创建订阅队列,然后将发送文件到本医院的其他医院uuid作为routekey,将队列、routekey绑定到Exchange中。医院发送消息时,将自己的uuid作为routekey发送到MQ,这样其他绑定此routekey的医院会收到消息。
ConnectionFactory factory = new ConnectionFactory(); factory.setHost("45.56.82.102"); factory.setUsername("guest"); factory.setPassword("guest"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME, "direct",true); String queueName = "Hello"; String[] argvs = new String[3]; argvs[0] = "info"; argvs[1] = "error"; argvs[2] = "warning"; channel.queueDeclare(queueName, true, false, false, null); for(String severity : argvs){ channel.queueBind(queueName, EXCHANGE_NAME, severity); } System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(queueName, true, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); String routingKey = delivery.getEnvelope().getRoutingKey(); System.out.println(" [x] Received '" + routingKey + "':'" + message + "'"); }