Многопоточная передача файлов на FTP-сервер - PullRequest
4 голосов
/ 17 декабря 2008

Я пишу клиент для резервного сервера. Мой клиент планирует несколько папок для резервного копирования. (например, каждую пятницу в час X). Я использую для планирования cron4j (порт Linux cron для Java).

Все работает хорошо, пока я не запланирую одновременно несколько заданий на загрузку, тогда из-за нескольких потоков это становится грязным.

Может кто-нибудь помочь мне с решением для многопоточной загрузки на FTP-сервер? (у каждого потока есть задание загрузить каталог на FTP-сервер).

Ответы [ 2 ]

1 голос
/ 17 декабря 2008

Можете ли вы объяснить, что вы имеете в виду, когда говорите, что это немного "грязно"? Какие-то конкретные симптомы?

В любом случае, глядя на это с чистого листа, я бы сказал, что вы хотите уменьшить количество одновременных загрузок, которые вы выполняете за один раз, иначе вы, вероятно, достигнете какого-то ограничения с точки зрения количества соединений, которые вы выполняете. FTP-сервер разрешит один клиент, или количество подключений, которое разрешит операционная система клиента. Скорее всего, ваше приложение будет ограничено пропускной способностью, а не процессором, поэтому слишком большое количество потоков может привести к обратным результатам. По сути, вы будете загружать больше элементов одновременно, но с меньшей пропускной способностью.

Полагаю, у вашего приложения есть набор задач, которые отключаются cron4j, затем эти задачи берут каталог и загружают его через FTP, это звучит правильно?

Если это так, я бы предложил разделить это на пару этапов, сначала cron4j запускает задачи, которые создают работоспособный объект, который при выполнении будет выполнять загрузку по FTP вместо задачи, выполняющей саму загрузку. Поместите этот runnable в очередь (блокирующая очередь из java.util.concurrent была бы хорошей идеей). Затем у вас будет несколько экземпляров другой задачи, выполняющейся в пуле потоков, и эти задачи будут выводить задания из очереди и выполнять их (поэкспериментируйте с количеством потоков в пуле, чтобы увидеть, что дает вам хорошую пропускную способность). Это даст вам набор конкурирующих потребителей, которых вы можете ограничить эффективным количеством одновременных загрузок (например, 4 за раз).


Как отмечается в комментариях, паттерн SEDA звучит довольно интересно. Если вы собираетесь заниматься параллельным программированием на Java, я бы порекомендовал получить копию «Параллельного программирования на Java: принципы и шаблоны проектирования» Дуга Ли, он не включает в себя Java 5, но большая часть этого основана на том, что в книге все равно. Он четко объясняет множество вопросов о безопасности потоков и о том, как писать хороший Java-код.

0 голосов
/ 10 сентября 2010

Класс FTP ipworks является поточно-ориентированным. И вы должны прочитать параллелизм Java на практике Брайана Гетца ...

public class ServerConnection extends Thread  {

// the connection to the ftp server
private final Ftp connection;

или вы можете реализовать Runnable и использовать executorService , если вам не нравится управлять потоком самостоятельно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...