【问题标题】:Setting connection's `max_frame_size` in Qpid Proton AMQP 1.0 client library在 Qpid Proton AMQP 1.0 客户端库中设置连接的 `max_frame_size`
【发布时间】:2016-11-13 11:16:34
【问题描述】:

我想使用Apache Qpid Proton client library 简单地打开一个具有特定max_frame_size 的AMQP 1.0 连接。这是在测试套件中,而不是真实世界的应用程序。

Java 库似乎比 C 库及其对其他语言的各种绑定更先进,因此我开始使用 Java 库。不幸的是,我找不到设置此参数的方法,尽管必须有一种方法:有这个Transport class 提供获取或设置max_frame_size

我首先尝试使用 Messenger API,然后使用 Engine API。我不知道如何访问传输实例。在引擎 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 的了解非常有限。您能否确认甚至可以设置此参数,如果可以,请告诉我如何设置?

【问题讨论】:

    标签: java amqp qpid


    【解决方案1】:

    您需要创建一个传输实例供连接使用,然后将传输绑定到连接实例。创建的 Connection 没有绑定到它的隐式传输,这就是为什么您当前会收到 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);
    

    【讨论】:

    • 谢谢,使用transport.bind(connection) 似乎可行。我会接受你的回答,即使我无法完全测试它,因为测试程序的其余部分不起作用(它甚至没有打开 TCP 连接......)。不幸的是,我已经在这个客户端库上花费了太多时间,我转而使用 .NET 库。
    猜你喜欢
    • 2021-09-11
    • 2013-03-18
    • 2014-08-04
    • 2013-02-05
    • 1970-01-01
    • 2017-08-24
    • 2020-01-24
    • 2018-10-08
    • 2018-07-12
    相关资源
    最近更新 更多