Недавно я пишу инструмент загрузки FTP и использую FTPClient Apache. Чтобы повысить эффективность загрузки, я принял многопоточный подход, но частое создание и разрушение объектов FTPClient каждым потоком неизбежно вызовет ненужные накладные расходы. Поэтому лучше всего использовать пул соединений FTPClient здесь. Я тщательно просмотрел API Apache и обнаружил, что у него не было реализации ftpclientpool, поэтому мне пришлось сам написать ftpclientpool. Следующее введет весь процесс разработки пула соединений для вашей ссылки.
О пуле объектов
Некоторые объекты имеют относительно высокие накладные расходы, такие как подключения к базе данных. Чтобы уменьшить потребление производительности, вызванное частым созданием и разрушением объектов, мы можем использовать технологию объединения объектов для достижения повторного использования объектов. Пул объектов предоставляет механизм, который может управлять жизненным циклом объектов в пуле объектов, предоставляет метод получения и освобождения объектов и позволяет клиентам легко использовать объекты в пуле объектов.
Если мы хотим сами внедрить пул объектов, нам обычно нужно выполнить следующие функции:
1. Если в бассейне есть объекты, пул объектов должен иметь возможность вернуться к клиенту.
2. После того, как клиент поставит объекты обратно в бассейн, он может повторно использовать их.
3. Pools объектов может создавать новые объекты для удовлетворения растущих потребностей клиентов
4. Существует механизм, чтобы правильно закрыть бассейн, чтобы закончить жизненный цикл объекта
Инструментарий пула объектов Apache
Чтобы облегчить нам разработку нашего собственного пула объектов, инструментарий Common Pool, предоставленный Apache, содержит некоторые интерфейсы и классы реализации для разработки общих пулов объектов. Два самых основных интерфейсов являются объектно -точка и бассейна.
В интерфейсе ObjectPool есть несколько основных методов:
1. AddObject (): добавьте объект в бассейн
2. Borrowobject (): клиент заимствует объект из бассейна
3. returnObject (): клиент возвращает объект в пул
4. Close (): закройте пул объектов, ресурсы чистой памяти и выпуска и т. Д.
5. SetFactory (EactionFactory Factory): завод необходима для создания объектов в пуле.
Несколько основных методов в интерфейсе PoolableObjectFactory:
1. MakeObject (): Сделайте объект
2. destoryObject (): уничтожить объект
3. vailidatobject (): убедитесь, что объект все еще доступен
Через два вышеупомянутых интерфейса мы можем самостоятельно реализовать пул объектов.
Пример: разработать пул объектов FTPClient
Недавно разрабатывается проект, который требует загрузки файлов в HDFS в группу серверов FTP. Чтобы повысить эффективность загрузки, мы, естественно, рассмотрим использование многопоточных методов для загрузки. Инструмент, который я загружал FTP, является FTPClient в пакете Apache Common-Net, но Apache не предоставляет ftpclientpool. Таким образом, чтобы уменьшить количество раз, когда FTPClient создается и разрушается, мы разработали сами для повторного использования соединения FTPClient.
Благодаря вышеуказанному введению мы можем использовать пакет Common Pool, предоставленный Apache, чтобы помочь нам в разработке пулов соединений. Чтобы разработать простой пул объектов, вам нужно только реализовать интерфейсы ObjectPool и PoolableObjectFactory в пакете Common Pool. Давайте посмотрим на реализацию, которую я написал:
Напишите реализацию интерфейса ObjectPool FtpClientPool
Импорт java.io.ioexception; import java.util.noschelementexception; import java.util.concurrent.arrayblockingqueue; import java.util.concurrent.blockqueue; импорт java.util.concurrent.timeUnit; импорт org.apache.commons.net.ftp.ftpclient; org.apache.commons.pool.objectpool; import org.apache.commons.pool.poolableObjectFactory;/*** Реализовать пул соединений ftpClient*@author Heaven*/public class ftpclientpool реализует ObjectPool <ftpClient> {Private Static final int deful_size = 10; Частный финальный блокировка <ftpclient> Пул; частная финальная фабрика FTPClientFactory; / ** * Инициализация пула соединений, необходимо ввести завод, чтобы предоставить экземпляр ftpClient * @param factory * @throhs excection */ public ftpclientpool (ftpclientfactory factory) выбрасывает исключение {this (default_pool_size, factory); } / ** * * * @param maxpoolsize * @param factory * @throhs excection * / public ftpclientpool (int poolsize, ftpclientfactory factory) Throws Exception {this.factory = factory; Pool = new ArrayBlockingQueue <ftpClient> (PoolSize*2); initpool (poolsize); } /** * Инициализация пула соединений должна быть введена на завод для предоставления экземпляра ftpClient * @param maxpoolsize * @throws exception * /private void initpool (int maxpoolsize) throws Exception {for (int i = 0; i <maxpoolsize; i ++) {// add add addObject ();); }} / * (non-javadoc) * @see org.apache.commons.pool.objectpool#borrowobject () * / public ftpclient borrowobject () выбрасывает исключение, noshelementException, roldelstateException {ftpClient client = pool.take (); if (client == null) {client = factory.makeObject (); addObject (); } else if (! factory.validateObject (client)) {// Убедитесь, что не проходить // делать объект InvalidateObject (client); // Сделать и добавить новые объекты в Pool Client = factory.makeObject (); addObject (); } вернуть клиент; } / * (non-javadoc) * @see org.apache.commons.pool.objectpool#returnobject (java.lang.object) * / public void returnobject (ftpclient client) throws exection {if ((client! = null) &&! } catch (ioException e) {e.printstackTrace (); }}} public void InvalidateObject (клиент ftpClient) бросает исключение {// Удалить Invalidate Client Pool.remove (client); } / * (non-javadoc) * @see org.apache.commons.pool.objectpool#addobject () * /public void addobject () бросает исключение, нелегального пула, UnsupportedOperationException {// Вставка объекта в Queue Pool. } public int getNumIdle () бросает UnsupPortedOperationException {return 0; } public int getNumActive () бросает UnsupPortedOperationException {return 0; } public void clear () выбрасывает исключение, UnsupportEdoPerationException {} / * (не-Javadoc) * @see org.apache.commons.pool.objectpool#close () * / public void close () бросает исключение {while (pool.iterator (). Hasnext () {ftpclient client = pool.take (); factory.destroyObject (клиент); }} public void setFactory (PoolableObjectFactory <ftpClient> фабрика) бросает allosalstateException, unsupportedOperationException {}}Напишите еще одну реализацию интерфейса BoolableObjectAceFactory ftpClientFactory
Импорт java.io.ioexception; import org.apache.commons.net.ftp.ftpclient; import org.apache.commons.net.ftp.ftpReply; import org.apache.commons.pool.poolableobjectfactory; import.slf4j.logger; import org.slf4j.loggerfactory; import.slf4j.logger; import org.slf4j.loggerfactory; import.slf4j.logger; import org.slf4j.loggerfactory; com.hdfstoftp.util.ftpclientException;/*** FTPClient Factory Class, обеспечивает создание и разрушение экземпляров FTPClient через фабрику ftpClient*@author Heaven*/public class ftpClientFactory Implaments BoolableObjectfactory <ftpClient> {private static logger = LoggerFactory.get get get get get get get get getogfactory. Private ftpClientConfigure config; // Приостановите объект параметра на завод для облегчения конфигурации соответствующих параметров ftpClient public ftpClientFactory (ftpClientConfigure config) {this.config = config; } / * (non-javadoc) * @see org.apache.commons.pool.poolableobjectfactory#makeobject () * / public ftpclient makeObject () throws exception {ftpclient ftpclient = new ftpclient (); ftpclient.setConnecttimeout (config.getClienttimeout ()); try {ftpclient.connect (config.gethost (), config.getport ()); int response = ftpclient.getReplyCode (); if (! ftpreply.ispositivecoplusion (reply)) {ftpclient.disconnect (); logger.warn ("ftpserver отказался от подключения"); вернуть ноль; } boolean result = ftpclient.login (config.getusername (), config.getpassword ()); if (! result) {бросить новое ftpclientException ("FtpClient login не удалось! Имя пользователя:" + config.getUsername () + "; пароль:" + config.getPassword ()); } ftpclient.setFileType (config.getTransferfileType ()); ftpclient.setBuffersize (1024); ftpclient.setControLencoding (config.getEncoding ()); if (config.getPassiveMode (). equals ("true")) {ftpClient.EnterlocalPassiveMode (); }} catch (ioException e) {e.printstacktrace (); } catch (ftpClientException e) {e.printStackTrace (); } return ftpclient; } / * (non-javadoc) * @see org.apache.commons.pool.poolableobjectfactory#destropobject (java.lang.object) * / public void destroyobject (ftpclient ftpclient), бросает исключение {try {if (ftpclient! = null && ftpclient.isconced () {if (ftpclient! }} catch (ioException io) {io.printstacktrace (); } Наконец {// Обратите внимание, что вы должны отключить соединение в коде, иначе, это приведет к тому, что FTP -соединение будет занято try {ftpclient.disconnect (); } catch (ioException io) {io.printstacktrace (); }}} / * (non-javadoc) * @see org.apache.commons.pool.poolableobjectfactory#validatobject (java.lang.object) * / public boolean validobject (ftpclient ftpclient) {try {return ftpclient.sendnoop (); } catch (ioException e) {бросить новое runtimeexception («Не удалось подтвердить клиент:» + e, e); /Наконец, лучше всего передать объект параметра на завод, чтобы облегчить нам установить некоторые параметры ftpclient
пакет org.apache.commons.pool.impl.contrib;/** * ftpClient Configuration Class, инкапсулирует соответствующую конфигурацию ftpClient * * @author Heaven */public class ftpclientConfigure {Private String Host; частный порт int; частное имя пользователя; Private String Password; частная строка passivemode; Приватная строковая кодирование; private int clienttimeout; private int threadum; частный int TransferFileType; Частный логический переизведите; частный int retrytimes; public String gethost () {return host; } public void sethost (string host) {this. host = host; } public int getPort () {return Port; } public void setport (int port) {this. порт = порт; } public String getUsername () {return username; } public void setusername (String username) {this. Имя пользователя = имя пользователя; } public String getPassword () {return пароль; } public void setPassword (String пароль) {this. пароль = пароль; } public String getPassiVemode () {return passiveMode; } public void setPassiVemode (String passiveMode) {this. passivemode = passivemode; } public String getEncoding () {return Encoding; } public void setencoding (string encoding) {this. кодирование = кодирование; } public int getClientTimeout () {return ClientTimeout; } public void setClientTimeout (int clientTimeout) {this. clientTimeout = clientTimeout; } public int getThreadnum () {return threadnum; } public void setThreadnum (int threadnum) {this. threadnum = threadnum; } public int getTransferfileType () {return TransferFileType; } public void setTransferfileType (int transperfileType) {this. TransferFileType = TransferFileType; } public boolean isrenameUploaded () {return renameuploaded; } public void setRenameUploaded (boolean renameuploaded) {this. renameuploaded = renameuploaded; } public int getRetryTimes () {return retryTimes; } public void setretrytimes (int retrytimes) {this. повторение = повторение; } @Override public String toString() { return "FTPClientConfig [host=" + host + "/n port=" + port + "/n username=" + username + "/n password=" + password + "/n passiveMode=" + passiveMode + "/n encoding=" + encoding + "/n clientTimeout=" + clientTimeout + "/n threadNum=" + threadNum + "/n TransferFileType =" + TransferFileType + "/n renameUploaded =" + renameuploaded + "/n retrytimes =" + retrytimes + "]"; }}Класс пула соединений ftpclientpool управляет жизненным циклом объекта ftpclient и отвечает за кредитование, планирование и уничтожение пула. Класс ftpclientpool зависит от класса ftpclientFactory, который используется для создания и уничтожения объектов с помощью этого инженерного класса; FTPClientFactory также опирается на класс FTPClientConfigure, который отвечает за инкапсуляцию параметров конфигурации FTPClient. На этом этапе был разработан наш пул соединений FTPClient.
Следует отметить, что в ftpclientpool используется Arrayblockqueueue для управления и хранения объектов FTPClient. Для блокировки очередей, пожалуйста, обратитесь к моей статье: [java complornuence] BlockingQueue
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.