Propriedade de solicitação de intervalo HTTP?
Estou preso escrevendo algumas partes do código java tentando baixar por intervalo um arquivo de destino de um host remoto. Estou esperando baixar arquivos remotos por alguns pedaços, contando com algum processo multithread.
De acordo com o seguinte rastreamento de depuração, tudo está funcionando bem:
Task 2 --> REQUEST PROPERTIES = {Range=[bytes=59124782-88687172]}
Task 3 --> REQUEST PROPERTIES = {Range=[bytes=88687173-118249563]}
Task 0 --> REQUEST PROPERTIES = {Range=[bytes=0-29562390]}
Task 1 --> REQUEST PROPERTIES = {Range=[bytes=29562391-59124781]}
Task 2 --> RETURN_CODE = 206 ==> OK :-) !
Task 2 --> Start Byte = 59124782 / End Byte = 88687172 --> Total bytes = 29562391
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 29562390 --> Total bytes = 29562391
Task 3 --> RETURN_CODE = 206 ==> OK :-) !
Task 3 --> Start Byte = 88687173 / End Byte = 118249563 --> Total bytes = 29562391
Task 1 --> RETURN_CODE = 206 ==> OK :-) !
Task 1 --> Start Byte = 29562391 / End Byte = 59124781 --> Total bytes = 29562391
De acordo com o seguinte rastreamento de depuração, tudo NÃO está funcionando bem:
Task 0 --> REQUEST PROPERTIES = {Range=[bytes=0-15308169]}
Task 3 --> REQUEST PROPERTIES = {Range=[bytes=45924510-61232679]}
Task 1 --> REQUEST PROPERTIES = {Range=[bytes=15308170-30616339]}
Task 2 --> REQUEST PROPERTIES = {Range=[bytes=30616340-45924509]}
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 15308169 --> Total bytes = 15308170
Task 3 --> RETURN_CODE = 200 ==> NOK :-( !
Task 2 --> RETURN_CODE = 200 ==> NOK :-( !
Task 1 --> RETURN_CODE = 200 ==> NOK :-( !
O truque é entre duas execuções, o código é o mesmo, o host remoto é o mesmo ... apenas o arquivo de destino não é o mesmo (o segundo é metade menor que o primeiro e os dois são arquivos .zip). Ao solicitar um intervalo definido, estou esperando para cada código de retorno da tarefa 206 o que é recebido com dados parciais. Mas, contando com o segundo rastreamento, estou obtendo o código 3 da tarefa 200 mais recente, o que significa que a resposta do servidor está ok, mas enviará o arquivo completo :-( ....
Que rei da magia negra pode levar a tal ????. Pesquisando um pouco, encontrei um servidor http que pode introduzir algum processo de coalescência de solicitações de intervalo ... isso pode acontecer aqui?
Quando vários intervalos são solicitados, um servidor PODE unir-se a qualquer um dos intervalos que se sobrepõem, ou que são separados por uma lacuna menor do que a sobrecarga de envio de várias partes, independentemente da ordem em que a especificação de intervalo de bytes correspondente apareceu em o campo de cabeçalho de intervalo recebido. Como a sobrecarga típica entre partes de uma carga útil multipart / byteranges é de cerca de 80 bytes, dependendo do tipo de mídia da representação selecionada e do comprimento do parâmetro de limite escolhido, pode ser menos eficiente transferir muitas pequenas partes separadas do que transferir toda a seleção selecionada. representação.
Apenas para informações, aqui está o meu código java:
HttpURLConnection urlConn = null;
try {
urlConn = task.openConnection(task.getSourceFileUrl());
urlConn.setRequestMethod("GET");
urlConn.setRequestProperty("Range", "bytes=" + currentByte + "-" + endByte + "");
System.out.println(String.format("Task %s --> REQUEST PROPERTIES = %s", id, urlConn.getRequestProperties().toString()));
if (urlConn.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {
System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> NOK :-( !", id, urlConn.getResponseCode()));
return;
} else {
System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> OK :-) !", id, urlConn.getResponseCode()));
}
System.out.println(String.format("Task %s --> Start Byte = %s / End Byte = %s --> Total bytes = %s", id, currentByte, endByte, urlConn.getContentLengthLong()));
Thks for help !!!!!