Вызов удаленной программы Java на iSeries из RPG
-
18-09-2019 - |
Вопрос
Я хочу запустить программу Java из RPG, работающую на Iseries V5r4.Удаленная программа представляет собой клиент веб-службы (выполняющий поиск почтового индекса), работающий в Websphere.
В идеале я бы хотел назвать это прямо из РПГ?это возможно?или мне нужно создать Java-программу для запуска на iSeries и использовать RMI или что-то еще для вызова удаленной Java-программы.
Мы не заинтересованы в прямом вызове внешнего веб-сервиса, поскольку это означает открытие пути из другого мира напрямую в iSeries.
Я не программист ролевых игр, я просто ищу что-то, что могло бы указать нашим ребятам в правильном направлении, или что-то, что мне нужно, чтобы сделать Java-программы более удобными для людей, занимающихся ролевыми играми.
Спасибо, Скотт
Решение
Поскольку программа работает на удаленном сервере, вызвать ее напрямую из RPG нельзя.Учитывая, что это веб-сервис, я бы создал программу Java для запуска на iSeries и вызывал эту программу Java из RPG.Сегодня RPG может напрямую взаимодействовать с Java.Вам нужно создать некоторые D-спецификации, чтобы объявить класс и создать прототип вызовов методов.В следующем примере предположим, что в пакете «инструменты» существует класс Java с именем ServiceCaller.Он имеет единственный метод getServiceReply, который принимает три символьных поля и возвращает целое число.
*Define the Java class locally. DServiceCaller S O CLASS(*JAVA:'tools.ServiceCaller') *Class constructor. No parameters. DnewServiceCaller PR O EXTPROC(*JAVA: D 'tools.ServiceCaller': D *CONSTRUCTOR) D CLASS(*JAVA:'tools.ServiceCaller') *GetServiceReply. *public int getServiceReply(byte[] parm1, byte[] parm2, byte[] parm3) DgetServiceReply PR 10I 0 EXTPROC(*JAVA: D 'tools.ServiceCaller': D 'getServiceReply') D Parm1 400A CONST D Parm2 400A CONST D Parm3 400A CONST
Ваши расчетные характеристики RPG будут выглядеть примерно так:
/free ServiceCaller = newServiceCaller(); iReply = getServiceReply(ServiceCaller:'Parm1':'Parm2':'Parm3'); /end-free
Внутри Java-кода в методе getServiceReply преобразуйте эти массивы байтов в такие строки:
sParm1 = new String(parm1); sParm2 = new String(parm2); sParm3 = new String(parm3);
Конечно, это слишком упрощенный пример, и потребности вашего приложения будут немного другими.Вам понадобится добавить код обработки ошибок на случай, если веб-служба не ответит.Вы также можете использовать геттеры и сеттеры в своем классе.Все зависит от потребностей вашего приложения и требований удаленного веб-сервиса.
Некоторые примечания о типах RPG и типах Java:
RPG Type Java Type 10I 0 int 3I 0 byte 5I 0 short 20I 0 long N boolean A byte[]
Если вы чувствуете себя особенно амбициозным, вы можете вызвать собственные HTTP-классы Java из вашей RPG.Но я обнаружил, что более простой путь — это специальная Java-программа, выполняющая роль промежуточного звена, написанная специально для взаимодействия с RPG.Хотя RPG и может общаться с Java, это не так красиво, как общение Java с Java.
Дополнительную информацию о вызове Java из RPG можно найти в руководстве программиста ILE RPG.Версию V5R4 можно найти здесь: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc092507.pdf
Другие советы
Поскольку это веб-сервис, другим решением было бы использовать HTTP API Скотта Клемента.Он доступен на его сайте по адресу http://www.scottklement.com/httpapi/.
Одним из больших преимуществ для меня является то, что это полностью RPG и не используется Java, что иногда может быть немного медленным.Я не совсем знаком с тем, как веб-сервисы работают на Java, но, похоже, вам не нужно формировать весь XML, и это делается за вас.С HTTP API вам придется сделать это самостоятельно.
Также у Скотта Клемента на сайте есть еще несколько полезных вещей.Еще один сайт с некоторыми полезными инструментами: http://www.think400.dk/downloads.htm.