子线程不能调用父线程的FeignClient服务解决方案

  • 因为要导入数据到Hive中,故开启了一个新的线程,导入完数据后,要调用另一个服务的接口version+1然后保存到数据库中。
  • 开启新线程:
@Override
    public Map<String, Object> loadExceToHive(MultipartFile file, Long nodeId, String importType, CurrUserInfo currUserInfo,String token) throws Exception {
       //....
        //开启线程
        Thread thread = new Thread(new TagUdfDataImportThread(realPath, importDataVo, txtPath2, importType, importLogDO.getId(), tagUdfDO, currUserInfo, mainKeyFields, modelDO, webDate, p_exchange_date,token));
        thread.start();
        Map<String, Object> map = new HashMap<>();
        map.put("id", importLogDO.getId());
        return map;
    }
  • 线程中调用FeignClient服务
 @Override
    public void run() {
        try {
           //        加载完成后修改自定义标签的版本号+1
       MetaServiceClient metaServiceClient = SpringApplicationContextHolder.getBean(MetaServiceClient.class);
        this.tagUdfDO.setVersion(this.tagUdfDO.getVersion()+1);
        metaServiceClient.tagUdfUpdate(this.tagUdfDO);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • FeignClient内代码
@Component
@FeignClient(value = "meta-service", configuration = FeignConfiguration.class)
public interface MetaServiceClient {

    //自定义标签修改
    @PostMapping("/tagUdf/update")
    ApiResult tagUdfUpdate(@RequestBody TagUdfDO tagUdfDO);

}
  • 这样调用会出现空指针异常,主线程可以调用成功,子线程调用失败。

解决方案:子线程中,新开启一个请求,代码如下:

@Override
    public void run() {
        try {
           //        加载完成后修改自定义标签的版本号+1
		       TagUdfService tagUdfService = SpringApplicationContextHolder.getBean(TagUdfService.class);
		       this.tagUdfDO.setVersion(this.tagUdfDO.getVersion()+1);
               tagUdfService.tagUdfUpdate(tagUdfDO,token);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
  • tagUdfService中的代码
/**
     * 自定义标签的修改
     * @param tagUdfDO
     */
    @Override
    public void tagUdfUpdate(TagUdfDO tagUdfDO,String token) {
        //headers
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("token", token);
        requestHeaders.add("content-type", MediaType.APPLICATION_JSON_UTF8.toString());
        //body
        MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
        String json = JSON.toJSONString(tagUdfDO);
        log.info(json);
        JSONObject jsonObject =JSONObject.parseObject(json);
        for(String key:jsonObject.keySet()){
            requestBody.add(key, jsonObject.getString(key));
        }
        //HttpEntity
//        HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(requestBody, requestHeaders);
        HttpEntity<String> requestEntity = new HttpEntity<String>(json, requestHeaders);
        //post
        ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://meta-service/tagUdf/update", requestEntity, String.class);
        log.info(" responseEntity :"+responseEntity.getBody());
    }
  • 子线程中调用成功
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值