springCould通过@Async标签异步方法中调用feign自动进入熔断函数????

在SpringCould中通常需要各个模块之间的相互调用实现数据互通和业务逻辑

但是当使用异步标签@Async与@EableAsync的配合使用的时候,在@Async标注的异步方法中调用fegin会自动进入熔断函数。

在网上查阅资料发现@Async的方法不可以调用fegin

当生产者的接口,只是调用另外一个外部接口的作用的时候(即生产者只有你一个消费者),可以将被调用方法打上异步@Async标签,将消费者异步方法标签删除,也可实现异步效果。

我的代码情况如下

调用方:

 @Override
    public void deleteInfoToIm(String ids) throws Exception {
        String[] idList=ids.split(",");
        for(String id:idList){
            Map<String,Object> paramsMap = new LinkedHashMap<String,Object>();
            paramsMap.put("userId",id);
            paramsMap.put("ImFlag","4");
            //调用im接口
            syncToImApiFeignClient.SyncUserToImApi(paramsMap);
        }
    }
@FeignClient(name="${feign.client.XXXXX.name}",
        fallback= XXXXXFeignClientHystrix.class,
        path = "${feign.client.XXXX.path}")XXXX
public interface SyncToImApiFeignClient {

    @PostMapping("/XXXXXCtrl/doOrgSynUpdate")
    JsonResult SyncOrgToImApi(@RequestBody Map<String, Object> map) throws Exception;


    @PostMapping("/XXXXXCtrl/doUserSynUpdate")
    JsonResult SyncUserToImApi(@RequestBody Map<String, Object> map) throws Exception;

}

被调用方:

    @Async
    @PostMapping("/doOrgSynUpdate")
    public JsonResult doOrgSynUpdate(@RequestBody Map<String,Object> params){
        JsonResult result = null;
        try {
            if(AegisCommonUtils.isNull(params.get("orgId"))
            ||AegisCommonUtils.isNull(params.get("ImFlag"))){
                return JsonResultUtils.getFailInstance("参数错误");
            }
            result = XXXXXXService.doOrgSynUpdate(params);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring,可以使用`CompletableFuture`和`AsyncConfigurer来检查@Async调用是否已完成。 首先,你需要在方法上使用`@Async`注解,这样方法就会异步执行。然后你可以使用`CompletableFuture`来检查异步执行的状态。`CompletableFuture`是Java 8引入的一个类,它可以让你更方便地处理异步任务的结果。 接下来,你需要实现`AsyncConfigurer`接口,并重写`getAsyncExecutor`方法。在这个方法,你可以使用`ThreadPoolTaskExecutor`来配置异步执行的线程池。然后你可以返回这个线程池,让Spring使用它来执行异步任务。 最后,你可以使用`CompletableFuture`的`isDone()`方法来检查异步执行是否已完成。如果已完成,你可以使用`get()`方法获取异步执行的结果。 下面是一个示例代码: ```java @Service public class MyService implements AsyncConfigurer { @Async public CompletableFuture<String> doSomethingAsync() { // 异步执行的代码 return CompletableFuture.completedFuture("Done"); } public void checkAsyncExecution() { CompletableFuture<String> future = doSomethingAsync(); if (future.isDone()) { String result = future.get(); // 处理异步执行的结果 } } @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(100); executor.initialize(); return executor; } } ``` 在上面的代码,`doSomethingAsync`方法使用`@Async`注解来异步执行代码,并返回一个`CompletableFuture`对象。`checkAsyncExecution`方法使用`isDone`方法来检查异步执行是否已完成,并使用`get`方法获取异步执行的结果。`getAsyncExecutor`方法返回一个`ThreadPoolTaskExecutor`对象,用来执行异步任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值