Отправить файлы с HTTP
Компания, в которой я работаю, отправляет файлы по другому протоколу, но с тех пор несколько раз у нас возникают проблемы с использованием протокола HTTP для клиента (он работает на моей виртуальной машине).
@Override
public void send(final String nf, final InputStream is)
throws Exception {
HttpClient http = HttpClientBuilder.create().build();
InputStreamEntity ise = new InputStreamEntity(is);
ise.setContentType(MediaType.APPLICATION_XML);
ise.setChunked(true);
HttpPost post = new HttpPost(this.serveur);
post.setEntity(ise);
HttpResponse r = http.execute(post);
if (r != null) {
int statut = r.getStatusLine().getStatusCode();
logguer(String.format(
statut == HttpStatus.SC_OK ? C_LOG_TRANSMISSION_HTTP_SUCCES : C_LOG_TRANSMISSION_HTTP_FAIL,
statut));
}
}
И затем мы вызываем этот метод в try catch. Полный стек журнала:
java.lang.Exception: Fail when sending.
at com.pharmagest.dexter.plugins.transmissions.ATransmission.envoyer(ATransmission.java:262) ~[dexter-moteur.jar:na]
at com.pharmagest.dexter.plugins.transmissions.ATransmission.transmettre(ATransmission.java:284) ~[dexter-moteur.jar:na]
at com.pharmagest.dexter.moteur.ExecutionJob.executerTransmission(ExecutionJob.java:335) ~[dexter-moteur.jar:na]
at com.pharmagest.dexter.moteur.ExecutionJob$$FastClassBySpringCGLIB$$9ce8f3e4.invoke(<generated>) ~[spring-core-4.0.4.RELEASE.jar:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708) ~[spring-aop-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) ~[spring-tx-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) ~[spring-tx-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) ~[spring-aop-4.0.4.RELEASE.jar:4.0.4.RELEASE]
at com.pharmagest.dexter.moteur.ExecutionJob$$EnhancerBySpringCGLIB$$404cc5b0.executerTransmission(<generated>) ~[spring-core-4.0.4.RELEASE.jar:na]
at com.pharmagest.dexter.ordonnanceur.JobExtraction.execute(JobExtraction.java:56) ~[dexter-ordonnanceur.jar:na]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.2.1.jar:na]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) ~[quartz-2.2.1.jar:na]
Caused by: org.apache.http.client.ClientProtocolException: null
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.3.jar:4.5.3]
at com.pharmagest.dexter.plugins.transmissions.TransmissionHTTP.envoyer(TransmissionHTTP.java:83) ~[dexter-moteur.jar:na]
at com.pharmagest.dexter.plugins.transmissions.ATransmission.envoyer(ATransmission.java:255) ~[dexter-moteur.jar:na]
... 15 common frames omitted
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.3.jar:4.5.3]
... 20 common frames omitted
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.7.0_25]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.7.0_25]
at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[na:1.7.0_25]
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377) ~[na:1.7.0_25]
at sun.security.ssl.OutputRecord.write(OutputRecord.java:363) ~[na:1.7.0_25]
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:830) ~[na:1.7.0_25]
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:801) ~[na:1.7.0_25]
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) ~[na:1.7.0_25]
at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:167) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.io.ChunkedOutputStream.flushCacheWithAppend(ChunkedOutputStream.java:122) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.io.ChunkedOutputStream.write(ChunkedOutputStream.java:179) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.entity.InputStreamEntity.writeTo(InputStreamEntity.java:134) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.execchain.RequestEntityProxy.writeTo(RequestEntityProxy.java:121) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:160) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123) ~[httpcore-4.4.6.jar:4.4.6]
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[httpclient-4.5.3.jar:4.5.3]
... 22 common frames omitted
Первая "вызванная" ошибка ссылается на:
HttpResponse r = http.execute (post);
Мы уже следовали советам с подобными ошибками (например, добавляем память).
РЕДАКТИРОВАТЬ: Как предложено @Toaster, вот моя попытка с OkHttp3:
OkHttpClient client = new OkHttpClient();
MediaType xml = MediaType.parse("application/xml");
RequestBody requestBody = RequestBodyUtil.create(xml, is);
Request request = new Request.Builder()
.url(this.serveur)
.post(requestBody)
.addHeader("Content-Type", "application/xml")
.build();
logguer(C_LOG_TRANSMISSION_SEPARATEUR);
logguer(String.format(C_LOG_TRANSMISSION_HTTP_ENVOI_FICHIER, nf));
Response response = client.newCall(request).execute(); // java.net.ProtocolException: expected 0 bytes but received 8192
if (response != null) {
if (response.isSuccessful()) {
logguer(String.format(C_LOG_TRANSMISSION_HTTP_SUCCES));
} else {
throw new IOException("Erreur lors de la transmission HTTP " + response);
}
}
public class RequestBodyUtil {
public static RequestBody create(final MediaType mediaType, final InputStream inputStream) {
return new RequestBody() {
@Override
public MediaType contentType() {
return mediaType;
}
@Override
public long contentLength() {
try {
return inputStream.available();
} catch (IOException e) {
return 0;
}
}
@Override
public void writeTo(final BufferedSink sink)
throws IOException {
Source source = null;
try {
source = Okio.source(inputStream);
sink.writeAll(source);
} finally {
Util.closeQuietly(source);
}
}
};
}
}
Попытка решить эту ошибку сейчас:
java.net.ProtocolException: ожидается 0 байт, но получено 8192