RabbitMQ应用场景之实现群发抢红包

  1/RabbitMQ的安装

         最新的RabbitMQ的版本为3.7.6,对应的erlang的版本为19.3, 重要的话要说三遍, 刚开始没留意这个, yun就装erlang了,因为没指定版本,所以装了最新版的erlang,所以后续启动rabbitmq服务时一直有问题.干脆在windows上重新做一遍.


   2/模拟微信群抢红包

      下面的代码模拟有人拿出100.88元群发红包(分10个随机面额的小红包), 然后15人同时抢, 其中5人抢不到.

	private double[] getRedBags(double pvdTotalAmount,int pvnCount) {
		double[] lvdRedBags = new double[pvnCount];
		while (true) {
			double lvdAmount = pvdTotalAmount;
			for (int i = 0; i < pvnCount; i++) {
				while (true) {
					lvdRedBags[i] = ((int) (Math.random() * Math.random() * pvdTotalAmount* 100.00)) / 100.00;
					if (lvdRedBags[i] != 0)
						break;
				}
				lvdAmount = Math.round((lvdAmount - lvdRedBags[i]) * 100.00) / 100.00;
			}
			if (lvdAmount < 0)
				continue;
			if (lvdAmount > 0) { // 将余额随机放加到其中一个小红包里面,赚发了
				int lvnIdx = (int) Math.round(Math.random() * (pvnCount- 1));
				lvdRedBags[lvnIdx] = lvdRedBags[lvnIdx] + lvdAmount;
				break;
			}
		}
		return lvdRedBags;
	}
	@Test
	public void test() throws IOException, TimeoutException, InterruptedException {
		final String QUEUE_NAME = "JAVA-REDBAG" + String.valueOf(System.currentTimeMillis());
		final String EXCHANGE_NAME="exchange1";
		// 发红包
		final double REDBAG_AMOUNT = 100.88;
		final int REDBAG_COUNT = 10;
		double[] lvdRedBags=getRedBags(REDBAG_AMOUNT,REDBAG_COUNT);
		final Connection lvConPublisher = (Connection) mFactory.newConnection();
		Channel lvChnPublisher = lvConPublisher.createChannel();
		try {
			lvChnPublisher.exchangeDeclarePassive(EXCHANGE_NAME); //测试MQ服务器里面是否存在有这个Exchange,若不存在则抛出exception			
		}
		catch (Exception e) {
			lvChnPublisher = lvConPublisher.createChannel();
			lvChnPublisher.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); //最终是想用一个新的交换机(P2P形式)去进行数据传递
		}
		// lvChnPublisher.queueDelete(QUEUE_NAME);
		lvChnPublisher.queueDeclare(QUEUE_NAME, false, false, false, null);// 定义这个抢红包的唯一队列
		lvChnPublisher.queueBind(QUEUE_NAME,EXCHANGE_NAME,QUEUE_NAME);
		double lvdCC = 0;
		for (int i = 0; i < REDBAG_COUNT; i++) { // 连发10个小红包
			lvdCC = Math.round(( lvdCC+lvdRedBags[i])*100.0)/100.0;
			log.info("正在派发红包:" + lvdRedBags[i]);			
			lvChnPublisher.basicPublish(EXCHANGE_NAME, QUEUE_NAME, null, String.valueOf(lvdRedBags[i]).getBytes("utf8"));
		}
		if (lvdCC != REDBAG_AMOUNT) {
			log.info("?????????????");
		}
		log.info("派发完毕.");

		final AtomicInteger lvnCC = new AtomicInteger(0);
		final int lvnMemberCount = 15; // 必须>=红包个数
		ExecutorService lvExecutor = Executors.newFixedThreadPool(lvnMemberCount);
		final CountDownLatch lvSignal = new CountDownLatch(lvnMemberCount);
		// 15人同时抢...
		for (int j = 1; j <= lvnMemberCount; j++) {
			final int i = j;
			lvExecutor.submit(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					try {
						final Connection lvConConsumer = (Connection) mFactory.newConnection();
						final Channel lvChnConsumer = lvConConsumer.createChannel();
						lvChnConsumer.queueDeclare(QUEUE_NAME, false, false, false, null);
						log.info("群会员" + i + " 开始抢红包...");
						GetResponse lvResponse= lvChnConsumer.basicGet(QUEUE_NAME, true);
						if (lvResponse== null) {
							log.info("群会员" + i + ", 红包没了,退出.");
						} else {
							String lvsBody = new String(lvResponse.getBody(), "utf8");
							log.info("群会员" + i + " 已抢:" + lvsBody + ",当前已抢红包数累计:"
									+ String.valueOf(lvnCC.incrementAndGet()));
						}
						lvSignal.countDown();
					} catch (Exception e) {
						log.error("群会员" + i + ",error");
						e.printStackTrace();
					}
				}
			});
			// log.info("群会员"+i+" nani? 结果:"+lvsRet);
		}
		log.info("...正在等待结束...");
		lvSignal.await();		
		lvExecutor.shutdown();
		lvChnPublisher.queueDelete(QUEUE_NAME);
		lvChnPublisher.exchangeDelete(EXCHANGE_NAME);
		lvChnPublisher.close();
		lvConPublisher.close();
		log.info("<<<END>>>");
	}



