从Java调用i-series程序会产生无效输出

时间:2011-02-15 20:49:15

标签: ibm-midrange jt400 jtopen

我正在使用jtopen / jt400工具包从Java调用IBM i-series r5v4(又名AS / 400)上的程序(实际上: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)的无效字节值。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

事实证明,必须始终在输出参数上设置有效的input_data,即使这些值未在任何地方使用也是如此。如果不这样做,它们将不会被初始化并且它们将包含垃圾(但通常内存位置将包含零,如我的情况)。如果程序随后没有显式设置输出值,这恰好是我选择输入参数的情况,那么等于垃圾输出的格言垃圾就会成立。

当然,防御性编程表明程序员初始化这些值或确保将它们设置在可以通过代码获取的每个路径中,这样可以防止此问题首先发生。但是,合同似乎总是在输出参数上设置值,所以我错误地使用了API。