如何实现异步响应?

时间:2012-07-09 09:27:15

标签: concurrency playframework playframework-1.x java.util.concurrent

我有控制器的方法,由于数据库查询非常慢,阻止Play服务器线程。我需要以不阻塞线程的方式实现控制器方法。 我已阅读文档:http://www.playframework.org/documentation/1.2.4/asynchronous

在任何地方都没有关于如何做到这一点的例子。我发现的唯一一件事是https://github.com/playframework/play/blob/master/samples-and-tests/chat/app/controllers/LongPolling.java 它只是将结果包装在await();

当我尝试这样做时,它不起作用。

路线:

GET /blog Controller.blog

控制器(这不是一个实际的慢速查询,但其他一切都是相同的):

public static void blog() {
    String queryStr = "SELECT b FROM Blog b ORDER BY createTime DESC";
    JPAQuery q = Blog.find(queryStr);

    List<Blog> bList = q.fetch(100);
    List<BlogDTO> list = new ArrayList<BlogDTO>(bList.size());
    for (Blog b : bList) {
        BlogDTO obj = new BlogDTO(b);
        list.add(obj);
    }
    renderJSON(list);
}

我尝试了List<Blog> bList = await(q.fetch(100));,但这不起作用。

我以前没有和Future和承诺合作过。 任何人都可以给我任何关于如何处理这个问题的指示吗?

2 个答案:

答案 0 :(得分:0)

由于JDBC使用阻塞IO,因此任何慢速数据库查询都将始终阻止线程。 唯一的方法似乎是为此目的使用Job。

答案 1 :(得分:0)

对我来说,最好的方法是使用一个返回List对象的Job。然后在您的控制器中,您可以等待作业终止:

public static void blog() {
    List<BlogDTO> list = await(new BlogPostJob().now());
    renderJSON(list);
}

你把你的jpa代码放在你的工作中