我正在尝试使用在suse linux上运行的MQTT协议(V3.1)和IBM MQ(8.0.0.0)代理构建推送通知服务,但是,我遇到了问题。我编写了一个简单的Java程序来测试IBM MQ中的并发连接数。它只是开始实例化MqttClient并将它们每个都连接到远程IBM MQ代理。
public MyConsumer(String topic) throws MqttException{
this.client = new MqttClient(SERVER_ADDRESS, MqttClient.generateClientId(), new MemoryPersistence());
client.setCallback(new MyCallback());
MqttConnectOptions connectOptions = new MqttConnectOptions();
connectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
connectOptions.setCleanSession(false);
try
{
if (!this.client.isConnected())
{
this.client.connect(connectOptions);
this.client.subscribe(topic);
}
}
catch (Exception e)
{
System.out.println("****** error ******");
e.printStackTrace();
}
}
奇怪的是,在大约870个客户端成功连接到代理之后,我收到了“连接丢失(32109)-java.io. EOFException”异常:
Connection lost (32109) - java.io.EOFException
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:146)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:65)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)
... 1 more
我同时在两台不同的计算机上运行测试程序,以确保问题与测试计算机无关。另外,我在队列管理器中定义了两个遥测通道,每个通道部署在不同的端口上,但是连接到代理的总客户端数仍然约为870! 最后,我创建了两个队列管理器,在这种情况下,客户端连接的数量增加了一倍。我检查了mqxr日志,但是没有错误日志。谁能给我任何线索,为什么每个队列管理器只接受此数字连接。
P.S:提及我使用emqtt broker(另一个mqtt经纪人)测试此示例可能会有所帮助,并且效果很好(连接数超过5k)
答案 0 :(得分:0)
使用MQTT协议(V3.1)和IBM MQ的推送通知服务 (8.0.0.0)经纪人
首先,为什么不使用MQTT协议v3.1.1?
第二,停止使用该产品的版本“ 0”。立即升级到MQ v8.0.0.10或更高版本的MQ v9.0.0.4。
最后,您要运行多少个客户端应用程序(进程)以创建870个连接?