【问题标题】:REST with Java using JerseyREST 与 Java 使用 Jersey
【发布时间】:2017-04-06 07:30:30
【问题描述】:

我正在安静地调用 servlet doGet() 方法。在doGet() 方法中,我正在进行一个方法调用,该方法调用需要花费大量时间进行处理,因此doGet() 方法超时并且无法将响应发送回进行调用的应用程序。

所以现在我想立即将响应发送回调用doGet() 方法的应用程序doGet() 被调用。

我可以使用线程吗?一个线程会回复,而另一个线程会继续方法调用。我需要使用任何webservice 框架,例如Jersey 吗?

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("in the Do Get");
        String tableName = (String)request.getParameter("tableName");
        tableName = tableName.replaceAll("[^A-Z0-9_]", "");
        System.out.println("setup connections");
        SampleService sampleService = new SampleService(new Properties());
        Thread t = new Thread(new Runnable() {
            public void run() {
                // stuff here
                sampleService.execute(tableName);
            }
        });
        t.start();

我正在创建类来实现 Runnable 接口,并在 run 方法中编写方法调用(需要大量时间处理的方法)的逻辑。还有如何在这个运行时发送响应

【问题讨论】:

标签: java web-services rest jersey


【解决方案1】:

您可以使用 2 个threads,这样一个会响应并终止,另一个会做后台工作。这种方法可以在上面的代码中实现,也可以像Jersey 这样的用户框架来实现。使用任何框架的主要好处是框架隐藏了复杂性并提供易于使用和可定制的界面(abstractions 的概念)

使用Jersey,您可以使用AsyncResponse 创建Asynchronous API,也可以将@ManagedAsync 注释与AsyncResponse 一起使用

下面是一个例子-

    @GET
    @ManagedAsync
    public void getMessage(@Suspended final AsyncResponse asyncResponse) {
        System.out.println("1. Registering callback");
        asyncResponse.register(new CompletionCallback() {
            @Override
            public void onComplete(Throwable throwable) {
                if (throwable == null) {
                    // no error
                    System.out.println(
                            "4. Request processing is successful");
                } else {
                    System.out.println(
                            "4. Error occurred in request processing");
                }
            }
        });
        System.out.println("2. Executing expensive operation");
        String result = expensiveOperation();
        System.out.println("3. Notify callback and send response ");
        asyncResponse.resume(result);

        System.out.println("5. Thread exiting");
    }

Sysout 语句仅供参考,可以删除。

如果你想直接使用Servlet,然后创建一个thread,启动它并返回你当前的response -

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("in the Do Get");
        String tableName = (String)request.getParameter("tableName");
        tableName = tableName.replaceAll("[^A-Z0-9_]", "");
        System.out.println("setup connections");
        SampleService sampleService = new SampleService(new Properties());
        // this tread will run in even after response is send   
        Thread t = new Thread(new Runnable() {
            public void run() {
                // stuff here
                sampleService.execute(tableName);
            }
        });
        t.start();
        // send the response
        response.setContentType("application/json");
        resp.getWriter().write("response JSON here");
        return;
 }

您还可以将 Jackson 用于 object mappingJSON 用于返回 response

【讨论】:

  • 我需要使用线程来做这个可以做到吗?我也尝试了示例代码 sn-p 并编辑了问题。你能帮我看看如何做到这一点
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2017-05-06
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多