在 Qpid Proton AMQP 1.0 客户端库中设置连接的 `max_frame_size`
Setting connection's `max_frame_size` in Qpid Proton AMQP 1.0 client library
我只想使用 Apache Qpid Proton client library 打开与特定 max_frame_size
的 AMQP 1.0 连接。这是一个测试套件,而不是真实世界的应用程序。
Java 库似乎比 C 库及其对其他语言的各种绑定更高级,所以我开始使用 Java 库。不幸的是,我找不到设置此参数的方法,尽管必须有一种方法:有一个 Transport
class 可以获取或设置 max_frame_size
.
我首先尝试使用 Messenger API,然后我尝试使用引擎 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的了解非常有限。您能否确认甚至可以设置此参数,如果可以,请告诉我如何设置?
您需要为要使用的连接创建传输实例,然后将传输绑定到连接实例。创建的连接没有绑定到它的隐式传输,这就是为什么您当前返回 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);
我只想使用 Apache Qpid Proton client library 打开与特定 max_frame_size
的 AMQP 1.0 连接。这是一个测试套件,而不是真实世界的应用程序。
Java 库似乎比 C 库及其对其他语言的各种绑定更高级,所以我开始使用 Java 库。不幸的是,我找不到设置此参数的方法,尽管必须有一种方法:有一个 Transport
class 可以获取或设置 max_frame_size
.
我首先尝试使用 Messenger API,然后我尝试使用引擎 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的了解非常有限。您能否确认甚至可以设置此参数,如果可以,请告诉我如何设置?
您需要为要使用的连接创建传输实例,然后将传输绑定到连接实例。创建的连接没有绑定到它的隐式传输,这就是为什么您当前返回 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);