2

我想通过网络使用“GATE”。然后我决定在 GATE Embedded 的帮助下在 java 中创建一个 SOAP Web 服务。

但是对于同一个文档和保存的管道,当 GATE Embedded 作为 Java Web 服务运行时,我有不同的运行时持续时间。相同的代码在作为 Java 应用程序项目运行时具有恒定的运行时间。

在 Web 服务中,每次执行后运行时间都会增加,直到出现超时错误。

有没有人有这样的经历?

这是我的代码:

@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();
        }
    }
}

我非常感谢您能提供的任何帮助。

4

1 回答 1

2

问题是您正在为每个请求加载管道的新实例,但在请求结束时没有再次释放它。GATE 在内部维护每个加载的 PR/LR/控制器的列表,因此您加载的任何内容Factory.createResource或在不再需要时PersistenceManager.loadObjectFrom... 必须释放的任何内容,通常使用 try-finally:Factory.deleteResource

FrenchController = (CorpusController) PersistenceManager.loadObjectFromFile(FrenchGapp);
try {
  // ...
} finally {
  Factory.deleteResource(FrenchController);
}

但...

与其每次都加载管道的新实例,我强烈建议您探索一种更有效的方法来加载较少数量的管道实例,但将它们保留在内存中以服务多个请求。在 GATE wiki 的培训材料中,特别是第 8 单元(星期四第 2 轨)的培训材料中,有一个关于这种技术的完整示例。

于 2014-06-05T16:56:24.043 回答