Отправить файлы с 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

0 ответов

Другие вопросы по тегам