Вызов программы i-серии из Java дает неверный вывод - PullRequest
1 голос
/ 15 февраля 2011

Я использую инструментарий jtopen / jt400 для вызова программ на IBM i-series r5v4 (он же AS / 400) из Java (на самом деле: JRuby, но я видел ту же проблему в чистой Java). Это отлично работает для некоторых программ, в то время как для других программ выходные байты содержат все нули, что просто неверно, а иногда даже неверно (например, в случае ZonedDecimal). Нет сообщений, прикрепленных к ProgramCall, в JobList или в SYSOPR.MSGQ. Кто-нибудь знает, почему это происходит?

Чтобы показать некоторый код (я уверен, что любой, кто работал с библиотекой, может понять этот Ruby-рендеринг Java):

as400 = AS400.new(host, user, password)
call = ProgramCall.new(as400)
call.program = "/QSYS.LIB/LIBRARY_NAME.LIB/PROGRAM_NAME.PGM"

# Prepare converters
text1_converter = AS400Text.new(1)
text3_converter = AS400Text.new(3)
decimal92_converter = AS400ZonedDecimal.new(11, 2)

# Prepare parameters
call.parameter_list = []

# Input parameters
call.parameter_list << ProgramParameter.new(text1_converter.to_bytes('N'))
call.parameter_list << ProgramParameter.new(decimal92_converter.to_bytes(1500.25))

# Output parameters
call.parameter_list << ProgramParameter.new(text3_converter.byte_length)
call.parameter_list << ProgramParameter.new(decimal92_converter.byte_length)  

# Execute the call    
call.run

# Show the results
puts "Text3 output value: " + text3_converter.to_object(params[2].output_data).to_s
puts "Decimal92 output value: " + decimal92_converter.to_object(params[3].output_data).to_s

Как я уже сказал, для некоторых программ это прекрасно работает, в то время как для других params[2].output_data будет байтовым массивом [0, 0, 0], что не является ожидаемым результатом. Хуже того, params[3].output_data будет [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], что является недопустимым байтовым значением для ZonedDecimal.new (9, 2). Кто-нибудь может мне помочь?

1 Ответ

3 голосов
/ 16 февраля 2011

Оказывается, вы должны всегда устанавливать допустимые значения input_data для выходных параметров, даже если значения нигде не используются. Если вы этого не сделаете, они не будут инициализированы, и они будут содержать мусор (но часто места памяти будут содержать нули, как в моем случае). Если впоследствии программа не установит явно выходные значения, как это было в случае моего выбора входных параметров, то изречение мусор равно мусору из .

Конечно, защитное программирование предполагает, что программист инициализирует такие значения или проверяет, установлены ли они в каждом пути, который можно пройти через код, что в первую очередь предотвратило бы возникновение этой проблемы. Однако, похоже, что контракт заключается в том, чтобы всегда устанавливать значения в выходных параметрах, поэтому я неправильно использовал API.

...