为什么播放(netty3)上传使用单线程?

时间:2011-11-10 08:55:47

标签: multithreading tomcat playframework jetty netty

我使用play来开发我的项目和嵌入式netty3作为我的应用程序服务器 请检查以下测试代码:

package controllers;  
import java.io.File;  
import java.io.IOException;  
import java.util.HashMap;  
import java.util.Map;  
import java.util.concurrent.atomic.AtomicInteger;  

import org.apache.commons.io.FileUtils;  

import play.Logger;  
import play.Play;  
import play.mvc.Controller;  
import play.mvc.results.RenderText;  

public class Upload extends Controller {  

    private static Integer counter = 0;  
    private static final Integer MAX = 1;  

    public static void index() {  
        render("/upload.html");  
    }  

    public static void upload(File file) {  
        System.out.println("start " + Thread.currentThread());  
        synchronized (counter) {  
            System.out.println("middle " + Thread.currentThread());  
            if (counter > MAX) {  
                renderText("Sorry, the max upload thread is " + MAX);  
            } else {  
                counter++;  
                uploadFile(file);  
                counter--;  
                renderText("Upload success");  
            }  
        }  
        System.out.println("end " + Thread.currentThread());  
    }  

    static void uploadFile(File imgFile) {  
        File file = Play.getFile("/uploads");  
        try {  
            FileUtils.copyFileToDirectory(imgFile, file);  
        } catch (IOException e) {  
            Logger.error("upload file error", e);  
        }  
    }  

}  

当我打开两个浏览器(Firefox和Chrome)同时上传文件时,我在'上传(文件文件)'方法中调试了断点。但我发现只有1个线程在处理。 之后,第二个请求来了。

输出结果为:

start Thread[play-thread-1,5,main]
middle Thread[play-thread-1,5,main]
start Thread[play-thread-1,5,main]
middle Thread[play-thread-1,5,main]

但是在Tomcat / Jetty中,控制台中有两个线程输出。

之前是否有任何身体遇到同样的问题?

1 个答案:

答案 0 :(得分:4)

我假设您在开发模式下运行?

播放文档说,为了使调试更容易,默认情况下,Play在开发模式下以单线程模型运行,而在生产模式下,它以numbers_of_cores + 1运行。

您可以在application.conf中覆盖它。

# example of using a thread pool of 3
play.pool=3