带有paho的java.io.EOFException

时间:2013-11-06 13:15:43

标签: java mqtt mosquitto paho

我想对mosquitto进行压力测试,所以我创建了一些代码,如下所示

for (int i = 0; i < 800; i++) {
        final int j = i;
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(j + " : ************");
                try {
                    MqttClient client = new MqttClient("tcp://192.168.88.203", SERVER_CLIENTID_PREFIX + j); 
                    client.connect();

                    MqttMessage message = new MqttMessage((j + ":me").getBytes());
                    message.setQos(2);

                    client.publish(TOPIC_PREFIX + j, message);
                } catch (MqttSecurityException e) {
                    e.printStackTrace();
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }

但是,我在运行期间遇到了EOFException之类的错误,而且有些客户端断开连接。 我想知道有多少客户可以使用一台mosquitto服务器同时发布消息,我怎样才能进行压力测试。谢谢!

详细例外是:

    Connection lost (32109) - java.io.EOFException
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:162)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:250)
    at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:51)
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:121)
    ... 1 more

我从mosquitto服务器发现了一些日志:

1383736170: Socket read error on client Server-82, disconnecting.

请帮助我,谢谢!

7 个答案:

答案 0 :(得分:10)

我使用类似上面的代码得到了完全相同的错误。我发现将QOS更改为0可以解决问题。

message.setQos(0);

[编辑]再挖掘一下,我发现RabbitMQ的MQTT插件不支持2的QOS。http://www.rabbitmq.com/mqtt.html

答案 1 :(得分:3)

我的问题是由于clientId与发布者/订阅者相同。 Persistence数据存储区的错误也在使用中。

答案 2 :(得分:0)

Linux中有1024个文件/套接字限制,但您可以对其进行扰乱,ulimit -n 4096请参阅: mqtt mosquitto linux connection limit

答案 3 :(得分:0)

在我的情况下,这是因为我不小心使用了tcp://...网址而不是ssl://...,并且服务器配置为不允许不安全的连接。

我还必须这样做,因为@Aidan说并将QoS从2降低到1。

修改:我不是100%肯定,但我认为我使用的服务器是RabbitMQ,并且分配了non-standard meaning to the QoS values。说实话,这可能是一个更明智的意义:

  

瞬态(QoS0)订阅使用非持久的自动删除队列   将在客户端断开连接时被删除。

     

持久(QoS1)订阅使用持久队列。是否排队   自动删除是由客户端的干净会话标志控制的。   具有干净会话的客户端使用自动删除的队列,其他人使用   非自动删除的。

答案 4 :(得分:0)

客户端ID是问题,生成随机测试

MqttClient.generateClientId ();

答案 5 :(得分:0)

有时,当您尝试发送大型数据集时会发生这种情况。尝试减少数据集大小。它解决了我的问题。

答案 6 :(得分:0)

解决方案是添加MqttClient.generateClientId

MemoryPersistence persistence = new MemoryPersistence()
MqttClient client = new MqttClient("tcp://192.168.88.203",MqttClient.generateClientId(),persistence); 
client.connect();

MqttClient client = new MqttClient("tcp://192.168.88.203", MqttClient.generateClientId+SERVER_CLIENTID_PREFIX)

标识符必须是随机的。 我在scala中遇到了这个问题,这是我的解决方案。