java - 如何实现多线程以调用多个数据的 REST URL

标签 java spring multithreading

我有以下代码库,它将命中 REST URI 并返回响应:

   @ApiOperation(responseContainer = "request", response = ETLRequest.class, value = "testValidation")

   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
   @RequestMapping(value = "/getValue", produces = MediaType.APPLICATION_JSON, method = RequestMethod.PUT)
   @ResponseBody
   public Response getETLResponse(@RequestParam("unID") String httpEntity,@RequestParam(value = "PId", defaultValue = "Optional") String pId)throws Exception 
   {
     try {

            if (httpEntity.contains(",")) 
             {

                if (resultSet.size() > 0) 
                {
                    resultSet.clear();
                }

                String[] strArray = httpEntity.split(",");

                for (String str : strArray) 
                {
                    System.out.println(str + "FIRST....");
                    response = RESTInvoker.validateREST(JSONToPOJO
                            .buildURL(str));
                    System.out.println(response + "\t RESPONSE");
                    resultSet.add(response);
                }
                return Response.status(Response.Status.ACCEPTED)
                        .entity(resultSet).build();
            } 

         } catch (Exception ex) {
            ex.printStackTrace();
            return Response.status(Response.Status.BAD_REQUEST).build();

        }
    }

示例请求

{
  "unID": "1946249809, 194602775536,194624982809, 19462475536,19462775536,194624002779,19002775536,12494002775536,19462495536,194940536,1949775536,19402775536,1946945536,194475536,194600536,194775536,1946275536,1946205536,1902775536,14002775536,775536",
  "PId": "optional"
}

上面的代码工作正常。它将获取 UnID 作为查询参数,并使用 (,) 分隔符分隔值。 UnID 的一条记录将附加到请求 URI 中,并将响应作为字符串响应返回到代码库之上。

我只是想在多线程概念中实现上述任务。就像我想从 UnID 查询参数(如果它有逗号分隔值)获取 10 条记录(10 个不同的线程),并调用 REST URI 来加速该过程。

上面的代码将花费一秒钟来调用响应。如果我在 UnId 中有 10 个输入值,则需要 10 秒才能运行所有值。时间会根据测试数据和序列执行而增加。我只想在一秒钟内选择 10 个输入,并使用不同的线程通过 REST URI 进行调用。

我使用的是 Java 7。

有线索吗?

最佳答案

在 Java 7 中,您可以使用“ThreadPoolExecutor”,它是一个线程池。池中的每个线程“同时”运行。以下代码示例演示了每个线程如何运行(有延迟)。静态类Task实现了runnable,由ThreadPoolExecutor执行:

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class BasicThreadPoolExecutorExample {
    static class Task implements Runnable {
        private String name;

        Task(String name) {
            this.name = name;
        }

        String getName() {
            return name;
        }

        @Override
        public void run() {
            try {
                Long duration = (long) (Math.random() * 10);
                System.out.println("Doing a task during : " + name);
                TimeUnit.SECONDS.sleep(duration);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadPoolExecutor executor = (ThreadPoolExecutor)  Executors.newCachedThreadPool();
        for (int i = 0; i <= 5; i++) {
            Task task = new Task("Task " + i);
            System.out.println("A new task has been added : " + task.getName());
            executor.execute(task);
        }
        executor.shutdown();
    }
}

运行代码会产生以下输出:

A new task has been added : Task 0
A new task has been added : Task 1
A new task has been added : Task 2
A new task has been added : Task 3
A new task has been added : Task 4
A new task has been added : Task 5
Doing a task during : Task 0
Doing a task during : Task 1
Doing a task during : Task 2
Doing a task during : Task 3
Doing a task during : Task 5
Doing a task during : Task 4

关于java - 如何实现多线程以调用多个数据的 REST URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189770/

相关文章:

java - 为什么线程池中执行大量Runnable时内存占用会增加?

java - 不幸的是 MyApp 已停止。我该如何解决这个问题?

java - 执行顺序和Thread.sleep

.net - 多线程变量访问

multithreading - 如何防止线程在视觉上混淆彼此的输出?

java - 是否可以使用 Java 收集有关计算机硬件的信息?

java - WSDL - 如何从 Eclipse 连接到 Web 服务

java - 在运行时进行 Spring 上下文分析的最先进工具是什么?

java - 实体方面( Spring )

java - 在Spring应用程序中使用jpa实体管理器将blob导入mysql