当前位置: 首页 > news >正文

SpringBoot RabbitMQ 集成 二 Work queues

为什么80%的码农都做不了架构师?>>>   hot3.png

上一节的一个工程中两个类,一个负责发送,一个负责接收,也就是一一对于的关系。

只要消息发出了,接收者就处理;当接收效率较低时,就会出现接收者处理不过来,我们就可能会处理不过来,于是我们就可能多配置接受者。这个模式就是"Work queues",它的结构如下

 

20170404002111089.

多个接收者,它们会出现什么情况呢?是否像大锅饭,有的人撑死,有的人饿死。这个通过例子验证。

一、编写代码

1、编写常量类RabbitWorkQueuesConstant 

package com.lvgang.springbootrabbitmq.workqueues;

/**
 * @author lvgang
 */
public class RabbitWorkQueuesConstant {

    public  static final  String QUEUQ = "Queue_WorkQueues";

}

2、编写配置类RabbitWorkQueuesConfig 

package com.lvgang.springbootrabbitmq.workqueues;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author lvgang
 */
@Configuration
public class RabbitWorkQueuesConfig {

    /**
        * Queue 可以有4个参数
     *      1.队列名
     *      2.durable       持久化消息队列 ,rabbitmq重启的时候不需要创建新的队列 默认true
     *      3.auto-delete   表示消息队列没有在使用时将被自动删除 默认是false
     *      4.exclusive     表示该消息队列是否只在当前connection生效,默认是false
     */

    @Bean
    public Queue createWorkQueuesQueue() {
        return new Queue(RabbitWorkQueuesConstant.QUEUQ,true);
    }

}

3、编写消息生产者WorkQueuesSender 

package com.lvgang.springbootrabbitmq.workqueues;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.UUID;

/**
 * @author lvgang
 */
@Component
public class WorkQueuesSender {
	private static Logger logger = LoggerFactory.getLogger(WorkQueuesSender.class);

	@Autowired
	private RabbitTemplate rabbitTemplate;

	public void send(int i) {
		CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
		String message = "WorkQueues="+ i+"," + new Date() + ", content= " + UUID.randomUUID().toString();
		rabbitTemplate.convertAndSend(RabbitWorkQueuesConstant.QUEUQ,(Object) message,correlationData);
		logger.info("send ok,"+new Date()+","+message);
	}
}

 

4、编写消息接收者1WorkQueuesReceiver1 

package com.lvgang.springbootrabbitmq.workqueues;

import com.lvgang.springbootrabbitmq.helloworld.HelloWorldSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author lvgang
 */
@Component
@RabbitListener(queues = RabbitWorkQueuesConstant.QUEUQ)
public class WorkQueuesReceiver1 {
    private static Logger logger = LoggerFactory.getLogger(HelloWorldSender.class);
    @RabbitHandler
    public void process(String message) {
        logger.info("Receiver1 : " + message +","+ new Date());
    }
}

5、编写消息接收者2WorkQueuesReceiver2 

package com.lvgang.springbootrabbitmq.workqueues;

import com.lvgang.springbootrabbitmq.helloworld.HelloWorldSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author lvgang
 */
@Component
@RabbitListener(queues = RabbitWorkQueuesConstant.QUEUQ)
public class WorkQueuesReceiver2 {
    private static Logger logger = LoggerFactory.getLogger(HelloWorldSender.class);
    @RabbitHandler
    public void process(String message) {
        logger.info("Receiver2 : " + message +","+ new Date());
    }
}

二、测试结果

1、编写测试类WorkQueuesTests 

package com.lvgang.springbootrabbitmq.workqueues;


import com.lvgang.springbootrabbitmq.helloworld.HelloWorldSender;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class WorkQueuesTests {
	private static Logger logger = LoggerFactory.getLogger(HelloWorldSender.class);
	@Autowired
	private WorkQueuesSender workQueuesSender;

	@Test
	public void hello() throws Exception {
		int i=1;
		while (true) {
			try {
				if(i<=10) {
					workQueuesSender.send(i);
				}
				i++;
				Thread.sleep(1000);
			} catch (Exception e) {
				logger.error(e.getMessage(),e);
			}
		}
	}
}

2、执行测试类,并查看结果

f601f15d5b14481f987f85cfd723336e75c.jpg

通过执行测类,查看到了消息消费的情况,生产者共计生产了10个消息,这10个消息分别被消费者1,消费者2,分别消费了5条。

转载于:https://my.oschina.net/sdlvzg/blog/3044469

相关文章:

  • 75条笑死人的知乎神回复,用60行代码就爬完了
  • Windows server 2012 利用ntdsutil工具实现AD角色转移及删除域控方法
  • Linux学习
  • 面试官:说说双亲委派模型?
  • 北京
  • yocto添加层简介
  • 渐变文件夹,一定要收下这两套超级精美的文件夹图标!
  • 博客
  • 学习python的第一天-模拟用户登录接口,输入错误三次锁定
  • 如何测量距离?ABViewer热门技术问答精选合集!
  • vue脚手架的报错
  • 在阿里云IIS服务器上安装证书
  • 重磅!阿里云时空数据库正式免费公测
  • 用C#在去中心化交易所OceanOne上挂单买卖任意ERC20 token
  • 时隔五年,Scrapyd 终于原生支持 basic auth
  • 【剑指offer】让抽象问题具体化
  • 77. Combinations
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular Elements 及其运作原理
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java到底能干嘛?
  • Magento 1.x 中文订单打印乱码
  • MySQL主从复制读写分离及奇怪的问题
  • Odoo domain写法及运用
  • SpingCloudBus整合RabbitMQ
  • SQLServer之创建显式事务
  • 半理解系列--Promise的进化史
  • 服务器之间,相同帐号,实现免密钥登录
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序设置上一页数据
  • 译自由幺半群
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • !!java web学习笔记(一到五)
  • #if #elif #endif
  • #预处理和函数的对比以及条件编译
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (12)Hive调优——count distinct去重优化
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Ruby)Ubuntu12.04安装Rails环境
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)pulsar安装在独立的docker中,python测试
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 物件導向與老子思想 (OO)
  • (转)C#调用WebService 基础
  • (转载)Linux网络编程入门