在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;
}
}我的对象脚本代码-定义我的网关并尝试调用该方法
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)'我用过这篇文章,但我不知道他是怎么做到的:以Java网关Pass参数作为java.io.FileInputStream的Intersystems Caché
我试图在集成产品中添加一个服务"JavaGatewayService“。没有帮助..。
我还尝试在
系统管理>配置>连接性>对象网关。
没有帮助..。我不知道这是否对我有帮助..。
我没有主意/选择了。
提前谢谢你。
发布于 2017-01-12 15:59:21
我终于找到了一个可行的解决方案,所以我添加这个来分享它,给出一个完整的一步一步的指导。
以下是我需要做的事情:
在集成中:我添加了一个"JavaGateway“服务,其"EnsLib.JavaGateway.Service”配置为127.0.0.1作为地址,55555配置为端口(我认为这些是默认值)。我还在JDKVersion中指定使用“Java1.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
}我使用了菜单"Tools“->扩展”->“”“:我选择了Jar,给出了完整的路径,上面的值为127.0.0.1和555555,点击"Next",点击类导入并单击"Finish”。
在正确的Studio树上(在名称空间视图中),导入的类应该是可见的。
然后,它在启动OnProcessInput时起作用(在我的例子中通过发送一个tcp请求)。
感谢DAiMor对我的一些错误的帮助,并为我的英语道歉,如果菜单上没有我所写的名字(我是比利时人,正在制作一个法语版本的Studio和Ensemble)。
发布于 2016-12-22 14:28:50
要在集成中使用Java,您必须使用JavaGateway服务,并且应该将Java类导入Cach。您可以查看文档获得更多细节。
如果你问InterSystems开发人员社区门户,你可以更快地得到答案。
UPD:您尝试导入java类,但方法错误。如果您查看文档,您将看到方法%Import的定义。
最终方法%导入(javaClass为%String,ByRef javaClasses为%ListOfDataTypes,additionalClassPaths为%ListOfDataTypes = "",排除为%ListOfDataTypes = "")
正如您在这里看到的,第一个参数是javaClass。所以,而不是
Do gateway.%Import("D:\\path\\entertest.jar")尝试导入特定的java类。
Do gateway.%Import("packagename.packagename2.entertest")https://stackoverflow.com/questions/41281638
复制相似问题