Intersystems Caché Java Gateway
Мне нужна помощь по разработке в Caché's 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é с Java Gateway - передать параметр как java.io.FileInputStream
Я пытался добавить сервис "JavaGatewayService" в производство ансамбля. Не помогло...
Я также попытался добавить шлюз объекта в
Администрирование системы> Конфигурация> Связь> Объектные шлюзы.
Не помогло... И я не знаю, должно ли это помочь мне...
У меня нет идей / вариантов.
Заранее спасибо.
2 ответа
Мне наконец-то удалось получить рабочее решение, поэтому я добавляю его, чтобы поделиться им, чтобы дать полное пошаговое руководство.
Вот что мне нужно было сделать:
В Ensemble: я добавил службу "JavaGateway" из "EnsLib.JavaGateway.Service", настроенную с адресом 127.0.0.1 и портом 55555 (я думаю, это значения по умолчанию). Я также указал использование "Java 1.8" в 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;
}
}
В студии я создал новый класс.
Вот код:
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 Gateway Assistant": я выбрал Jar File, дал полный путь, значения выше 127.0.0.1 и 555555, нажал "Next", нажал на класс, чтобы импортировать и нажимаем "Готово".
В правом дереве Studio (в представлении пространств имен) должен быть виден импортированный класс.
Затем он работал при запуске OnProcessInput (отправив запрос tcp в моем случае).
Спасибо DAiMor за помощь в устранении некоторых моих ошибок, и извините за мой английский, и если в меню нет точно названий, которые я написал (я бельгиец и работаю над французской версией Studio и Ensemble).
Для работы с Java в Ensemble вы должны использовать JavaGateway Service и импортировать классы Java в Caché. Вы можете посмотреть документацию для более подробной информации.
И вы можете получить ответ немного быстрее, если спросите на портале сообщества разработчиков InterSystems.
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")