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>>>