我想使用" GATE"通过网络。然后我决定在GATE Embedded的帮助下在java中创建一个SOAP Web服务。
但是对于相同的文档和保存的Pipeline,当GATE Embedded作为java Web服务运行时,我有不同的运行时间。 当它作为Java应用程序项目运行时,相同的代码具有恒定的运行时。
在Web服务中,每次执行后运行时间都会增加,直到我收到Timeout错误。
有没有人有这种经历?
这是我的代码:
@WebService(serviceName = "GateWS")
public class GateWS {
@WebMethod(operationName = "gateengineapi")
public String gateengineapi(@WebParam(name = "PipelineNumber") String PipelineNumber, @WebParam(name = "Documents") String Docs) throws Exception {
try {
System.setProperty("gate.home", "C:\\GATE\\");
System.setProperty("shell.path", "C:\\cygwin2\\bin\\sh.exe");
Gate.init();
File GateHome = Gate.getGateHome();
File FrenchGapp = new File(GateHome, PipelineNumber);
CorpusController FrenchController;
FrenchController = (CorpusController) PersistenceManager.loadObjectFromFile(FrenchGapp);
Corpus corpus = Factory.newCorpus("BatchProcessApp Corpus");
FrenchController.setCorpus(corpus);
File docFile = new File(GateHome, Docs);
Document doc = Factory.newDocument(docFile.toURL(), "utf-8");
corpus.add(doc);
FrenchController.execute();
String docXMLString = null;
docXMLString = doc.toXml();
String outputFileName = doc.getName() + ".out.xml";
File outputFile = new File(docFile.getParentFile(), outputFileName);
FileOutputStream fos = new FileOutputStream(outputFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
OutputStreamWriter out;
out = new OutputStreamWriter(bos, "utf-8");
out.write(docXMLString);
out.close();
gate.Factory.deleteResource(doc);
return outputFileName;
} catch (Exception ex) {
return "ERROR: -> " + ex.getMessage();
}
}
}
我非常感谢您提供的任何帮助。
答案 0 :(得分:2)
问题是您为每个请求加载了一个新的管道实例,但在请求结束时不再释放它。 GATE在内部维护一个加载的每个PR / LR /控制器的列表,因此,Factory.createResource
或PersistenceManager.loadObjectFrom...
加载的任何内容必须1>才能使用Factory.deleteResource
释放不再需要,通常使用try-finally:
FrenchController = (CorpusController) PersistenceManager.loadObjectFromFile(FrenchGapp);
try {
// ...
} finally {
Factory.deleteResource(FrenchController);
}
但是...
我不是每次都加载一个新的管道实例,而是强烈建议您探索一种更有效的方法来加载较少数量的管道实例,但将它们保存在内存中以满足多个请求。 training materials on the GATE wiki中有一个完全可行的技术示例,特别是模块编号8(周四的第2轨道)。