Ibm midrange ibm jt400获取数据队列条目数

Ibm midrange ibm jt400获取数据队列条目数,ibm-midrange,jt400,Ibm Midrange,Jt400,我在AS400/iSeries中使用数据队列,并使用JDBCJT400库从其中读取数据 由于它是生产者(AS400)/消费者(myapp)模式,我想检查数据队列中现在有多少条目,并测量我的应用程序是否运行得足够快,或者我需要更改某些内容 我可以获取数据队列的最大长度/大小,但不能获取当前长度/大小 如何获取或计算该值 我可以使用rpg程序并调用它,但更喜欢jt400/jdbc解决方案 谢谢 我编辑此问题是为了添加应该执行此任务的代码,但我得到一个异常: String pname = "/

我在AS400/iSeries中使用数据队列,并使用JDBCJT400库从其中读取数据

由于它是生产者(AS400)/消费者(myapp)模式,我想检查数据队列中现在有多少条目,并测量我的应用程序是否运行得足够快,或者我需要更改某些内容

我可以获取数据队列的最大长度/大小,但不能获取当前长度/大小

如何获取或计算该值

我可以使用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,似乎没有办法获取数据队列中的条目数


您可以使用api获取队列中的消息数。

好的,我发现添加到问题中的代码失败,希望与大家分享解决方案

如果发生错误/异常,此代码返回库LIBFIC上数据队列DTQDTQ中的当前条目数或-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

谢谢,我用这个更新了我的问题,因为我在阅读答案时遇到了一个异常。FWIW:我建议用PCML定义调用。它比你正在使用的方法更容易定义和维护。