Почему загрузка play (netty3) использует один поток? - PullRequest
0 голосов
/ 10 ноября 2011

Я использую 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) для одновременной загрузки файлов, я отладил точку останова в методе upload (File file). Но я обнаружил, что только 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 Ответ

4 голосов
/ 10 ноября 2011

Я предполагаю, что вы работаете в режиме Dev?

В документе воспроизведения сказано, что для упрощения отладки по умолчанию воспроизведение выполняется в однопоточном режиме в режиме разработки, а в производственном режиме выполняется как numbers_of_cores + 1.

.в приложении .конф.

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