当前位置: 首页 > 知识库问答 >
问题:

嵌套异常是java.util.concurrent.executionException

危卜鹰
2023-03-14

我正在获取dynamo db中的所有记录,对于每条记录,我都要对一个外部服务进行多线程调用。

但是我得到了这个错误:

嵌套异常是java.util.concurrent.executionException:org.springframework.web.client.HttpServererRoreXception:500 null]

@Autowired
public RestTemplate restTemplate;

@Autowired
public MyCallable myCallable;
@GetMapping("/myApp-multithread")
public String getQuoteOnSepThread() throws InterruptedException, ExecutionException {
    System.out.println("#################################################Multi Threaded Post Call######################");
    ExecutorService executor= Executors.newFixedThreadPool(10);
    List<Future<String>> myFutureList= new ArrayList<Future<String>>();
    long startTime=System.currentTimeMillis()/1000;

    Iterable<Customer> customerIterable=repo.findAll();
    List<Customer> customers=new ArrayList<Customer>();
    customerIterable.forEach(customers::add);


    for(Customer c:customers) {

        myCallable.sendCustomerToInterface(c);
        //System.out.println(c);
        Future<String> future= executor.submit(myCallable);
        myFutureList.add(future);

    }

    for(Future<String> fut:myFutureList) {
        fut.get();
    }
    executor.shutdown();

    long timeElapsed= (System.currentTimeMillis()/1000)-startTime;

    System.out.println("->>>>>>>>>>>>>>>Time Elapsed In Multi Threaded Post Call<<<<<<<<<<<<<<<-"+timeElapsed);
    return "Success";

}
public class MyCallable implements Callable<String>{

@Autowired
public RestTemplate restTemplate;

//int index=-1;

Customer c= c= new Customer();;
public void sendCustomerToInterface(Customer cust) {

    c= cust;
}

@Override
public String call() throws Exception {

    System.out.println("Customer no"+ c.getId() +"On thread Number"+Thread.currentThread().getId());
    return restTemplate.postForObject("http://localhost:3000/save", c, String.class);

}

}

编辑:

错误的完整堆栈跟踪:

org.springframework.web.client.httpserverroreXception:500 null at org.springframework.web.client.defaultresponseerrorhandler.handleerror(defaultresponseerrorhandler.java:88)~[spring-web-4.3.13.release.jar:4.3.13.release]at org.springframework.web.client.resttemplate.handleresponse ase.jar:4.3.13.发布]在org.springframework.web.client.resttemplate.execute(resttemplate.java:620)~[spring-web-4.3.13.release.jar:4.3.13.发布]在org.springframework.web.client.resttemplate.postforObject(resttemplate.java:387)~[spring-web-4.3.13.release]在com.ocademoclient.ocademoclient.mycallable.call~[classes/:na]在java.util.concurrent.futureTask.run(FutureTask.java:266)~[na:1.8.0_181]在java.util.concurrent.threadpoolexecutor.java:1149)~[na:1.8.0_181]at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:624)~[na:1.8.0_181]at java.lang.thread.run(thread.java:748)[na:1.8.0_181]

共有1个答案

贺雅健
2023-03-14

根据Javadoc:

试图检索通过引发异常而中止的任务的结果时引发的异常。

问题似乎是,对于一些客户

    restTemplate.postForObject("http://localhost:3000/save", c, String.class);

这是行不通的,因为您的MyCallable是一个有状态对象(它使用void sendCustomerToInterface(Customer cust)存储Customer存储Customer,并且需要稍后在Call()方法中检索这个特定的Customer)。

要使其工作,可以重写MyCallable,如下所示:

public class MyCallable implements Callable<String>{

    private RestTemplate restTemplate;
    private Customer c;

    public MyCallable(RestTemplate rt, Customer cust) {
        this.restTemplate = rt;
        this.c = cust;
    }

    @Override
    public String call() throws Exception {
        System.out.println("Customer no"+ c.getId() +"On thread Number"+Thread.currentThread().getId());
        return restTemplate.postForObject("http://localhost:3000/save", c, String.class);

    }
}

在控制器中编写

for(Customer c:customers) {

    MyCallable myCallable = new MyCallable(restTemplate, c);
    //System.out.println(c);
    Future<String> future= executor.submit(myCallable);
    myFutureList.add(future);

}
for (Customer c: repo.findAll()) {
    //...
}
 类似资料:
  • 问题内容: 我在Spring中使用javax-validation和hibaernate-validator进行表单验证。除了用于Spring的基本必要JAR文件。 我包括: 验证API-1.1.0.Final hibernate-validator-5.1.0.Final 我读到某处也关注到了spl4j版本:所以我也告诉: 错误原因可以归因于slf4j和log4j兼容性吗? 我使用注释基础验证。

  • 我使用Spring+Hibernate+MySQL for web应用程序进行开发。但是在过去的一周里,我总是在尝试运行orgdao.findAll()获取所有组织时遇到“nested exception is org.springframework.dao.invalidDataAccessResourceUsageException:”异常。即使我评论所有的关系属性,但仍然没有幸运。以下是代码

  • 我在我的项目中使用Spring引导和Spring数据,我有两个类: 第二类是: 添加任务的方法: 当我试图添加一个新的任务,它给出了这个错误: “找不到id为2的com.carpooling.entity.Station;嵌套异常为javax.persistence.EntityNotFoundException:找不到id为2的com.carpooling.entity.Station” 下面是

  • 异常: 嵌套任务透传 重新处理生成器嵌套,需要将子生成器异常抛向父生成器。 当生成器迭代过程发生未捕获异常,生成器将会被关闭,Generator::valid返回false,未捕获异常会从生成器内部被抛向父作用域,嵌套子生成器内部的未捕获异常必须最终被抛向根生成器的calling frame,PHP7中yield-from对嵌套子生成器resume时产生的异常,采取goto try_again传递

  • 堆栈跟踪: 配置xml 我的主要课程: 我还试着加上:aopalliance.jar SO上也有类似的问题:Spring嵌套异常java.lang.NoClassDefFoundError: org/aopAlliance/aop/建议 ###########编辑###########更新:项目中的其他类## Minstrel.java 勇敢的night.java 拯救少女探索。JAVA

  • 我在Spring中使用javax-validation和hibaernate-validator进行表单验证。而不是Spring所必需的基本JAR文件。 我在某处读到spl4j版本也受到关注,所以我也告诉大家: 错误的原因会不会是由于slf4j和log4j的兼容性? 我使用基于注释的验证。