Вызов программы i-серии из Java дает неверный вывод

StackOverflow https://stackoverflow.com/questions/5009329

  •  14-11-2019
  •  | 
  •  

Вопрос

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

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

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).Может кто-нибудь мне помочь?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top