Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с Apache HttpClient4 при использовании многопоточности. / 4 сообщений из 4, страница 1 из 1
02.05.2012, 02:23:17
    #37778511
SiberianGorilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Apache HttpClient4 при использовании многопоточности.
Здравствуйте.

Пытаюсь написать аплоадер файлов, который будет производить загрузку файла на сервер в отдельном потоке, чтобы не блокировать все приложение, так как файлы ожидаются очень большими.

Проблема в том, что при реализации, внутри переопределенного метода run, происходит следующая ситуация:
Поток всегда переходит в состояние terminated и случается это как раз на вызовах методов классов Http клиента (для контроля даже просто расставлял вызовы вывода в консоль). Не могу понять в чем здесь может быть проблема. Возможно, кто-то с таким сталкивался. Что-то я делаю неправильно, но никак не поймы что. Пробовал выносить всю инициализацию данных в основной поток и внутри оставлял только вызов client.execute() - не помогло. Трэд умирает.

HttpClent создаю так:

Код: java
1.
2.
3.
4.
5.
6.
7.
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

        ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(schemeRegistry);

        this.client = new DefaultHttpClient(connectionManager);



обычное - new DefaultHttpClient() тоже ничего не дает.

Вот исходный код:

FilePutThread наследуется от FileTransferThread, который в свою очередь наследуется от Thread.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
package client.Impl;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.InputStreamEntity;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FilePutThread extends FileTransferThread  {

    private HttpPut put;

    private ListenableInputStreamEntity entity;

    public RitconFilePutThread(final HttpClient client, final String fullURL, final File file, final long offset) {
        super(offset, client, file, fullURL);
    }

    @Override
    public void run() {

        this.put = new HttpPut(this.fullURL);

        try {

            putFile();

        } catch (Exception e) {

            //Обработки ошибок пока нет
        }
    }

    @Override
    public void interrupt() {

        if (!super.isInterrupted()) {

            super.interrupt();

            if ((this.put != null) && (!this.put.isAborted())) {

                this.put.abort();

                this.offset = entity.getOffset();
            }
        }
    }


    private void putFile() throws Exception {

        final long localSize = super.fileToTransfer.length();

        entity = getInputStreamEntityToPut(localSize);

        this.put.setEntity(entity);

        this.put.setHeader(CONTENT_RANGE, new ContentRange(offset, localSize).toString());

        this.response = client.execute(put);
    }


    private ListenableInputStreamEntity getInputStreamEntityToPut(final long localSize)

            throws IOException {

        final InputStream inputStream = new FileInputStream(super.fileToTransfer);

        return new ListenableInputStreamEntity(inputStream, super.listener,
                localSize, super.offset);
    }
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public abstract class FileTransferThread extends Thread {

    protected static final String CONTENT_RANGE = "Content-Range";

    protected HttpClient client;

    protected final File fileToTransfer;

    protected final String fullURL;

    protected HttpResponse response;

    protected TransferProgressListener listener;

    protected long offset;

    public FileTransferThread(final long offset, final HttpClient client,
                                    final File fileToTransfer, final String fullURL) {

        super();

        this.offset = offset;

        this.client = client;

        this.fileToTransfer = fileToTransfer;

        this.fullURL = fullURL;

        this.listener = null;
    }

    public void setListener(final TransferProgressListener listener) {

        this.listener = listener;
    }

    @Override
    public void run() {};


    protected void callUpdateProgress(final long transferred, final long total) {

        if (this.listener != null) {

            final double percentage = ((double)transferred / (double)total) * 100;

            this.listener.progress(percentage);
        }
    }
}




ListenableInputStreamEntity - Самописная сущность, которая поддерживает слушателя прогресса + может возвращать количество пересланных байт(Большая часть украдена из реализации Apache, рефакторинг даже пока руки не дошли сделать :) ):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
public class ListenableInputStreamEntity extends AbstractHttpEntity {

    private final static int BUFFER_SIZE = 2048;

    private final InputStream content;

    private long length;

    private final TransferProgressListener listener;

    private long transferred = 0L;

    private long offset;


    public ListenableInputStreamEntity(final InputStream instream,
                                       final TransferProgressListener listener,
                                       final long length,
                                       final long offset) {
        super();

        if (instream == null) {
            throw new IllegalArgumentException("Source input stream may not be null");
        }

        this.content = instream;

        this.offset = offset;

        this.length = length;

        this.listener = listener;

        this.offset = offset;
    }


    public boolean isRepeatable() {
        return false;
    }


    public long getContentLength() {
        return this.length;
    }


    public InputStream getContent() throws IOException {
        return this.content;
    }


    public void writeTo(final OutputStream outstream) throws IOException {

        if (outstream == null) {
            throw new IllegalArgumentException("Output stream may not be null");
        }

        final InputStream instream = this.content;

        if (offset > 0L){

            offset = instream.skip(offset);

        } else {

            offset = 0L;
        }

        this.length -= offset;

        try {

            byte[] buffer = new byte[BUFFER_SIZE];

            int l;

            if (this.length < 0) {

                this.transferred = 0L;

                while ((l = instream.read(buffer)) != -1) {

                    outstream.write(buffer, 0, l);

                    this.transferred += l;

                    callUpdateProgress(this.offset + this.transferred, this.length);
                }

            } else {

                long remaining = this.length;

                while (remaining > 0) {

                    l = instream.read(buffer, 0, (int)Math.min(BUFFER_SIZE, remaining));

                    if (l == -1) {
                        break;
                    }

                    outstream.write(buffer, 0, l);

                    remaining -= l;

                    this.transferred += l;

                    callUpdateProgress(this.offset + this.transferred, this.length);
                }
            }

        } finally {

            instream.close();
        }
    }

    protected void callUpdateProgress(final long transferred, final long total) {

        if (this.listener != null) {

            final double percentage = ((double)transferred / (double)total) * 100;

            this.listener.progress(percentage);
        }
    }


    public boolean isStreaming() {
        return true;
    }

    public long getOffset() {

        return this.offset;
    }
}
...
Рейтинг: 0 / 0
02.05.2012, 02:54:41
    #37778518
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Apache HttpClient4 при использовании многопоточности.
SiberianGorilla,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
        try {

            putFile();

        } catch (Exception e) {

            //Обработки ошибок пока нет
        }

...



Попробуйте вывести stackTrace в лог, возможно, где- то выбрасывается исключение, которое поможет разобраться в причинах.
...
Рейтинг: 0 / 0
02.05.2012, 10:55:25
    #37778706
SiberianGorilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Apache HttpClient4 при использовании многопоточности.
Нет, я пробовал все под catch ставить - не помогает, ничего нет.
Я здесь привел изначальный вариант, когда я только начал дебажить.
Ошибок никаких. Поток просто умирает и всё.
...
Рейтинг: 0 / 0
02.05.2012, 13:56:59
    #37778994
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Apache HttpClient4 при использовании многопоточности.
SiberianGorilla,

Попробуйте добавить обработку неперехваченных исключений.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с Apache HttpClient4 при использовании многопоточности. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]