发布订阅模型 发布订阅模型(PublishSubscribe):简单的说就是队列里面的消息会被多个消费者同时接受到,消费者接收到的信息一致。 发布订阅模型适合于做模块之间的异步通信。 适用场景发送并记录日志信息springcloud的config组件里面通知配置自动更新缓存同步微信订阅号演示 生产者publicclassProducer{privatestaticfinalStringEXCHANGENAMEexchangepublish1;publicstaticvoidmain(String〔〕args)throwsIOException,TimeoutException{ConnectionconnectionConnectionUtils。getConnection();Channelchannelconnection。createChannel();声明交换机channel。exchangeDeclare(EXCHANGENAME,fanout);发送消息到交换机for(inti0;i100;i){channel。basicPublish(EXCHANGENAME,,null,(发布订阅模型的第i条消息)。getBytes());}关闭资源channel。close();connection。close();}} 消费者消费者1publicclassConsumer{privatestaticfinalStringQUEUENAMEqueuepublish1;privatestaticfinalStringEXCHANGENAMEexchangepublish1;publicstaticvoidmain(String〔〕args)throwsIOException,TimeoutException{ConnectionconnectionConnectionUtils。getConnection();Channelchannelconnection。createChannel();声明队列channel。queueDeclare(QUEUENAME,false,false,false,null);声明交换机channel。exchangeDeclare(EXCHANGENAME,fanout);将队列绑定到交换机channel。queueBind(QUEUENAME,EXCHANGENAME,);DefaultConsumerdefaultConsumernewDefaultConsumer(channel){OverridepublicvoidhandleDelivery(StringconsumerTag,Envelopeenvelope,AMQP。BasicPropertiesproperties,byte〔〕body)throwsIOException{System。out。println(队列1接收到的消息是:newString(body));}};channel。basicConsume(QUEUENAME,true,defaultConsumer);}}消费者2publicclassConsumer2{privatestaticfinalStringQUEUENAMEqueuepublish2;privatestaticfinalStringEXCHANGENAMEexchangepublish1;publicstaticvoidmain(String〔〕args)throwsIOException,TimeoutException{ConnectionconnectionConnectionUtils。getConnection();Channelchannelconnection。createChannel();声明队列channel。queueDeclare(QUEUENAME,false,false,false,null);声明交换机channel。exchangeDeclare(EXCHANGENAME,fanout);将队列绑定到交换机channel。queueBind(QUEUENAME,EXCHANGENAME,);DefaultConsumerdefaultConsumernewDefaultConsumer(channel){OverridepublicvoidhandleDelivery(StringconsumerTag,Envelopeenvelope,AMQP。BasicPropertiesproperties,byte〔〕body)throwsIOException{System。out。println(队列2接收到的消息是:newString(body));}};channel。basicConsume(QUEUENAME,true,defaultConsumer);}} 测试 先启动2个消费者,再启动生产者 可以看出来消费者1和消费者2接收到的消息是一模一样的,每个消费者都收到了生产者发送的消息; 发布订阅模型,用到了一个新的东西交换机,这里也解释一下相关方法的参数:声明交换机channel。exchangeDeclare(EXCHANGENAME,fanout);该方法的最多参数的重载方法是:Exchange。DeclareOkexchangeDeclare(Stringexchange,BuiltinExchangeTypetype,booleandurable,booleanautoDelete,booleaninternal,MapString,Objectarguments)throwsIOException;param1:exchange,交换机名称param2:type,交换机类型;直接写string效果一致;内置了4种交换机类型:direct(路由模式)、fanout(发布订阅模式)、topic(topic模式模糊匹配)、headers(标头交换,由Headers的参数分配,不常用)param3:durable,是否持久化交换机false:默认值,不持久化param4:autoDelete,没有消费者使用时,是否自动删除交换机false:默认值,不删除param5:internal,是否内置,如果设置为true,则表示是内置的交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器的方式false:默认值,允许外部直接访问param6:arguments,交换机的一些其他属性,默认值为null将队列绑定到交换机channel。queueBind(QUEUENAME,EXCHANGENAME,);param1:destination,目的地,队列的名字param2:source,资源,交换机的名字param3:routingKey,路由键(目前没有用到routingKey,填即可)小结 本文到这里就结束了,介绍了RabbitMQ通信模型中的发布订阅模型,适合于做模块之间的异步通信。