when work s3 on amazon, keep getting ugly connectionpooltimeoutexception.
the problem due front end of application, can not close opened s3 objects before front end done them have implemented solution :
@autowired private amazons3 s3client; // credentials set properly. private static list<s3object> openedobjects = new arraylist<s3object>(); // initialize bucket : private string bucketname = "myshinynewbucket"; private synchronized boolean initbucket(){ try{ boolean exists = null; try{ exists = s3client.doesbucketexist(bucketname); }catch(exception e1){ system.out.println("\n\n\ttoo many opened objects ; closing...\n\n"); deleteopeneds3objects(); exists = s3client.doesbucketexist(bucketname); } if(exists!=null){ if(!exists){ s3client.createbucket(new createbucketrequest(bucketname)); } return true; } } catch(exception e){ system.out.println("\n\n\tfailed initialize bucket.\n"); e.printstacktrace(); } return false; } private synchronized void deleteopeneds3objects(){ system.out.println("\n\tclosing opened objects..."); try{ for(int i=0 ; i<openedobjects.size() ; i++){ openedobjects.get(i).close(); openedobjects.remove(i); } }catch(exception e1){ system.out.println("\tcould not close opened s3 objects, first "+i); } system.out.println("\ttrying again :\n\n"); } // : public final string getfromaws(final string amazonname){ s3object s3object = null; if(initbucket()){ try{ try{ s3object = s3client.getobject(new getobjectrequest(bucketname, amazonname)); }catch(amazonclientexception e){ deleteopeneds3objects(); s3object = s3client.getobject(new getobjectrequest(bucketname, amazonname)); } openedobjects.add(s3object); return s3object.getobjectcontent().gethttprequest().geturi().tostring(); }catch(exception e1){ if (((amazons3exception)e1).getstatuscode() == httpstatus.sc_not_found){ system.out.println("\n\nno such object in bucket.\n"); } else{ system.out.println("\n\n\tcould not read bject bucket.\n\n"); e1.printstacktrace(); } } } return null; }
yet, exception still happening.
org.apache.http.conn.connectionpooltimeoutexception: timeout waiting connection pool @ org.apache.http.impl.conn.poolinghttpclientconnectionmanager.leaseconnection(poolinghttpclientconnectionmanager.java:286) ~[httpclient-4.5.1.jar!/:4.5.1] @ org.apache.http.impl.conn.poolinghttpclientconnectionmanager$1.get(poolinghttpclientconnectionmanager.java:263) ~[httpclient-4.5.1.jar!/:4.5.1] @ sun.reflect.generatedmethodaccessor144.invoke(unknown source) ~[na:na] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_91] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_91] @ com.amazonaws.http.conn.clientconnectionrequestfactory$handler.invoke(clientconnectionrequestfactory.java:70) ~[aws-java-sdk-core-1.11.8.jar!/:na] @ com.amazonaws.http.conn.$proxy188.get(unknown source) ~[na:na] ...
only when ctrl+c in console, part closing opened s3 connections :
... caused by: java.lang.interruptedexception: operation interrupted @ org.apache.http.pool.poolentryfuture.await(poolentryfuture.java:142) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.pool.abstractconnpool.getpoolentryblocking(abstractconnpool.java:306) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.pool.abstractconnpool.access$000(abstractconnpool.java:64) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.pool.abstractconnpool$2.getpoolentry(abstractconnpool.java:192) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.pool.abstractconnpool$2.getpoolentry(abstractconnpool.java:185) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.pool.poolentryfuture.get(poolentryfuture.java:107) ~[httpcore-4.4.4.jar!/:4.4.4] @ org.apache.http.impl.conn.poolinghttpclientconnectionmanager.leaseconnection(poolinghttpclientconnectionmanager.java:276) ~[httpclient-4.5.1.jar!/:4.5.1] @ org.apache.http.impl.conn.poolinghttpclientconnectionmanager$1.get(poolinghttpclientconnectionmanager.java:263) ~[httpclient-4.5.1.jar!/:4.5.1] @ sun.reflect.generatedmethodaccessor144.invoke(unknown source) ~[na:na] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_91] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_91] @ com.amazonaws.http.conn.clientconnectionrequestfactory$handler.invoke(clientconnectionrequestfactory.java:70) ~[aws-java-sdk-core-1.11.8.jar!/:na] @ com.amazonaws.http.conn.$proxy188.get(unknown source) ~[na:na] @ org.apache.http.impl.execchain.mainclientexec.execute(mainclientexec.java:190) ~[httpclient-4.5.1.jar!/:4.5.1] ... 148 common frames omitted many opened objects. // <-- catches it. closing opened objects... not close opened s3 objects. trying again : failed initialize bucket.
again, unfortunately not in position can close opened s3objects before leave functions in s3-client class. hope have had, wait until timeoutexception happens, catch it, closing opened objects , trying again. however, can't seem catch in right place.
please, help.
thank you.
i think sollution catch , process ugly timeoutexception in @controlleradvice class. have done , far have not had happen in app. i'll post confirmation once i'm sure.
Comments
Post a Comment