7

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し、一部のクライアントが切断されました。1 つの 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.

助けてください、ありがとう!

4

7 に答える 7

12

上記と同様のコードを使用して、まったく同じエラーが発生しました。QOS を 0 に変更すると問題が解決することがわかりました。

message.setQos(0);

[編集] もう少し掘り下げて、RabbitMQ の MQTT プラグインが 2 の QOS をサポートしていないことを発見しました。http://www.rabbitmq.com/mqtt.html

于 2015-01-28T13:54:51.027 に答える
3

私の問題は、clientId がパブリッシャー/サブスクライバーと同じであることが原因でした。Persistence データストアがすでに使用されているというエラーが発生していました。

于 2015-11-16T22:43:46.003 に答える
2

クライアントIDが問題で、ランダムなテストを生成します

MqttClient.generateClientId ();
于 2016-10-03T05:23:29.050 に答える
0

私の場合、これは誤って のtcp://...代わりに URLを使用してssl://...おり、サーバーが安全でない接続を許可しないように構成されていたためです。

@Aidanが言ったように、QoSを2から1に減らす必要もありました。

編集:100%確信はありませんが、使用しているサーバーはRabbitMQであり、QoS値に非標準の意味を割り当てていると思います。正直に言うと、おそらくより賢明な意味です。

一時 (QoS0) サブスクリプションは、クライアントが切断されると削除される非永続的な自動削除キューを使用します。

永続 (QoS1) サブスクリプションは、永続キューを使用します。キューが自動削除されるかどうかは、クライアントのクリーン セッション フラグによって制御されます。クリーン セッションのクライアントは自動削除されたキューを使用し、他のクライアントは自動削除されていないキューを使用します。

于 2015-07-27T14:55:17.227 に答える
0

Linux には 1024 個のファイル/ソケットの制限がありますが、変更することができます。次を参照してulimit -n 4096ください: mqtt mosquitto linux connection limit

于 2014-07-25T16:46:48.640 に答える