IntersystemsCachéJavaGateway

时间:2016-12-22 11:02:21

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

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

我已经在这项技术中工作了几个月,而且几天后,我正试图让Java Gateway无法正常工作。它应该允许我运行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”。没有帮助...
我还尝试在

中添加对象网关

系统管理&gt;配置&gt;连接性&gt;对象网关。

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

我没有想法/选择。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

  

final method%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")

答案 1 :(得分:0)

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

这是我需要做的:
在Ensemble中:我添加了一个&#34; JavaGateway&#34;服务&#34; EnsLib.JavaGateway.Service&#34;配置为127.0.0.1作为地址,55555配置为端口(我认为这些是默认值)。我还指定使用&#34; Java 1.8&#34;在JDKVersion中。

我把它写成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   
}

我使用菜单&#34;工具&#34; - &GT; &#34;扩展&#34; - &GT; &#34; Java Gateway Assistant&#34;: 我选择了Jar File,给出了完整的路径,上面的值为127.0.0.1和555555,单击&#34; Next&#34;,将该类导入并单击&#34;完成&#34;。

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

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

感谢DAiMor对我的一些错误提供的帮助,对不起我的英语,如果菜单上没有我写的名字(我是比利时人,并且正在使用法语版的Studio和合奏)。