我正在使用 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) 的无效字节值。谁能帮我吗?

有帮助吗?

解决方案

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

当然,防御性编程建议程序员初始化这些值或确保在代码可以采用的每个路径中设置它们,这可以从一开始就防止此问题发生。然而,合同似乎总是在输出参数上设置值,所以我错误地使用了 API。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top