##0828 维护福建etc项目时遇到的不可思议的事情

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_30531261/article/details/82155037

0828 维护福建etc项目时遇到的不可思议的事情

前言

我这边调用别人的接口,通过日志我看到接口返回的数据是null,而通过对方的日志,得到的信息却是接口是有返回数据的。感觉,不可思议。。。

正文

在这个公司,我的任务基本上就是写封装接口以及维护程序。福建etc的项目,圈存功能之前是正常的,但是这段时间一直没有测试圈存功能,然后今天测试了,结果测试人员说圈存调用失败了。

我这边看日志,发现圈存第一步的接口返回了null。很奇怪。于是找第三方(我接口中调用的是第三方公司的接口)的人帮忙处理。我把入参日志以及时间贴出来,然后他找到了这条记录,并贴出了出参。

可是,我的代码在这期间明明没有改动过。几天前这个圈存接口还是正常的。工作中总是会遇到一些让人觉得不可思议的问题。明明什么都没有改过,却突然出问题了。哈哈。郁闷死了。更郁闷的是,对方通过日志说他们是有响应的,可是我这边收到的却是null。

也就是说,他接口有返回数据。可是我这边却没有接收到数据。很奇怪。这个项目使用的通讯方式并非使用http,而是使用mina自定义协议。

最后,通过观察对方贴出来的日志,发现了一个可疑点。这个圈存接口的入参和出参隔了13秒。于是,再回过头来看我这边的代码。发现了问题所在!!!
这边的代码的IoHandlerAdapter实现类的messageReceived方法中,是把接收到的数据放入一个BlockingQueue队列中。在通过mina发送数据后,接收数据的方式,不是使用future对象来等待获取数据,而是在BlockingQueue队列里取数,并且!设置的等待时间为5秒:

result = blockingQueue.poll(5, TimeUnit.SECONDS);

这就是问题所在了!!接口方13秒才返回了数据,而我这边的代码,设置了最长等待时间为5秒!!故获取不到数据!!!如此,造成日志中看到的信息——接口返回数据:null。

把问题解决后,发现,真有意思。也突然想起,前几天也有类似的问题,但是没搞明白是哪个环节出了问题。在数据库的一个表的remark字段里,看到有个别的记录写的是。原来,也是这个问题。当时对方也是说有返回数据的,但是我们通过日志却没有看到有返回数据,只看到了返回null。

后续操作:增加一个逻辑处理,如果从队列里取不到数据,就通过钉钉机器人把错误信息报到相关的钉钉群里。这样,就可以尽早的发现问题。尽早的把问题给处理掉。

最后

虽然我这边日志记录的是接口返回null,但并不一样是这样。就像这次,对方是有返回数据的,只是耗时比较长。而我这边,设置了最多只等待5秒。故获取不到数据。

冷静冷静很重要。越是紧急情况,越要冷静处理!

猜你喜欢

转载自blog.csdn.net/weixin_30531261/article/details/82155037
今日推荐