Вызов удаленной Java-программы на iSeries из RPG

Я хочу вызвать программу Java из RPG, работающую на Iseries V5r4. Удаленная программа - это клиент веб-службы (выполняющий поиск по почтовому индексу), работающий в Websphere.

В идеале я хотел бы назвать это прямо из РПГ? это возможно? или мне нужно создать Java-программу для запуска на iSeries и использовать RMI или что-то еще для вызова удаленной Java-программы.

Мы не стремимся вызывать внешний веб-сервис напрямую, поскольку это означает открытие пути из другого мира прямо к iSeries.

Я не программист RPG, просто ищу что-то, что укажет нашим ребятам в правильном направлении или что-нибудь, что мне нужно включить, чтобы сделать Java-программы более удобными для людей, занимающихся RPG.

Спасибо, Скотт


person scottyab    schedule 17.08.2009    source источник


Ответы (2)


Поскольку программа работает на удаленном сервере, вы не можете вызвать ее напрямую из RPG. Учитывая, что это веб-служба, я бы создал программу Java для работы в iSeries и вызвал ее из RPG. В настоящее время RPG может напрямую взаимодействовать с Java. Вы должны создать некоторые D-спецификации, чтобы объявить класс и прототипировать вызовы методов. В следующем примере предположим, что существует класс Java с именем ServiceCaller в пакете tools. У него есть единственный метод 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 calc будут выглядеть примерно так:

/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

person Tracy Probst    schedule 17.08.2009
comment
отличный пост спасибо. Как RPG обрабатывает списки / карты Java, мне сказали, что нет эквивалента (во что не верится). Мне нужно вернуть массив потенциальных совпадений адресов? - person scottyab; 17.08.2009
comment
Между Java и RPG можно передавать массивы, но не списки или карты. Я предлагаю использовать методы получения и установки. - person Tracy Probst; 17.08.2009
comment
При передаче массивов лучше всего создавать массив массивов byte [] на Java. Если вы используете символьные поля переменной длины в RPG, все в порядке. Я никогда не использовал символьные поля переменной длины, и вместо этого я просто создал в Java строки с дополнениями длины, необходимой в RPG, а затем преобразовал их в байтовые массивы. - person Tracy Probst; 17.08.2009
comment
@Scotty: Если это здорово, проголосуйте за него; если он решил вашу проблему, примите и его. - person Lawrence Dol; 19.08.2009

Поскольку это веб-сервис, другим решением будет использование HTTP API Скотта Клемента. Он доступен на его веб-сайте по адресу http://www.scottklement.com/httpapi/.

Одним из больших преимуществ для меня является то, что это полностью ролевая игра и не использует Java, что иногда может быть немного вялым. Я не очень хорошо знаком с тем, как веб-службы работают на Java, но похоже, что вам не нужно формировать весь XML, и это сделано за вас. С HTTP API вам нужно будет сделать это самостоятельно.

Также у Скотта Клемента есть еще несколько полезных вещей на своем сайте. Еще один сайт с полезными инструментами - http://www.think400.dk/downloads.htm. .

person Brandon Peterson    schedule 19.08.2009
comment
Я также рекомендую httpapi. Я без проблем использовал его в производственной среде. - person Paul Morgan; 20.09.2009
comment
Для любого достаточно сложного WSDL это будет очень утомительно, поскольку XML-запросы и ответы будут сложными. - person Thorbjørn Ravn Andersen; 22.07.2011