0

我有控制器阻塞播放服务器线程由于非常缓慢的数据库查询的方法。我需要以一种不会阻塞线程的方式实现控制器方法。 我已阅读文档: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合作过并承诺过。 任何人都可以给我任何指示如何处理这个?

+0

当你说“不工作”你能详细说一下发给你面对? – iwalktheline 2012-07-09 09:55:29

回答

0

因为JDBC使用阻塞IO,任何慢速数据库查询都会阻塞一个线程。 唯一的方法似乎是使用作业的目的。

0

对我来说,最好的方法是使用返回List对象的Job。然后在你的控制器,你可以等待作业结束:

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

,你把你的JPA代码在你的工作