上面代码用了java的并行计算类同时执行抢红包运作,因为根据游戏规则,抢红包只能抢一次, 所以调用的是basicGet而不是basicConsumer,因为后者是不断监听是否有消息进入的.


运行结果:

17:21:24,444  INFO RabbitMQTest:76 - 正在派发红包:21.09
17:21:24,450  INFO RabbitMQTest:76 - 正在派发红包:3.79
17:21:24,450  INFO RabbitMQTest:76 - 正在派发红包:0.23
17:21:24,450  INFO RabbitMQTest:76 - 正在派发红包:2.43
17:21:24,451  INFO RabbitMQTest:76 - 正在派发红包:0.53
17:21:24,451  INFO RabbitMQTest:76 - 正在派发红包:16.08
17:21:24,451  INFO RabbitMQTest:76 - 正在派发红包:44.08
17:21:24,451  INFO RabbitMQTest:76 - 正在派发红包:3.45
17:21:24,452  INFO RabbitMQTest:76 - 正在派发红包:2.33
17:21:24,452  INFO RabbitMQTest:76 - 正在派发红包:6.87
17:21:24,452  INFO RabbitMQTest:82 - 派发完毕.
17:21:24,453  INFO RabbitMQTest:117 - ...正在等待结束...
17:21:24,541  INFO RabbitMQTest:99 - 群会员1 开始抢红包...
17:21:24,541  INFO RabbitMQTest:99 - 群会员5 开始抢红包...
17:21:24,542  INFO RabbitMQTest:99 - 群会员3 开始抢红包...
17:21:24,543  INFO RabbitMQTest:99 - 群会员6 开始抢红包...
17:21:24,544  INFO RabbitMQTest:99 - 群会员4 开始抢红包...
17:21:24,547  INFO RabbitMQTest:105 - 群会员4 已抢:3.79,当前已抢红包数累计:1
17:21:24,555  INFO RabbitMQTest:105 - 群会员1 已抢:21.09,当前已抢红包数累计:5
17:21:24,554  INFO RabbitMQTest:105 - 群会员5 已抢:0.23,当前已抢红包数累计:4
17:21:24,554  INFO RabbitMQTest:105 - 群会员6 已抢:2.43,当前已抢红包数累计:3
17:21:24,554  INFO RabbitMQTest:105 - 群会员3 已抢:0.53,当前已抢红包数累计:2
17:21:24,560  INFO RabbitMQTest:99 - 群会员10 开始抢红包...
17:21:24,561  INFO RabbitMQTest:105 - 群会员10 已抢:16.08,当前已抢红包数累计:6
17:21:24,561  INFO RabbitMQTest:99 - 群会员7 开始抢红包...
17:21:24,562  INFO RabbitMQTest:99 - 群会员9 开始抢红包...
17:21:24,562  INFO RabbitMQTest:99 - 群会员11 开始抢红包...
17:21:24,562  INFO RabbitMQTest:105 - 群会员9 已抢:44.08,当前已抢红包数累计:7
17:21:24,563  INFO RabbitMQTest:105 - 群会员7 已抢:3.45,当前已抢红包数累计:8
17:21:24,563  INFO RabbitMQTest:99 - 群会员14 开始抢红包...
17:21:24,563  INFO RabbitMQTest:99 - 群会员2 开始抢红包...
17:21:24,563  INFO RabbitMQTest:99 - 群会员8 开始抢红包...
17:21:24,564  INFO RabbitMQTest:105 - 群会员11 已抢:2.33,当前已抢红包数累计:9
17:21:24,564  INFO RabbitMQTest:99 - 群会员12 开始抢红包...
17:21:24,564  INFO RabbitMQTest:99 - 群会员13 开始抢红包...
17:21:24,564  INFO RabbitMQTest:102 - 群会员8, 红包没了,退出.
17:21:24,564  INFO RabbitMQTest:102 - 群会员2, 红包没了,退出.
17:21:24,564  INFO RabbitMQTest:105 - 群会员14 已抢:6.87,当前已抢红包数累计:10
17:21:24,566  INFO RabbitMQTest:102 - 群会员13, 红包没了,退出.
17:21:24,568  INFO RabbitMQTest:102 - 群会员12, 红包没了,退出.
17:21:24,569  INFO RabbitMQTest:99 - 群会员15 开始抢红包...
17:21:24,570  INFO RabbitMQTest:102 - 群会员15, 红包没了,退出.
17:21:24,583  INFO RabbitMQTest:123 - <<<END>>>

猜你喜欢

转载自blog.csdn.net/rocklee/article/details/80930170