在Qpid Proton AMQP 1.0客户端库

时间:2016-07-11 13:22:49

标签: java amqp qpid

我想使用Apache Qpid Proton client library打开与特定max_frame_size的AMQP 1.0连接。这是在测试套件内,而不是真实世界的应用程序。

Java库看起来比C库及其它语言的各种绑定更先进,所以我开始使用Java库。不幸的是,我无法找到设置此参数的方法,但必须有一种方法:有Transport class提供获取或设置max_frame_size

我首先尝试使用Messenger API,然后使用Engine API。我无法弄清楚如何访问传输实例。对于Engine API,我看到有一个Connection.getTransport()并尝试过,但在我调用此函数时它是NULL。

这是我的最后一次测试:

private void do_test_with_frame_size(int frame_size, int payload_size) {
    Connection conn = Connection.Factory.create();

    Transport transport = conn.getTransport();
    transport.setMaxFrameSize(frame_size);

    Session session = conn.session();

    Sender sender = session.sender("sender");
    conn.open();
    session.open();
    sender.open();

    if (sender.getCredit() > 0) {
        String uri = System.getProperty("broker_uri");
        assertNotNull(uri);
        String address = String.format("%s/fragmentation-%d-%d",
          uri, frame_size, payload_size);

        Message message = Proton.message();
        message.setAddress(address);
        message.setBody(new AmqpValue(new byte[payload_size]));

        byte[] msgData = new byte[1024];
        int length;
        while(true) {
            try {
                length = message.encode(msgData, 0, msgData.length);
                break;
            } catch(BufferOverflowException e) {
                msgData = new byte[msgData.length * 2];
            }
        }
        byte[] tag = "0".getBytes();
        Delivery delivery = sender.delivery(tag);
        sender.send(msgData, 0, length);
        delivery.settle();
        sender.advance();
        sender.close();
        sender.getSession().close();
        sender.getSession().getConnection().close();
    }
}

我承认我对Java的知识非常有限。您能否确认甚至可以设置此参数,如果是,请告诉我如何操作?

1 个答案:

答案 0 :(得分:1)

您需要为要使用的连接创建Transport实例,然后将传输绑定到连接实例。创建的Connection没有绑定到它的隐式Transport,这就是您当前返回null的原因。

private final Transport protonTransport = Proton.transport();
private final Connection protonConnection = Proton.connection();

...

this.protonTransport.setMaxFrameSize(maxFrameSize);
this.protonTransport.setChannelMax(CHANNEL_MAX);

this.protonTransport.bind(this.protonConnection);