06-27-2014 12:54 PM
Hi,
I have made a tool to bulk import files in Nuxeo through Automation.
If I allow more than one Thread to be executed, I ocasionally get this error:
java.lang.RuntimeException: Cannot execute {Authorization=Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y, Accept=application/json+nxentity, */*, Content-Type=application/json+nxrequest}
at org.nuxeo.ecm.automation.client.jaxrs.impl.HttpConnector.execute(HttpConnector.java:88)
at org.nuxeo.ecm.automation.client.jaxrs.spi.ConnectorHandler.execute(ConnectorHandler.java:30)
at org.nuxeo.ecm.automation.client.jaxrs.spi.DefaultSession.execute(DefaultSession.java:94)
at org.nuxeo.ecm.automation.client.jaxrs.spi.DefaultOperationRequest.execute(DefaultOperationRequest.java:155)
at Transfer$1.run(Transfer.java:81)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
at org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:218)
at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:192)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.nuxeo.ecm.automation.client.jaxrs.impl.HttpConnector.execute(HttpConnector.java:97)
at org.nuxeo.ecm.automation.client.jaxrs.impl.HttpConnector.execute(HttpConnector.java:84)
... 7 more
The code is like this:
private static Map<String, String> writtenFiles;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd # HH:mm:ss");
private static Session session;
public static void main(String[] args) throws Exception {
if (args.length >= 0)
prop.load(new FileInputStream(args[0]));
HttpAutomationClient client = new HttpAutomationClient(String.format("http://%s/nuxeo/site/automation", serverName()));
session = client.getSession("Administrator", "Administrator");
writtenFiles.put(fileSystemPath(), ((Document) session.newRequest(DocumentService.FetchDocument).set("value", documentPath()).execute()).getId());
createSynchronizationTask(new File(fileSystemPath()));
}
private static void createSynchronizationTask(final File file) {
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
try {
log(String.format("%s ||| Processing %s", simpleDateFormat.format(new Date()), file.getPath()));
String fileName = file.getName();
IdRef parentDocument = new IdRef(writtenFiles.get(file.getParent()));
PropertyMap props = new PropertyMap();
if (file.isDirectory()) {
if (writtenFiles.get(file.getPath()) == null) {
props.set("dc:title", fileName);
Document createdFolder = (Document) session.newRequest(DocumentService.CreateDocument).setInput(parentDocument)
.set("type", folderType()).set("name", fileName)
.set("properties", props).execute();
logExecution(file, createdFolder);
}
for (File child : filesFirst(file)) {
createSynchronizationTask(child);
}
} else {
if (writtenFiles.get(file.getPath()) == null) {
props.set("dc:title", fileName);
props.set("file:filename", file.getName());
Document document = (Document) session.newRequest(DocumentService.CreateDocument)
.setInput(parentDocument).set("type", documentType()).set("name", fileName).set("properties", props).execute();
FileBlob fb = new FileBlob(file);
try {
session.newRequest("Blob.Attach").setHeader(Constants.HEADER_NX_VOIDOP, "true").setInput(fb).set("document", document).execute();
logExecution(file, document);
} catch (Exception e) {
log(e);
}
}
}
} catch (Exception e) {
log(e);
logFileError(file, e.getMessage());
}
}
});
}
Any guidance on how I should use the Java Automation Client from multiple threads? Thank you.
Find what you came for
We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.