public Result frozeSmsAccount(String unit_id, SmsTypeEnum smsTypeEnum, int size) {
boolean flag = true;
List<Object> result = null;
Sms_account_product accountProduct = null;
int runNumber = 0;
redisService.watch("accountProduct:" + unit_id + ":" + smsTypeEnum.getValue()); // 标记 短信 账户余额的键值
while(flag){
try {
String accountStr = redisService.get("accountProduct:" + unit_id + ":" + smsTypeEnum.getValue());
accountProduct = JSON.parseObject(accountStr, Sms_account_product.class);
if(Lang.isEmpty(accountProduct)){
log.errorf("当前账号为空,单位:%s,冻结条数:%s",unit_id,size);
redisService.unwatch(); // 解除标记
return Result.error(String.format("当前账号为空,单位:%s,冻结条数:%s",unit_id,size));
}
int sms_remaining = Lang.isEmpty(accountProduct.getSms_remaining()) ? 0 : accountProduct.getSms_remaining();
int sms_frozen_num = Lang.isEmpty(accountProduct.getSms_frozen_num()) ? 0 : accountProduct.getSms_frozen_num();
redisService.set("accpro:sms_remaining:"+unit_id,String.valueOf(sms_remaining));
redisService.set("accpro:sms_frozen_num"+unit_id,String.valueOf(sms_frozen_num));
log.debugf("执行账号短信余额冻结事物");
Transaction transaction = redisService.multi();
transaction.decrBy("accpro:sms_remaining:"+unit_id,size);// 短信剩余数量减少
transaction.incrBy("accpro:sms_frozen_num"+unit_id,size);//短信余额数量增加
result = transaction.exec();//执行事务
if(result == null){ //事务提交失败,说明在执行期间数据被修改过
log.errorf("执行事物第%s次失败",runNumber);
Thread.sleep(500);
if(runNumber>5){
redisService.unwatch(); // 解除标记
flag = false; // 超过5次不在执行
}else{
runNumber++;
}
}else{
//事务提交成功
sms_remaining = Integer.parseInt(redisService.get("accpro:sms_remaining:"+unit_id));
sms_frozen_num = Integer.parseInt(redisService.get("accpro:sms_frozen_num"+unit_id));
accountProduct.setSms_remaining(sms_remaining);
accountProduct.setSms_frozen_num(sms_frozen_num);
this.updateAccountRedisData(accountProduct);
log.debugf("扣费transaction事务执行结束...");
log.debugf("当前可用条数:%s,冻结条数:%s",sms_remaining,sms_frozen_num);
return Result.success();
}
}catch (Exception e){
redisService.unwatch(); // 解除标记
log.errorf("冻结条数发生系统异常,单位:%s,冻结条数:%s",unit_id,size);
log.error(e);
/**
* 其他操作?
*/
return Result.error(String.format("冻结条数发生异常,单位:%s,冻结条数:%s",unit_id,size));
}
}
if(!flag){
log.errorf("执行5次冻结条数失败,单位:%s,冻结条数:%s",unit_id,size);
/**
* 其他操作?
*/
return Result.error(String.format("执行5次冻结条数失败,单位:%s,冻结条数:%s",unit_id,size));
}
return Result.error(String.format("冻结条数失败,单位:%s,冻结条数:%s",unit_id,size));
}
[DEBUG] 2018-08-20 17:10:06,827 org.nutz.dao.impl.interceptor.DaoTimeInterceptor.filter(DaoTimeInterceptor.java:28) - time=7ms, sql=SELECT * FROM sms_tpl WHERE delFlag=false AND type='0' AND check_status='1' AND unit_id='d7a9ef5cd4914287b1a3cc5438f1b919' ORDER BY create_at DESC, name DESC LIMIT 0, 10
[DEBUG] 2018-08-20 17:10:13,374 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Checking status of localhost:27017
[DEBUG] 2018-08-20 17:10:13,375 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Updating cluster description to {type=STANDALONE, servers=[{address=localhost:27017, type=STANDALONE, roundTripTime=3.2 ms, state=CONNECTED}]
[DEBUG] 2018-08-20 17:10:16,583 org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:742) - Got ping response for sessionid: 0x16554df55b8000c after 0ms
[DEBUG] 2018-08-20 17:10:23,378 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Checking status of localhost:27017
[DEBUG] 2018-08-20 17:10:23,379 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Updating cluster description to {type=STANDALONE, servers=[{address=localhost:27017, type=STANDALONE, roundTripTime=2.8 ms, state=CONNECTED}]
[DEBUG] 2018-08-20 17:10:29,916 org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:742) - Got ping response for sessionid: 0x16554df55b8000c after 1ms
[DEBUG] 2018-08-20 17:10:30,500 com.alibaba.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:59) - [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation, dubbo version: 2.6.2, current host: 192.168.3.34
[DEBUG] 2018-08-20 17:10:30,517 com.alibaba.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:59) - [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation, dubbo version: 2.6.2, current host: 192.168.3.34
[DEBUG] 2018-08-20 17:10:31,456 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:277) - 第1步,手机号参数校验完成,已耗时:0毫秒
[DEBUG] 2018-08-20 17:10:32,783 com.alibaba.dubbo.remoting.exchange.support.header.HeartbeatHandler.received(HeartbeatHandler.java:84) - [DUBBO] Receive heartbeat response in thread New I/O client worker #1-1, dubbo version: 2.6.2, current host: 192.168.3.34
[DEBUG] 2018-08-20 17:10:32,786 com.alibaba.dubbo.remoting.exchange.support.header.HeartBeatTask.run(HeartBeatTask.java:65) - [DUBBO] Send heartbeat to remote channel /192.168.3.34:15149, cause: The channel has no data-transmission exceeds a heartbeat period: 60000ms, dubbo version: 2.6.2, current host: 192.168.3.34
[DEBUG] 2018-08-20 17:10:32,795 com.alibaba.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:59) - [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult, dubbo version: 2.6.2, current host: 192.168.3.34
[DEBUG] 2018-08-20 17:10:32,796 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:280) - 第2步,获取单位信息完成,已耗时:1339毫秒
[DEBUG] 2018-08-20 17:10:32,929 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:290) - 第3步,检查短信签名和发送频率完成,已耗时:1473毫秒
[DEBUG] 2018-08-20 17:10:32,929 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.checkMobileLegality(SmsSendServiceImpl.java:743) - checkMobileLegality..1
[DEBUG] 2018-08-20 17:10:32,929 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.checkMobileLegality(SmsSendServiceImpl.java:755) - checkMobileLegality..3
[DEBUG] 2018-08-20 17:10:32,932 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:300) - 第4步,检查手机号码合法性完成,已耗时:1476毫秒
[DEBUG] 2018-08-20 17:10:34,080 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Checking status of localhost:27017
[DEBUG] 2018-08-20 17:10:34,082 com.mongodb.diagnostics.logging.SLF4JLogger.debug(SLF4JLogger.java:56) - Updating cluster description to {type=STANDALONE, servers=[{address=localhost:27017, type=STANDALONE, roundTripTime=2.5 ms, state=CONNECTED}]
[DEBUG] 2018-08-20 17:10:34,145 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:324) - 第5步,替换短信模板参数并检测敏感词完成,已耗时:2689毫秒
[DEBUG] 2018-08-20 17:10:34,145 cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:345) - 第7步,短信发送记录封装完成,已耗时:2689毫秒
[DEBUG] 2018-08-20 17:10:37,514 cn.wizzer.app.sms.modules.services.impl.SmsAccountProductServiceImpl.frozeSmsAccount(SmsAccountProductServiceImpl.java:99) - 执行账号短信余额冻结事物
[ERROR] 2018-08-20 17:10:39,637 cn.wizzer.app.sms.modules.services.impl.SmsAccountProductServiceImpl.frozeSmsAccount(SmsAccountProductServiceImpl.java:126) - 冻结条数发生系统异常,单位:d7a9ef5cd4914287b1a3cc5438f1b919,冻结条数:1
[ERROR] 2018-08-20 17:10:40,649 cn.wizzer.app.sms.modules.services.impl.SmsAccountProductServiceImpl.frozeSmsAccount(SmsAccountProductServiceImpl.java:127) - ERR EXEC without MULTI
redis.clients.jedis.exceptions.JedisDataException: ERR EXEC without MULTI
at redis.clients.jedis.Protocol.processError(Protocol.java:127)
at redis.clients.jedis.Protocol.process(Protocol.java:161)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:285)
at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:291)
at redis.clients.jedis.Transaction.exec(Transaction.java:47)
at cn.wizzer.app.sms.modules.services.impl.SmsAccountProductServiceImpl.frozeSmsAccount(SmsAccountProductServiceImpl.java:103)
at cn.wizzer.app.sms.modules.services.impl.SmsAccountProductServiceImpl.changeSmsAccountBalanceChange(SmsAccountProductServiceImpl.java:246)
at cn.wizzer.app.sms.modules.services.impl.SmsSendServiceImpl.synchronizedSendIndustrySms(SmsSendServiceImpl.java:350)
at com.alibaba.dubbo.common.bytecode.Wrapper50.invokeMethod(Wrapper50.java)
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47)
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:76)
at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:52)
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:62)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:72)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:131)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:103)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:96)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:172)
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51)
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:80)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[DEBUG] 2018-08-20 17:19:38,716 com.alibaba.dubbo.remoting.exchange.support.header.HeartBeatTask.run(HeartBeatTask.java:65) - [DUBBO] Send heartbeat to remote channel /192.168.3.34:15149, cause: The channel has no data-transmission exceeds a heartbeat period: 60000ms, dubbo version: 2.6.2, current host: 192.168.3.34
[WARN ] 2018-08-20 17:19:38,716 com.alibaba.dubbo.remoting.exchange.support.header.HeartBeatTask.run(HeartBeatTask.java:70) - [DUBBO] Close channel HeaderExchangeClient [channel=com.alibaba.dubbo.remoting.transport.netty.NettyClient [/192.168.3.34:48075 -> /192.168.3.34:15149]], because heartbeat read idle time out: 180000ms, dubbo version: 2.6.2, current host: 192.168.3.34
[INFO ] 2018-08-20 17:19:38,717 com.alibaba.dubbo.remoting.transport.netty.NettyChannel.close(NettyChannel.java:138) - [DUBBO] Close netty channel [id: 0x45d64d27, /192.168.3.34:48075 => /192.168.3.34:15149], dubbo version: 2.6.2, current host: 192.168.3.34
[WARN ] 2018-08-20 17:19:38,717 org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1108) - Client session timed out, have not heard from server in 548801ms for sessionid 0x16554df55b8000c
[INFO ] 2018-08-20 17:19:38,718 org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1156) - Client session timed out, have not heard from server in 548801ms for sessionid 0x16554df55b8000c, closing socket connection and attempting reconnect
[DEBUG] 2018-08-20 17:19:38,718 org.apache.zookeeper.ClientCnxnSocketNIO.cleanup(ClientCnxnSocketNIO.java:210) - Ignoring exception during shutdown output
java.net.SocketException: Connection reset by peer: shutdown
at sun.nio.ch.Net.shutdown(Native Method)
at sun.nio.ch.SocketChannelImpl.shutdownOutput(SocketChannelImpl.java:801)
at sun.nio.ch.SocketAdaptor.shutdownOutput(SocketAdaptor.java:407)
at org.apache.zookeeper.ClientCnxnSocketNIO.cleanup(ClientCnxnSocketNIO.java:207)
at org.apache.zookeeper.ClientCnxn$SendThread.cleanup(ClientCnxn.java:1246)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1170)