【问题标题】:Intersystems Caché Java GatewayIntersystems Caché Java 网关
【发布时间】:2017-05-07 23:46:02
【问题描述】:

我需要一些关于开发 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”。没有帮助...
我还尝试在

中添加对象网关

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

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

我没有想法/选择。

提前谢谢你。

【问题讨论】:

    标签: java intersystems-cache intersystems objectscript intersystems-ensemble


    【解决方案1】:

    要在 Ensemble 中使用 Java,您必须使用 JavaGateway 服务,并且应该将 Java 类导入 Caché。您可以查看documentation 了解更多详情。
    如果您在InterSystems Developer Community portal 提问,您可以更快地得到答复。

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

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

    正如你在这里看到的,第一个参数是javaClass。所以,而不是

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

    尝试导入特定的 java 类

    Do gateway.%Import("packagename.packagename2.entertest")
    

    【讨论】:

    • 您的意思是Do gateway.%Import("D:\\path\\entertest.jar") 不导入Java 类吗?而且我已经多次查看文档页面并没有帮助。我不明白我做错了什么......
    • 对不起,我错过了这一行。 %Import 确实导入 Java 类,但按名称,而不是按 jar。你应该把一个来自java的类名或类列表放在那里。查看此类的文档:docs.intersystems.com/latest/csp/documatic/…
    • 我刚刚尝试使用Do gateway.%Import("D:\\path\\entertest.class"),但在Set javaObj = ##class(packagename.packagename2.entertest).%New(gateway) 行上收到与上述&lt;CLASS DOES NOT EXIST&gt; 相同的错误...您还有其他提示吗?
    • 我应该能够在“某处”看到一些生成的代理类,对吧?你能告诉我应该把它们放在哪里,以便我也检查一下吗?谢谢。
    • 请查看我对此答案的更新,希望对您有所帮助。
    【解决方案2】:

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

    这是我需要做的:
    在 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 File,给出了完整的路径,上面的值 127.0.0.1 和 555555,点击“Next”,勾选要导入的类,然后点击“Finish”。

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

    然后它在启动 OnProcessInput 时工作(在我的例子中是通过发送一个 tcp 请求)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多