Vor kurzem schreibe ich ein FTP -Upload -Tool und verwende Apache FTPCLIENT. Um die Upload-Effizienz zu verbessern, habe ich einen Multi-Thread-Ansatz angewendet, aber häufige Erschaffung und Zerstörung von FTPClient-Objekten durch jeden Thread verursacht zwangsläufig unnötige Overheads. Daher ist es am besten, hier einen FTPCLient -Verbindungspool zu verwenden. Ich schaute sorgfältig durch die Apache -API und stellte fest, dass sie keine Implementierung von FTPClientpool gab, daher musste ich selbst einen FTPClientPool schreiben. Im Folgenden wird der gesamte Prozess der Entwicklung eines Verbindungspools für Ihre Referenz vorgestellt.
Über Objektpool
Einige Objekte haben einen relativ hohen Overhead, wie z. B. Datenbankverbindungen. Um den Leistungsverbrauch zu verringern, der durch häufige Schöpfung und Zerstörung von Objekten verursacht wird, können wir die Technologie des Objektbades verwenden, um die Wiederverwendung von Objekten zu erreichen. Der Objektpool bietet einen Mechanismus, der den Lebenszyklus von Objekten im Objektpool verwalten kann, eine Methode zur Erlangung und Freigabe von Objekten bietet und Clients ermöglicht, Objekte einfach im Objektpool zu verwenden.
Wenn wir selbst einen Objektpool implementieren möchten, müssen wir im Allgemeinen die folgenden Funktionen erfüllen:
1. Wenn im Pool Objekte verfügbar sind, sollte der Objektpool in der Lage sein, zum Client zurückzukehren.
2. Nachdem der Kunde die Objekte wieder in den Pool gebracht hat, können sie sie wiederverwenden.
3. Objektpools können neue Objekte erstellen, um den wachsenden Bedürfnissen der Kunden gerecht zu werden
4.. Es gibt einen Mechanismus, um den Pool richtig zu schließen, um den Lebenszyklus des Objekts zu beenden
Das Objektpool -Toolkit von Apache
Um uns zu erleichtern, unseren eigenen Objektpool zu entwickeln, enthält das von Apache bereitgestellte Common-Pool-Toolkit einige Schnittstellen und Implementierungsklassen für die Entwicklung gemeinsamer Objektpools. Die beiden grundlegendsten Schnittstellen sind Objektpool und PoolableObjectFactory.
In der ObjectPool -Schnittstelle gibt es mehrere grundlegende Methoden:
1. AddObject (): Objekt zum Pool hinzufügen
2. borlowObject (): Der Client leiht sich ein Objekt aus dem Pool aus
3.. ReturnObject (): Der Client gibt ein Objekt in den Pool zurück
4. Close (): Schließen Sie den Objektpool, den sauberen Speicher und die Ressourcen für Release usw.
5. SetFactory (ObjectFactory Factory): Eine Fabrik ist erforderlich, um Objekte im Pool zu erstellen.
Mehrere grundlegende Methoden in der PoolableObjectFactory -Schnittstelle:
1. MakeObject (): Machen Sie ein Objekt
2. DestoryObject (): Zerstöre ein Objekt
3.. ValateObject (): Überprüfen Sie, ob ein Objekt noch verfügbar ist
Über die beiden oben genannten Schnittstellen können wir einen Objektpool selbst implementieren.
Beispiel: Entwickeln Sie einen FTPClient -Objektpool
Kürzlich wird ein Projekt entwickelt, bei dem Dateien in HDFs auf eine Gruppe von FTP -Servern hochgeladen werden müssen. Um die Upload-Effizienz zu verbessern, erwägen wir natürlich Multi-Thread-Methoden zum Hochladen. Das Tool, das ich mit FTP hochgeladen habe, ist das FTPClient im Apache Common-Net-Paket, Apache liefert jedoch kein FTPClientPool. Um die Häufigkeit des FTPClient zu verringern und zu zerstören, haben wir uns selbst eine FTPClientpool entwickelt, um die FTPCLient -Verbindung wiederzuverwenden.
Durch die obige Einführung können wir das von Apache bereitgestellte Common-Pool-Paket verwenden, um uns bei der Entwicklung von Verbindungspools zu unterstützen. Um einen einfachen Objektpool zu entwickeln, müssen Sie nur die Objektpool- und PoolableObjectFactory-Schnittstellen im Common-Pool-Paket implementieren. Schauen wir uns die Implementierung an, die ich geschrieben habe:
Schreiben Sie eine Objektpool -Schnittstelle Implementierung ftpclientpool
Import Java.io.ioException; Import Java.util.NoSuchelementException; Import Java.util.Concurrent org.apache.commons.pool.objectpool; import org.apache.commons.pool.poolableObjectfactory;/*** Implementieren Sie einen FTPClient -Verbindungspool*@Author Heaven*/Public Class ftpclientPool implementiert ObjectPool <ftpclient> Private Final Blockingqueue <Ftpclient> Pool; private endgültige ftpclientFactory Factory; / ** * Initialisierung des Verbindungspools muss eine Fabrik injiziert werden, um die ftpclient -Instanz bereitzustellen. } / ** * * @param maxpoolSize * @param factory * @throws Exception * / public ftpclientpool (int poolSize, ftpclientFactory factory) löst eine Ausnahme aus {this.factory = factory; pool = new ArrayBlockingQueue <Ftpclient> (poolsize*2); Initpool (Poolsize); } /** * Initialisierung des Verbindungspools muss ein Werk injiziert werden, um die ftpclient -Instanz bereitzustellen * @param maxpoolSize * @Throws Ausnahme * /private void initpool (int maxpoolSize) löst Ausnahme aus {für (int i = 0; i <maxpoolSize; }} / * (nicht-javadoc) * @see org.apache.commons.pool.objectpool#borlowObject () * / public ftpclient bredObject () löst Ausnahme aus, NoSuchelementException, IllegalStateException {ftpclient client = pool.take (); if (client == null) {client = factory.MakeObject (); AddObject (); } else if (! factory.validateObject (client)) {// Überprüfen Sie, ob Sie das Objekt nicht übergeben können. // neue Objekte zum Pool Client = factory.MakeObject () machen und hinzufügen; AddObject (); } return client; } / * (nicht-javadoc) * @see org.apache.commons.pool.objectpool#returnObject (java.lang.object) * / public void returnObject (ftpclient client) löst Ausnahme aus {if (Client! } catch (ioException e) {e.printstacktrace (); }}} public void InvalidateObject (ftpclient client) löst eine Ausnahme aus {// ungültiges Client pool entfernen.Remove (Client); } / * (Nicht-Javadoc) * @see org.apache.commons.pool.objectpool#AddObject () * /public void addObject () wirft eine Ausnahme aus, illegalStateException, nicht unterstützte Operationsexception {// das Objekt in die Queue-Pool. } public int getNumIdle () wirft nicht unterstützte OperationException {return 0; } public int getNumActive () löst nicht unterstützte OperationException {return 0; } public void clear () löst eine Ausnahme aus, nicht unterstützte OperationException {} / * (nicht-javadoc) * @see org.apache.commons.pool.objectpool#close () * / public void close () löst Ausnahme aus {while (pool.iterator (). factory.DestroyObject (Client); }} public void setfactory (poolableObjectFactory <ftpclient> fabrik) löst illegalStateException, nicht unterstützte Operationsexception {}} ausSchreiben Sie eine andere PoolableObjectFactory -Schnittstelle Implementierung ftpclientFactory
importieren java.io.ioxception; import org.apache.commons.net.ftp.ftpclient; import org.apache.commons.net.ftp.ftpreply; com.hdfstoftp.util.ftpclientException;/*** ftpclient factory class, liefert die Erstellung und Zerstörung von FTPClient -Instanzen durch die ftpclient fabrik private ftpclientConfigure config; // Pause ein Parameterobjekt in die Fabrik, um die Konfiguration der relevanten Parameter von FTPClient zu erleichtern. } / * (nicht javadoc) * @see org.apache.commons.pool.poolableObjectfactory#meeobject () * / public ftpclient makeObject () löst Ausnahme aus {ftpclient ftpclient = new ftpclient (); ftpclient.setConnectTimeout (config.getClienttimeout ()); try {ftpclient.connect (config.gethost (), config.getPort ()); int Reply = ftpclient.getReplyCode (); if (! ftpreply.ispositiveCompletion (Antwort)) {ftpclient.disconnect (); logger.warn ("ftpServer verweigert die Verbindung"); null zurückkehren; } boolean result = ftpclient.login (config.getUnername (), config.getPassword ()); if (! result) {neue ftpclientException ("ftpclient login failed! } ftpclient.setFiletype (config.GettransferFiletype ()); ftpclient.setBufferSize (1024); ftpclient.setControlencoding (config.GeteCoding ()); if (config.getPassIvemode (). Equals ("true")) {ftpclient.enterLocalPassivemode (); }} catch (ioException e) {e.printstacktrace (); } catch (ftpclientException e) {e.printstacktrace (); } return ftpclient; } / * (nicht-javadoc) * @see org.apache.commons.pool.poolableObjectFactory#DestroyObject (java.lang.Object) * / public void DestroyObject (ftpclient ftpclient) macht Ausnahme {try {if (ftpclient! ftpclient.logout (); }} catch (ioException io) {io.printstacktrace (); } endlich {// Beachten Sie, dass Sie die Verbindung im endgültigen Code trennen müssen, andernfalls wird die FTP -Verbindung besetzt werden. } catch (ioException io) {io.printstacktrace (); }}} / * (nicht-javadoc) * @see org.apache.commons.pool.poolableObjectFactory#valateObject (java.lang.Object) * / public boolateObject (ftpclient ftpclient) {trink {trink ftpclient.sendnoop (); } catch (ioException e) {neue runTimeException werfen ("Client nicht validieren:" + e, e); }} public void ACTICTateObject (ftpclient ftpclient) löst eine Ausnahme aus {} public void PassivateObject (ftpclient ftpclient) aus der Ausnahme {}}Schließlich ist es am besten, ein Parameterobjekt an die Fabrik weiterzugeben, um uns zu erleichtern, einige Parameter von FTPClient festzulegen
paket org.apache.commons.pool.impl.contrib;/** * FTPCLIENT -Konfigurationsklasse, verkaps die relevante Konfiguration von ftpclient * * @author hevel */public class ftpclientConfigure {private String -Host; privater Int -Port; privater String -Benutzername; privates Zeichenfolgenkennwort; private String -Passivemode; private String -Codierung; private int ClientTimeout; privates Int -Threadnum; private Int Transferfiletyp; privat boolean umbenannt; private int returnytimes; public String gethost () {return host; } public void Sethost (String -Host) {this. Host = Host; } public int getPort () {return port; } public void setport (int port) {this. port = port; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this. Benutzername = Benutzername; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this. Passwort = Passwort; } public String getSpassivemode () {passivemode return; } public void setPassiveMode (String Passivemode) {this. Passivemode = Passivemode; } public String getCoding () {return codieren; } public void setEneCoding (String -Codierung) {this. codieren = codieren; } 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 TransferFiletype) {this. TransferFileType = TransferFiletype; } public boolean isrenamEeuploaded () {return Nameuploaded; } public void setReAnaEUploaded (boolean numamEeuploaded) {this. numaMeUploaded = NumamEeuploaded; } public int getRetrytimes () {Return Returnimes; } public void setRetrytimes (int reterrytimes) {this. Wiederholungen = Wiederholungen; } @Override public String toString () {return "ftpclientConfig [host =" + host + "/n port =" + port + "/n userername =" + userername + "/n password =" + password + "/n passivemode "/n TransferFiletype =" + TransferFiletype + "/n numamEeuploaded =" + umbenameuploaded + "/n retyrytimes =" + returnytimes + "]"; }}Die FTPClientPool Connection Pool -Klasse verwaltet den Lebenszyklus des FTPClient -Objekts und ist für die Kreditvergabe, Planung und Poolzerstörung verantwortlich. Die FTPClientPool -Klasse hängt von der FTPClientFactory -Klasse ab, mit der Objekte durch diese technische Klasse erstellt und zerstört werden. Der FTPClientFactory stützt sich auch auf der FTPClientConfigure -Klasse, die für die Einkapselung der Konfigurationsparameter des FTPClient verantwortlich ist. Zu diesem Zeitpunkt wurde unser FTPClient -Verbindungspool entwickelt.
Es ist zu beachten, dass in FTPClientPool ein ArrayBlocking -Verfahren verwendet wird, um FTPClient -Objekte zu verwalten und zu speichern. Informationen zum Blockieren von Warteschlangen finden Sie in meinem Artikel: [Java -Parallelität] Blockingqueue
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.