Доступ к RPG в iSeries с Java

У кого-нибудь был хороший опыт прямого общения с программами RPG, запущенными на машине iSeries V5R4, с Java? Если да, то каковы рекомендации сообщества и каких ловушек мне следует избегать?

Судя по различной литературе и решениям, которые я пробовал, похоже, что мы можем использовать ProgramCallBeans (либо через PCML, либо xPCML), разговаривать с DataQueues (для асинхронной связи) или даже JNI.

Я ищу что-то надежное, производительное, быстрое в разработке, простое в обслуживании и легкое для тестирования (разве мы не все!?!).

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
7 206
6

Ответы 6

Мы просто используем JDBC и хранимые процедуры. Хранимая процедура вызывает RPG вместо выполнения SQL. Я не программист RPG, но интерфейс кажется очень простым. DataQueues в порядке, но они не так надежны, как что-то вроде JMS (без гарантированной доставки).

Мы довольно свободно использовали JDBC для доступа к таблицам DDS или DDL SQL с хорошим успехом. Мы также использовали хранимые процедуры (как вызывающие программы RPG, так и с собственным SQL). Однако мы обнаружили, что хранимые процедуры RPG не очень хороши для обработки сложных возвращаемых структур или наборов результатов.

lawsonj2019 10.10.2008 23:10

Вызвать java-методы прямо из RPG довольно просто. Я не совсем уверен, что именно вы пытаетесь сделать, я несколько раз обращался непосредственно к java-методам.

Пример того, как это делается. Взгляните на RPGMail. Вы можете посмотреть исходный код и увидеть, как Аарон использовал RPG для подключения к JavaMail.

Он вызывает RPG из Java, которую мы должны уметь делать, а не Java из RPG.

lawsonj2019 10.10.2008 23:10

Вы должны посмотреть JTOpen. Это довольно легко использовать, чтобы делать то, что вы хотите. Вот пример, который кто-то собрал: программный вызов as400 с использованием jtopen

Мы использовали как JTOpen с открытым исходным кодом (у которого, кстати, отличные разработчики), так и предоставленную библиотеку JT400 с IBM Toolbox для iSeries с хорошими результатами. Я просто хочу посмотреть, в правильном ли я направлении иду с этим, или есть другие пути (например, JNI и т. д.).

lawsonj2019 10.10.2008 23:12

Я предлагаю использовать IBM Java Toolbox for Java. Поместите JT400.jar в путь к классам (или JT400Ntv.jar, если Java работает на iSeries). Я использовал как класс ProgramCall, так и классы CommandCall.

Класс com.ibm.as400.access.CommandCall прост в использовании. У него есть простой конструктор, которому вы передаете класс com.ibm.as400.access.AS400. Затем просто используйте такой метод запуска:

CommandCall command = new CommandCall(as400);
command.run("CPYF FROMFILE(BLAH) TOFILE(BLAHBLAH) CRTFILE(*YES)");

Конечно, вы бы не стали использовать эту конкретную команду CL, но идею вы поняли. При использовании класса CommandCall всегда рекомендуется обрабатывать любые сообщения, поступающие от команды. В одной программе, для которой я это использую, я отображаю сообщения пользователю в текстовом поле на его экране следующим образом:

AS400Message[] messageList = command.getMessageList();
for (int i=0;i < messageList.length;i++) {
String sMessageText = messageList[i].getText();
    sMessage+=sMessageText + "\n";
}

Класс com.ibm.as400.access.ProgramCall требует больше работы, но он позволяет вам получить доступ к возвращаемым параметрам. Я использую его чаще, потому что обычно вызываю существующие рабочие программы RPG, которые возвращают значения. Для этого определите массив com.ibm.as400.access.ProgramParameter. Передавая параметры программе из Java, не забудьте преобразовать их в значения, удобные для AS / 400, используя такой класс, как com.ibm.as400.access.AS400Text. Подробности команды ProgramCall лучше изучить с помощью документации IBM: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzahh/page1.htm

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

PCML позволяет прозрачно передавать типы данных java в программу rpg в качестве параметра. Недостатком является то, что xml в документе PCML становится статическим интерфейсом и должен обновляться, если программа когда-либо обновляется. С правильными инструментами сборки может быть довольно просто автоматизировать обновление pcml xml, но сейчас я делаю это вручную.

Я использовал этот подход, когда программу rpg нужно вызывать из java, а логический поток контролируется программой java.

В случае, когда логический поток контролировался программой rpg, я использовал очереди данных как для синхронных, так и для асинхронных вызовов java. Это потребовало написания значительного объема кода для стандартизации того, как скоординированно читать и записывать в очереди данных с разных языков программирования.

Хм, я здесь новенький и хотел бы проголосовать за ответ KC Baltz, но пока не могу. Хранимые процедуры - лучший вариант. Я использовал JT open для вызова программ изначально и обнаружил проблемы с количеством параметров, которые могут быть переданы, проблемы с типами данных и т. д. Когда у вас есть оболочка процедуры SQL для вашей программы, вы обнаружите, что поддержка Java для SQL позволяет быть намного лучше, чем поддержка Java для 400 вызовов.

Другие вопросы по теме