当前位置: 首页 > news >正文

医院网站建设策划书wordpress 调用评论

医院网站建设策划书,wordpress 调用评论,手机网站修改,城市焦点商城网站建设案例说明#xff1a;本文记录一次偶然出现的空指针异常#xff0c;在微服务架构中#xff0c;一个服务在调用另一个服务时#xff0c;出现了空指针异常。 业务描述#xff1a;在做订单超时功能时#xff0c;大家都知道#xff0c;可以使用RabbitMQ延迟队列#xff0c;下单…说明本文记录一次偶然出现的空指针异常在微服务架构中一个服务在调用另一个服务时出现了空指针异常。 业务描述在做订单超时功能时大家都知道可以使用RabbitMQ延迟队列下单的同时给队列发送一个延迟消息消息的内容是订单号比如延迟10分钟。10分钟之后该消息被消费者监听到会根据该订单ID查询数据库看该订单的状态是否为已支付是则忽略否则取消该订单恢复商品库存等等其他操作然而此时出现了空指针异常消息未被消费被路由到死信队列中。 微服务调用报空指针异常 消息被路由到死信队列 如下图的第三步 分析 首先排除FeignClient的问题因为下单减少库存取消订单恢复库存我使用的是同一个接口只是修改了商品的正负数不可能出现下单时可以取消订单时再使用就报错。 controller层代码 /*** 根据ID更新商品库存* param id* param num*/PutMapping(/update/{id}/{num})public void updateStockById(PathVariable(id) Long id, PathVariable(num) Integer num){itemService.updateStockById(id,num);}service层代码 Overridepublic void updateStockById(Long id, Integer num) {if (!ObjectUtil.isAllNotEmpty(id, num)) {System.out.println(参数不能为空);}if (id 0 || num 0) {System.out.println(参数非法);}update().setSql(stock stock num).eq(id, id).update();}其次再思考会不会不是因为Feign的调用报错而是微服务之间有什业务产生的报错。于是我找到了拦截器。 为了保证用户登录后经过Gateway网关后信息可以被下游服务获取到我的代码中是使用MVC拦截器Feign拦截器实现的如下图 每个服务会有两个拦截器分别把服务接收到的请求发出的请求拦截到然后分别解析用户信息添加用户信息到请求头以此达到参数透传用户信息可在微服务之间流传。 MVC拦截器代码获取请求头中用户的ID存到ThreadLocal中 public class AuthorizationInterceptor implements HandlerInterceptor {/*** 收到请求会执行的方法* param request* param response* param handler* return* throws Exception*/Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String id request.getHeader(authorization);if (id ! null id ! ){long l Long.parseLong(id);TokenThreadLocal.set(l);}else {responseHandler(response);return false;}// 放行return true;}…… }Feign拦截器将本服务中的ThreadLocal中的用户ID再设置到请求头上 /*** 发送请求拦截器*/ Slf4j public class AuthorizationRequestInterceptor implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header(authorization,TokenThreadLocal.get().toString());} }排查 给这两个地方分别打上断点等订单超时后进入拦截器的代码排查一下 断点来到Feign拦截器选中这行代码一看原来是这里报了空指针异常 再一看原来是TokenThreadLocal.get().toString()这里是空的 然后恍然大悟MQ发送消息是异步请求ThreadLocal本地线程池对象自然为空 解决 很自然的想到一种很简单的解决方法发送消息的时候把ThreadLocal中的值用户ID也给发到延迟队列中然后在消费者监听的代码里面再使用ThreadLocal的set()方法把用户ID设置到线程池中 把订单ID、用户ID封装成一个Map转为json格式发送到延迟队列里 消费者代码这边使用ThreadLocal的set()方法把用户ID再设置进去 启动测试下单等待订单超时清理超时订单进入断点问题解决 总结 这是一个非常隐蔽的异常因为设置了死信队列未被成功消费的消息会被路由到死信队列中程序并不会报错并且因为订单表的内容大部分是在订单服务中此异常仅仅会影响订单被取消后调用商品服务恢复商品库存数量这一个很小的功能未能执行要排除出来是非常困难的。 而问题原因概括来说是因为ThreadLocal的值不能在RabbitMQ的消息中传递导致在使用拦截器获取ThreadLocal值的时候报了空指针异常。
http://www.yutouwan.com/news/61287/

相关文章:

  • 企业网站建设费用会计分录aws如何搭建wordpress
  • wordpress缩略图路径错误seopc流量排名官网
  • 网站域名怎么过户网站建设公司名
  • 广州找人做网站湛江企业模板建站
  • 宁远做网站国外做网站的公司
  • 网站模块 带采集平台推广引流怎么做
  • 国际网站开发客户wordpress 编辑器 国外
  • 学校网站的建设目标手机做简单的网站
  • 做海报的网站知乎nodejs可以做企业网站吗
  • 兼职刷客在哪个网站做中企动力做的网站后台怎么登录
  • 网站首页适配规则公司ppt简介模板
  • 泉州做网站哪家好喀什建设网站
  • 网站开发和ui的区别秦皇岛属于哪个省哪个市的
  • 义乌制作网站要多少钱51找呀模板网
  • 网站备案资料 下载企业网站上的二维码怎么获得
  • 做前端网站用什么软件写代码新郑龙湖网站建设
  • 网页小游戏的网站网站模板怎么用呢
  • 怎么做网站服务器系统免费logo生成器在线制作
  • 免网站域名注册网站开发众包平台
  • 遵义本地网站网页无法访问qq可以登陆
  • 专门做二手手机的网站有哪些wordpress 文章图片居中
  • 做网站最低服务器配置黄州做网站的
  • 青海省网站建设高端wordpress调用标签大全
  • 书店建设网站的能力wordpress 目录seo
  • 免费源码分享网站网站建设与管理这门课程的介绍
  • 长沙专业外贸建站公司简述网站栏目管理
  • 如何做一间公司的网站网站建设宣传的目的
  • 南通做网站优化分销商城系统要具备哪些
  • 建设厅网站的投诉可以哪里查10个免费自学网
  • 手机网站做分享到朋友圈热搜关键词