ibm jt400 获取数据队列条目数
ibm jt400 get data queue number of entries
我在 AS400/iSeries 中使用数据队列并使用 jdbc jt400 库从其中读取。
由于它是生产者(AS400)/消费者(myapp) 模式,我想检查数据队列中现在有多少条目,并衡量我的应用程序是否运行得足够快,或者我是否需要更改某些内容。
我可以得到数据队列的最大值length/size,但不能得到当前的length/size。
如何获取或计算该值?
我可以使用 rpg 程序并调用它,但更喜欢 jt400/jdbc 解决方案。
谢谢
我编辑这个问题以添加应该执行此任务的代码,但我得到一个异常:
String pname = "/QSYS.LIB/QMHQRDQD.PGM";
int param0_size = 120; // RDQD0100 size
int size = -1;
ProgramCall spgm = new ProgramCall(as400);
ProgramParameter[] params = new ProgramParameter[4];
params[0] = new ProgramParameter(param0_size);
AS400Bin4 length = new AS400Bin4();
params[1] = new ProgramParameter(length.toBytes(param0_size));
AS400Text formatname = new AS400Text(8);
params[2] = new ProgramParameter(formatname.toBytes("RDQD0100"));
AS400Text dataqueuename = new AS400Text(20);
params[3] = new ProgramParameter(dataqueuename.toBytes("DTQDTQ LIBFIC "));
byte[] RDQD0100 = new byte[120];
try {
spgm.setProgram(pname, params);
if (spgm.run() == true) {
AS400Text out = new AS400Text(param0_size);
RDQD0100 = out.toBytes(params[0].getOutputData());
ByteBuffer bb = ByteBuffer.wrap(RDQD0100);
bb.position(76); // Number of entries currently allocated
size = bb.getInt();
}
}
catch (Exception e){
Logger.error(" ERROR {} ", e);
}
return size;
我总是得到 -1 作为答案,并且在 RDQD0100 = out.toB..
行出现异常
例外是
java.lang.ClassCastException: [B 无法转换为 java.base/java.lang.String
有线索吗?再次感谢
使用基本 JT400,似乎没有办法获取数据队列中的条目数。
您可以使用 QMHQRDQD api 获取队列中的消息数。
好的,我发现我的代码失败已添加到我的问题中并想分享解决方案。
此代码 returns 库 LIBFIC 上数据队列 DTQDTQ 中的当前条目数,如果 error/exception 发生,则为 -1。
int getDQSize() {
String pname = "/QSYS.LIB/QMHQRDQD.PGM";
int param0_size = 120; // RDQD0100 size
int size = -1;
ProgramCall spgm = new ProgramCall(as400);
ProgramParameter[] params = new ProgramParameter[4];
params[0] = new ProgramParameter(param0_size);
AS400Bin4 length = new AS400Bin4();
params[1] = new ProgramParameter(length.toBytes(param0_size));
AS400Text formatname = new AS400Text(8);
params[2] = new ProgramParameter(formatname.toBytes("RDQD0100"));
AS400Text dataqueuename = new AS400Text(20);
params[3] = new ProgramParameter(dataqueuename.toBytes("DTQDTQ LIBFIC "));
byte[] RDQD0100 = new byte[120];
try {
spgm.setProgram(pname, params);
if (spgm.run() == true) {
ByteBuffer bb = ByteBuffer.wrap(params[0].getOutputData());
bb.position(72);
size = bb.getInt();
}
}
catch (Exception e){
Logger.error(" ERROR {} ", e);
}
return size;
}
再次感谢 David G
我在 AS400/iSeries 中使用数据队列并使用 jdbc jt400 库从其中读取。
由于它是生产者(AS400)/消费者(myapp) 模式,我想检查数据队列中现在有多少条目,并衡量我的应用程序是否运行得足够快,或者我是否需要更改某些内容。
我可以得到数据队列的最大值length/size,但不能得到当前的length/size。
如何获取或计算该值?
我可以使用 rpg 程序并调用它,但更喜欢 jt400/jdbc 解决方案。
谢谢
我编辑这个问题以添加应该执行此任务的代码,但我得到一个异常:
String pname = "/QSYS.LIB/QMHQRDQD.PGM";
int param0_size = 120; // RDQD0100 size
int size = -1;
ProgramCall spgm = new ProgramCall(as400);
ProgramParameter[] params = new ProgramParameter[4];
params[0] = new ProgramParameter(param0_size);
AS400Bin4 length = new AS400Bin4();
params[1] = new ProgramParameter(length.toBytes(param0_size));
AS400Text formatname = new AS400Text(8);
params[2] = new ProgramParameter(formatname.toBytes("RDQD0100"));
AS400Text dataqueuename = new AS400Text(20);
params[3] = new ProgramParameter(dataqueuename.toBytes("DTQDTQ LIBFIC "));
byte[] RDQD0100 = new byte[120];
try {
spgm.setProgram(pname, params);
if (spgm.run() == true) {
AS400Text out = new AS400Text(param0_size);
RDQD0100 = out.toBytes(params[0].getOutputData());
ByteBuffer bb = ByteBuffer.wrap(RDQD0100);
bb.position(76); // Number of entries currently allocated
size = bb.getInt();
}
}
catch (Exception e){
Logger.error(" ERROR {} ", e);
}
return size;
我总是得到 -1 作为答案,并且在 RDQD0100 = out.toB..
行出现异常例外是
java.lang.ClassCastException: [B 无法转换为 java.base/java.lang.String
有线索吗?再次感谢
使用基本 JT400,似乎没有办法获取数据队列中的条目数。
您可以使用 QMHQRDQD api 获取队列中的消息数。
好的,我发现我的代码失败已添加到我的问题中并想分享解决方案。
此代码 returns 库 LIBFIC 上数据队列 DTQDTQ 中的当前条目数,如果 error/exception 发生,则为 -1。
int getDQSize() {
String pname = "/QSYS.LIB/QMHQRDQD.PGM";
int param0_size = 120; // RDQD0100 size
int size = -1;
ProgramCall spgm = new ProgramCall(as400);
ProgramParameter[] params = new ProgramParameter[4];
params[0] = new ProgramParameter(param0_size);
AS400Bin4 length = new AS400Bin4();
params[1] = new ProgramParameter(length.toBytes(param0_size));
AS400Text formatname = new AS400Text(8);
params[2] = new ProgramParameter(formatname.toBytes("RDQD0100"));
AS400Text dataqueuename = new AS400Text(20);
params[3] = new ProgramParameter(dataqueuename.toBytes("DTQDTQ LIBFIC "));
byte[] RDQD0100 = new byte[120];
try {
spgm.setProgram(pname, params);
if (spgm.run() == true) {
ByteBuffer bb = ByteBuffer.wrap(params[0].getOutputData());
bb.position(72);
size = bb.getInt();
}
}
catch (Exception e){
Logger.error(" ERROR {} ", e);
}
return size;
}
再次感谢 David G