Intersystems Caché Java 网关
Intersystems Caché Java Gateway
我在 Caché 的 Objectscript 开发方面需要一些帮助。
我在这项技术上工作了几个月,从几天开始,我一直在努力让 Java 网关正常工作,但没有成功。它应该允许我 运行 java .class 等 .jar 代码。
但即使在文档中进行了解释,也没有完整的示例,而且我一遍又一遍地遇到错误。所以,我想知道是否有人可以提供一个完整的例子,纠正我或解释我做错了什么?
这是我目前拥有的:
我的简单 java class - 在文件中写入日期和时间
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)'
我用过这个 post 但我不知道他是怎么让它工作的:
我尝试在 Ensemble 制作中添加服务 "JavaGatewayService"。没有帮助...
我还尝试在
中添加一个对象网关
系统管理 > 配置 > 连接性 > 对象网关。
没有帮助...而且我不知道它是否应该对我有帮助...
我ideas/options没了。
提前致谢。
要在 Ensemble 中使用 Java,您必须使用 Java 网关服务,并且您应该将 Java classes 导入 Caché。您可以查看documentation了解更多详情。
如果您在 InterSystems Developer Community portal.
询问,您可以更快地得到答案
UPD:
您尝试执行 import java classes,但方式错误。如果您查看文档,您将看到方法 %Import
.
的定义
final method %Import(javaClass As %String, ByRef javaClasses As
%ListOfDataTypes, additionalClassPaths As %ListOfDataTypes = "",
exclusions As %ListOfDataTypes = "")
正如你在这里看到的,第一个参数是javaClass。所以,而不是
Do gateway.%Import("D:\path\entertest.jar")
尝试导入特定的 java class
Do gateway.%Import("packagename.packagename2.entertest")
我终于找到了一个有效的解决方案,所以我添加了这个来分享它,以提供一个完整的分步指南。
这是我需要做的:
在 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 中,我创建了一个新的 class。
这是代码:
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" -> "Extensions" -> "Java Gateway Assistant":
我选择了 Jar 文件,给出了完整路径,上面的值 127.0.0.1 和 555555,点击 "Next",勾选 class 导入并点击 "Finish"。
在 Studio 的右侧树上(在命名空间视图中),导入的 class 应该是可见的。
然后它在启动 OnProcessInput 时起作用(在我的例子中是通过发送一个 tcp 请求)。
感谢 DAiMor 帮助我解决了一些错误,抱歉我的英语不好,如果菜单上的名字与我写的不完全一样(我是比利时人,正在开发法语版的 Studio 和 Ensemble) .
我在 Caché 的 Objectscript 开发方面需要一些帮助。
我在这项技术上工作了几个月,从几天开始,我一直在努力让 Java 网关正常工作,但没有成功。它应该允许我 运行 java .class 等 .jar 代码。
但即使在文档中进行了解释,也没有完整的示例,而且我一遍又一遍地遇到错误。所以,我想知道是否有人可以提供一个完整的例子,纠正我或解释我做错了什么?
这是我目前拥有的:
我的简单 java class - 在文件中写入日期和时间
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)'
我用过这个 post 但我不知道他是怎么让它工作的:
我尝试在 Ensemble 制作中添加服务 "JavaGatewayService"。没有帮助...
我还尝试在
系统管理 > 配置 > 连接性 > 对象网关。
没有帮助...而且我不知道它是否应该对我有帮助...
我ideas/options没了。
提前致谢。
要在 Ensemble 中使用 Java,您必须使用 Java 网关服务,并且您应该将 Java classes 导入 Caché。您可以查看documentation了解更多详情。
如果您在 InterSystems Developer Community portal.
UPD:
您尝试执行 import java classes,但方式错误。如果您查看文档,您将看到方法 %Import
.
final method %Import(javaClass As %String, ByRef javaClasses As %ListOfDataTypes, additionalClassPaths As %ListOfDataTypes = "", exclusions As %ListOfDataTypes = "")
正如你在这里看到的,第一个参数是javaClass。所以,而不是
Do gateway.%Import("D:\path\entertest.jar")
尝试导入特定的 java class
Do gateway.%Import("packagename.packagename2.entertest")
我终于找到了一个有效的解决方案,所以我添加了这个来分享它,以提供一个完整的分步指南。
这是我需要做的:
在 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 中,我创建了一个新的 class。
这是代码:
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" -> "Extensions" -> "Java Gateway Assistant": 我选择了 Jar 文件,给出了完整路径,上面的值 127.0.0.1 和 555555,点击 "Next",勾选 class 导入并点击 "Finish"。
在 Studio 的右侧树上(在命名空间视图中),导入的 class 应该是可见的。
然后它在启动 OnProcessInput 时起作用(在我的例子中是通过发送一个 tcp 请求)。
感谢 DAiMor 帮助我解决了一些错误,抱歉我的英语不好,如果菜单上的名字与我写的不完全一样(我是比利时人,正在开发法语版的 Studio 和 Ensemble) .