在微服务spring cloud中为什么使用feign?
1,可以直接用浏览器访问,是一个伪http客户端。
2,可以实现负载均衡,一个挂掉了,另一个可以继续用
3,熔断功能,比如发现A服务挂掉,就会立马返回失败信息
不用设置超时,不用配置。不会造成并发等待。
当我在做物流订单释放资源时,使用了feign,当订单删除时,应该释放本平台订单号。
/**
* 删除物流订单
* @param env
* @param id
* @throws Exception
*/
@Override
public void delete(ClientEnvironment env, String order_id) throws Exception {
// 系统当前时间
Date day = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
UFDateTime ufDateTime = new UFDateTime(df.format(day));
// 获取当前用户
String name = env.getCurrUser().getEnterprise_name();
OrderLogisticsVO vo = (OrderLogisticsVO) dao.findByPrimaryKey(OrderLogisticsVO.class, order_id);
vo.setModified_time(ufDateTime);
vo.setModifier(name);
this.beforeDelete(env, OrderLogisticsVO.class);
dao.deleteByPK(OrderLogisticsVO.class, order_id);
// 判断货源是否本平台订单
if(vo.getIs_platform_order() != 2) {
return;
}
iOrdercenterService.releaseOrder(vo.getIs_order_type(), vo.getOrder_code());
}
但是每次我删除订单以后,订单号并没有清空为null。然后我就去看了我的sql’语句
/**
* 物流释放订单
*
* @param is_order_type 订单类型 1: 挂牌 2:竞价
* @param order_code 订单编码
*/
@Override
public void releaseOrder(Integer is_order_type, String order_code) throws Exception {
dao.getParams().add(order_code);
// 判断是挂牌还是竞价
if (is_order_type == 1) {
dao.executeUpdate(" update li_order_center set source_id = null where order_code = ? ");
}
if (is_order_type == 2) {
dao.executeUpdate(" update li_order_price set source_id = null where order_code = ? ");
}
}
检查一遍觉得updat语句没有问题。接下来就去检查了查询语句,
String sql = "select * from li_order_center where order_state = 3 and dr = 0 and (source_id is null or source_id ='' ) and ((sales_unit_id=? and sales_corp_code like ?)or(bug_customer_id =? and buyer_corp_code like ?))";
接下来去看日志
**update li_order_center set source_id = null where order_code ='WLD20190808008' ");**
执行耗时:1毫秒
2019-08-12 11:31:58.511 INFO [http-nio-8087-exec-3] [et.common.dao.impl.SuperDAOImpl] [(execute:367)] - 符合条件的记录数为:0
看见日志后发现sql没执行,我就以为是事务回滚了。找了半天的rollback。
后来去数据库运行了sql,才发现order_code是物流订单编码, 应该是挂牌或竞价的编码
最后把order_code改成存储订单编码的字段make_order_num。就释放成功了!
iOrdercenterService.releaseOrder(vo.getIs_order_type(), vo.getMake_order_num());
一定要根据日志排查问题,不要乱猜测。