当前位置: 首页 > 后端技术 > Node.js

rabbitmq的简单使用和一些改进

时间:2023-04-03 21:28:25 Node.js

炒鸡酱鸡说RabbitMQ不太懂接收消息@Service@Slf4jpublicclassRabbitMqMessage{privatestaticfinalStringEXCHANGE="html";privatestaticfinalStringCHECK_QUEUE="check-queue";@Autowired私有DoCheckTaskdoCheckTask;@BeanprivateDeclarablesdeclarables(){Queuequeue=newQueue(CHECK_QUEUE);FanoutExchangeexchange=newFanoutExchange(EXCHANGE);返回新的Declarables(队列,交换,BindingBuilder.bind(队列).to(交换));}@RabbitListener(queues=CHECK_QUEUE)publicvoidreceiverHtml(StringurlContent){UrlContenturlContent1=Json.toObject(urlContent,UrlContent.class);doCheckTask.urlContentPriorityBlockingQueue.add(urlContent1);}}发送消息@Service@Slf4jub@ConfigurationRabbitMqMessage{@AutowiredprivateRabbitTemplaterabbitTemplate;/***页面内容广播开关*/privatestaticfinalStringHTML_EXCHANGE="html";@豆publicDeclarablesdeclarables(){FanoutExchangeexchange=newFanoutExchange(HTML_EXCHANGE);返回新的声明(交换);}publicvoidsendHtmlToMessageQueue(StringurlContent){rabbitTemplate.convertAndSend(HTML_EXCHANGE,"",urlContent);你只需要定义消息队列的exchange和queue。首先需要在您的管理页面中定义交易所。我们在配置文件中定义连接设置是必不可少的必不可少的,需要在dependencies中安装相关的包,这里使用maven来管理包,所以相关的依赖是org.springframework.bootspring-boot-starter-是amqp2.1.4.RELEASE很简单?如果你比较忙,只要能用,那就复制上面的代码,稍微修改一下,就能满足你的使用条件。还有什么?让我们再看一下这段代码。首先,使用@Service注解让springboot启动。spring容器会加载这个类,注册为服务,然后@Bean会绑定我们的队列和切换。你可以暂时把消息队列想象成带有存储的三层路由器。三层路由器具有交换机的功能。通过计算机网络的知识,我们知道交换机的作用仅限于局域网,所以使用同一个交换机就是同一个局域网(VirtualLAN也是一个局域网),所以我们在定义绑定哪些队列的时候在决定使用哪些开关的同时,还需要考虑业务消息的相关性,不能都放在同一个开关下。@BeanprivateDeclarablesdeclarables(){Queuequeue=newQueue(CHECK_QUEUE);//定义队列对象:从哪个队列获取信息FanoutExchangeexchange=newFanoutExchange(EXCHANGE);//定义交换对象returnnewDeclarables(queue,exchange,BindingBuilder.bind(queue).to(exchange));//将两者绑定在一起}这段代码,当项目启动时,@Bean会告诉spring容器执行这段代码,并生成这样的Declarables,即绑定成功。然后我们只需要定义监听这个队列的函数。@RabbitListener(queues=CHECK_QUEUE)publicvoidreceiverHtml(StringurlContent){UrlContenturlContent1=Json.toObject(urlContent,UrlContent.class);doCheckTask.urlContentPriorityBlockingQueue.add(urlContent1);}这段代码绑定了监听队列CHECK_QUEUE,当检测到队列中有数据时,会调用receiverHtml方法,然后将数据放入urlContent中。发送消息也是如此@BeanpublicDeclarablesdeclarables(){FanoutExchangeexchange=newFanoutExchange(HTML_EXCHANGE);returnnewDeclarables(exchange);}这里也注册了一个exchange,为什么要注册一次呢?如果你在一个项目中,那么就不需要再声明交易所了。publicvoidsendHtmlToMessageQueue(StringurlContent){rabbitTemplate.convertAndSend(HTML_EXCHANGE,"",urlContent);}向exchange发送消息,直接使用rabbitTemplate即可。详细了解交换器和队列AnonymousQueue:表示一个匿名的、非持久化的、独占的、自动删除的队列Queue:默认队列交换器DirectExchange:它将消息路由到那些BindingKeyRoutingKey完全匹配的队列。FanoutExchange:BroadcastExchange:它将发送到exchange的所有消息路由到所有绑定到exchange的队列。TopicExchange:主题交换HeadersExchange:不依赖路由键的匹配规则来路由消息,而是根据发送消息内容中的headers属性进行匹配。标头类型开关的性能很差,而且不切实际地看到它存在。CustomExchange:模糊匹配AbstractExchange:抽象交换,作为基础存在。如果队列太多,怎么集中控制?在官网的demo中,有一个方案是将所有的queue和exchange一起注册,一共四个文件,一个registrationbean名为RabbitMqConfig.java的文件用于注册所有的bean。然后使用一个ConstNames来存储所有的名字。只有一个发送者和一个接收者。像这样:@ConfigurationpublicclassRabbitMqConfig{@BeanpublicReceiverreceiver(){returnnewReceiver();}@BeanpublicDirectExchangeexchange(){returnnewDirectExchange(ConstNames.EXCHANGE);}@BeanpublicQueuequeue(){returnnewQueue(ConstNames.QUEUE);}@BeanpublicBindingbindingEvent(DirectExchangeexchange,Queuequeue){returnBindingBuilder.bind(queue).to(exchange).withQueueName();}@Beanpublicxxxxxxxx(){//这里定义一个Sender即可}}//Receiver.javapublicclassReceiver{@RabbitListener(queues=ConstNames.QUEUE)publicvoidreceiveEvent(Stringin){System.out.println(in);}}//管理名称publicclassConstNames{publicstaticfinalStringEXCHANGE="exchange";publicstaticfinalStringQUEUE="queue";}这样可以避免写很多重复的代码,同时也可以写一些东西自动生成上面的内容代码。炸鸡辣子鸡原创文章,转载请注明出处