Last active
December 9, 2015 06:35
-
-
Save linusfoldemo/1a3c7bc1d6ee46433245 to your computer and use it in GitHub Desktop.
Pooled SAXParser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
withPooledSAXParser { SAXParser saxParser -> | |
def slurped = new XmlSlurper(saxParser).parseText(documentString); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package xmlparserpool | |
import org.apache.commons.pool.PoolableObjectFactory | |
import org.apache.commons.pool.impl.GenericObjectPool | |
import javax.xml.parsers.SAXParser | |
import javax.xml.parsers.SAXParserFactory | |
class XmlParserPool { | |
private final GenericObjectPool pool; | |
static XmlParserPool INSTANCE = new XmlParserPool(10); | |
private XmlParserPool(int maxActive) { | |
pool = new GenericObjectPool(new XmlParserPoolableObjectFactory(), maxActive, | |
GenericObjectPool.WHEN_EXHAUSTED_GROW, 0); | |
} | |
public SAXParser borrowObject() throws Exception { | |
return pool.borrowObject() as SAXParser; | |
} | |
public void returnObject(SAXParser obj) throws Exception { | |
pool.returnObject(obj); | |
} | |
static def withPooledSAXParser(Closure closure) { | |
SAXParser parser = INSTANCE.borrowObject() | |
try { | |
return closure.call(parser) | |
} finally { | |
if (null != parser) { | |
INSTANCE.returnObject(parser) | |
} | |
} | |
} | |
public static class XmlParserPoolableObjectFactory implements PoolableObjectFactory { | |
private SAXParserFactory parserFactory; | |
public XmlParserPoolableObjectFactory() { | |
parserFactory = SAXParserFactory.newInstance(); | |
} | |
public Object makeObject() throws Exception { | |
return parserFactory.newSAXParser(); | |
} | |
@Override | |
void destroyObject(final Object obj) throws Exception { | |
//noop | |
} | |
public boolean validateObject(Object obj) { | |
return true; | |
} | |
@Override | |
void activateObject(final Object obj) throws Exception { | |
//noop | |
} | |
@Override | |
void passivateObject(final Object obj) throws Exception { | |
//noop | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment