【Netty专题】Netty UDP模式 下发指令时收不到上报数据

今天调试项目程序,涉及 6000 台表单线程进行抄读,平均每个表抄读要5秒钟,每天想抄读多次。
算下来 6000 * 5 = 30000 s = 500 min ≈ 8.3 hour
这样是绝对不行的,于是我想做成多线程抄表,通过netty的 ctx.executor().schedule()方法启动定时任务。
可是调试的时候发现下发抄表指令时,上报数据上不来,我和项目经理还有团队大佬研究了半天,还是没有解决。

  • 后来经过调试我才发现,是因为我在ctx.executor().schedule()启动定时任务会附加在netty 的EventLoop进程中,而这个进程则是在处理抄表的进程,而且我还在定时抄表过程中用了sleep方法,sleep方法会阻塞当前线程的运行,所以由于一直执行抄表线程,上报数据当然没机会处理了。
 for (MeterInfo meterInfo : materInfoList) {
                    Map<String, Object> map2 = new HashMap<>(3);
                    String meterCode = meterInfo.getMeterCode();
                    String factoryCode = FactoryCode.codeOf(meterInfo.getManufactureName());
                    if (Objects.nonNull(meterCode) && Objects.nonNull(factoryCode)) {
                        READING_METER.put(meterCode, identifier);
                        // 设置当前抄表厂商
                        READ_FACTORY.put(meterCode, FactoryCode.codeOfFactory(meterInfo.getManufactureName()));
                        LOGGER.info("{}|{}|{}|{}|{}", S_FREE, identifier, "READ METER", meterCode, meterInfo.getManufactureName());
                        map2.put(FieldKey.METER_CODE, meterCode);
                        map2.put(FieldKey.FIRM_CODE, factoryCode);
                        ObjectNode readMeter = CmdBuilder.builder().getCmdObjectNode(METER_READ.name(), identifier, map2);
                        ctx.writeAndFlush(new FramePacket(readMeter, framePacket.getSocketAddress(), null, ctx));
                        Thread.sleep(3 * 1000);
                        READING_SUCCESS.remove(meterCode);
                    }
                }

所以解决方案为:

  • 采用其他方式开启定时任务,而不是采用阻塞方式。
  • 去掉sleep方式,用非阻塞定时器控制时序逻辑。

总结一句话:慎用sleep() 啊

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值