0

我需要一些关于开发 Caché 的 Objectscript 的帮助。

我已经在这项技术中工作了几个月,从几天开始,我试图让 Java 网关工作但没有成功。它应该允许我运行 java .class et .jar 代码。
但即使它在文档中进行了解释,也没有完整的示例,而且我一遍又一遍地遇到错误。所以,我想知道是否有人可以提供一个完整的例子,纠正我或解释我做错了什么?

这是我现在所拥有的:

我的简单 java 类 - 在文件中写入日期和时间

package packagename.packagename2;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;

public class entertest {

    public int enter() throws IOException
    {
         File file = new File("D:\\path\\filemane.txt");

         if (!file.exists()) {
              file.createNewFile();
         }

         BufferedWriter bf = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
         bf.write(LocalDateTime.now().toString());
         bf.close();

         return 1;
     }

}

我的 objectscript 代码 - 定义我的网关并尝试调用该方法

Class domain.java.TestJava Extends EnsLib.HL7.Service.TCPService
{

    Method OnProcessInput(pLine As Ens.StringContainer, Output pLineLeftOver As Ens.StringContainer) As %Status
    {
        Do ##super(pLine,pLineLeftOver)
        Set val = 0

        $$$TRACE(val)

        Set gateway = ##class(%Net.Remote.Gateway).%New()
        Do gateway.%Connect("127.0.0.1", 55553)
        Do gateway.%Import("D:\\path\\entertest.jar")

        Set javaObj = ##class(packagename.packagename2.entertest).%New(gateway)
        Set val = javaObj.enter()

        $$$TRACE(val)

        Quit $$$OK
    }
}

我收到一个错误:

ERREUR <Ens>ErrException: <CLASS DOES NOT EXIST>zOnProcessInput+9^domain.java.TestJava.1 *packagename.packagename2.entertest 
    -- - connecté en tant que '-' numéro - @' Set javaObj = ##class(packagename.packagename2.entertest).%New(gateway)'

我使用了这篇文章,但我不知道他是如何工作的:Intersystems Caché with Java Gateway - Pass parameter as java.io.FileInputStream

我尝试在 Ensemble 生产中添加服务“JavaGatewayService”。没有帮助...
我还尝试在其中添加对象网关

系统管理 > 配置 > 连接 > 对象网关。

没有帮助...而且我不知道它是否应该帮助我...

我没有想法/选择。

先感谢您。

4

2 回答 2

0

要在 Ensemble 中使用 Java,您必须使用 JavaGateway 服务,并且应该将 Java 类导入 Caché。您可以查看文档以获取更多详细信息。
如果您在InterSystems 开发人员社区门户网站上提问,您可以更快地得到答案。

UPD:您尝试导入 java 类,但方式错误。如果您查看文档,您将看到 method 的定义%Import

最终方法 %Import(javaClass As %String, ByRef javaClasses As %ListOfDataTypes, additionalClassPaths As %ListOfDataTypes = "", excludes As %ListOfDataTypes = "")

正如您在此处看到的,第一个参数是 javaClass。所以,而不是

Do gateway.%Import("D:\\path\\entertest.jar")

尝试导入特定的 java 类

Do gateway.%Import("packagename.packagename2.entertest")
于 2016-12-22T14:28:50.617 回答
0

我终于设法得到了一个可行的解决方案,所以我添加了这个来分享它,以提供一个完整的分步指南。

以下是我需要做的:
在 Ensemble 中:我添加了“EnsLib.JavaGateway.Service”的“JavaGateway”服务,地址为 127.0.0.1,端口为 55555(我认为这些是默认值)。我还指定在 JDKVersion 中使用“Java 1.8”。

我将其编写为 Java 代码并将其导出为 Jar 存档:

package packageName;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;

public class EnterTestClass {

    public long enter() throws IOException {

        File file = new File("D:\\Path\\EnterTestClass.txt");

        if (!file.exists()) {
            file.createNewFile();
        }

        BufferedWriter bf = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
        bf.write(LocalDateTime.now().toString());
        bf.close();

        return 1;
    }
}

在 Studio 中,我创建了一个新类。
这是代码:

Method OnProcessInput(pLine As Ens.StringContainer, Output pLineLeftOver As Ens.StringContainer) As %Status
{
    Set val = 0
    $$$TRACE(val)

    Set gateway = ##class(%Net.Remote.Gateway).%New()
    Do gateway.%Connect("127.0.0.1", 55555)

    Set javaObj = ##class(packageName.EnterTestClass).%New(gateway)
    Set val = javaObj.enter()

    $$$TRACE(val)
    Quit $$$OK   
}

我使用菜单“工具”->“扩展”->“Java网关助手”:我选择了Jar文件,给出了完整的路径,上面的值127.0.0.1和555555,点击“下一步”,勾选类导入并单击“完成”。

在 Studio 的右侧树中(在命名空间视图中),导入的类应该是可见的。

然后它在启动 OnProcessInput 时起作用(在我的情况下通过发送 tcp 请求)。

感谢 DAiMor 对我的一些错误的帮助,并对我的英语感到抱歉,如果菜单上的名称与我写的不完全一致(我是比利时人,正在开发法语版的 Studio 和 Ensemble)。

于 2017-01-12T15:59:21.477 回答