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")
Другие вопросы по тегам