我試圖在Akka中使用PLay 2在webapp中實現大塊響應。但是,不是按塊加載響應,而是所有響應都是一次。下面是由我在控制器中創建塊代碼:
爲什麼玩2.5 Akka大塊響應一次加載全部
/**
*
*/
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import akka.stream.javadsl.Source;
import akka.util.ByteString;
import org.pmw.tinylog.Logger;
import play.cache.CacheApi;
import play.cache.Cached;
import play.filters.csrf.AddCSRFToken;
import play.filters.csrf.CSRF;
import play.libs.Json;
import play.libs.concurrent.HttpExecutionContext;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Http.Cookie;
import play.mvc.Result;
import akka.NotUsed;
import akka.actor.Status;
import akka.stream.OverflowStrategy;
import akka.stream.javadsl.Source;
import akka.util.ByteString;
/**
* @author Abhinabyte
*
*/
@Singleton
@AddCSRFToken
public class GetHandler extends Controller {
@Inject
private CacheApi cache;
@Inject
private HttpExecutionContext httpExecutionContext;
public CompletionStage<Result> index() {
return CompletableFuture.supplyAsync(() ->
Source.<ByteString>actorRef(256, OverflowStrategy.dropNew())
.mapMaterializedValue(sourceActor -> {
CompletableFuture.runAsync(() -> {
sourceActor.tell(ByteString.fromString("1"), null);
sourceActor.tell(ByteString.fromString("2"), null);
sourceActor.tell(ByteString.fromString("3"), null);
try {
Thread.sleep(3000);//intentional delay
} catch (InterruptedException e) {
e.printStackTrace();
}
sourceActor.tell(ByteString.fromString("444444444444444444444444444444444444444444444444444444444444444444444444"), null);
sourceActor.tell(new Status.Success(NotUsed.getInstance()), null);
});
return sourceActor;
})
).thenApplyAsync(chunks -> ok().chunked(chunks).as("text/html"));
}
}
及以下是application.conf的阿卡線程池配置:
akka {
jvm-exit-on-fatal-error = on
actor {
default-dispatcher {
fork-join-executor {
parallelism-factor = 1.0
parallelism-max = 64
task-peeking-mode = LIFO
}
}
}
}
play.server.netty {
eventLoopThreads = 0
maxInitialLineLength = 4096
log.wire = false
transport = "native"
}
正如你可以看到之前發送最後一個大塊我有意拖延響應時間。因此在邏輯上,所有分塊的數據都應在它之前交付。
但是,在我的情況下,大量的數據正在被加載。我已經在所有瀏覽器中測試過(甚至嘗試過CURL)。
我在這裏錯過了什麼?
不工作:(同樣的事情正在發生的事情就像之前 –
你確定嗎?我測試了它自己...發表您的整個控制器的要點。 – Mikesname
更新程式碼與整個控制器代碼,請有看看我是否遺漏了一些東西 –