我已经在后台线程中成功实现了HiveMQ,但是启用飞行模式后存在一个小问题。 日志显示了原因,但我认为缺少某些内容,看不到丢失的错误处理程序在哪里。

日志:

com.hivemq.client.mqtt.exceptions.MqttSessionExpiredException: Session expired as connection was closed.
System.err  W  io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call

实现代码:

    client = Mqtt5Client.builder()
            .serverHost(host)
            .serverPort(port)
            .identifier(clientId)
            .addDisconnectedListener(new MqttClientDisconnectedListener() {
                @Override
                public void onDisconnected(MqttClientDisconnectedContext context) {
                    Log.d(TAG, "On disconnected... " + context.getCause());
                }
            })
            .automaticReconnectWithDefaultConfig()
            .buildRx();
    Mqtt5Connect connect = Mqtt5Connect.builder()
            .willPublish()
                .topic(willTopic)
            .applyWillPublish()
            .build();

    Completable connectScenario = client.connect(connect)
            .doOnSuccess(this::connectSuccess)
            .doOnError(this::connectFailed)
            .ignoreElement();

    Single<Mqtt5PublishResult> publishConnect
            = client.publish(Flowable.just(
                    Mqtt5Publish.builder()
                            .topic("d/" + this.clientId + START)
                            .payload(startData.toByteArray())
                            .build())).singleOrError();

            connectScenario
            .andThen(publishConnect)
            .doOnSuccess(this::onConnectSuccess)
            .doOnError(this::disconnectError)
            .subscribe();

当然,这里缺少一些东西,但是问题是我应该在哪里处理断开连接事件。

#1楼 票数:4 已采纳

如果添加doOnError回调,RxJava不会将错误视为已处理。

您可以将错误处理程序添加到subscribe调用:

connectScenario
    .andThen(publishConnect)
    .subscribe(this::onConnectSuccess, this::disconnectError);

相反,在doOnError回调中处理错误后,您也可以忽略该错误:

connectScenario
    .andThen(publishConnect)
    .doOnSuccess(this::onConnectSuccess)
    .doOnError(this::disconnectError)
    .ignoreElement().onErrorComplete()
    .subscribe();

如果要允许临时的网络不可用,则应使用sessionExpiryInterval> 0并自动重新连接。

  ask by AXSM translate from so

未解决问题?本站智能推荐:

2回复

如何使用HiveMq-mqtt库连接到Mqtt3AsyncClient?

我一直在尝试在我的 Android 应用程序中使用 hivemq 实现 mqtt。 尽管我使用了他们文档中相同的规范和配置,但我仍然无法建立成功的连接。 我之前能够将 paho 用于 mqtt,但如果应用程序处于后台,则它不适用于 android Oreo 及更高版本,因为库没有 startServ
2回复

如何避免订阅同一主题并在HiveMQAndroid客户端中多次触发回调?

预期行为我想有一个回调来收听我订阅的每个主题,每条消息只发送一次。 我的意思是,我想订阅一个主题 1000 次,但是当收到一条消息时,我只想听一次。 IDK 如果我做错了什么(我猜)。 实际行为 我正在开发一个家庭安全摄像头应用程序。 我有一个我拥有的相机列表。 对于列表中的每台相机,我都订阅
2回复

当我们创建连接时,有什么信息(例如:设备ID,MAC等...)将在后台发送到MQTT服务器?

我们可以阻止设备连接到MQTT服务器吗? 我们可以阻止设备订阅主题吗? 我们是否在MQTT服务器上注册了任何设备。 那么我们只能允许已知的设备? 如果我们有一些注册机制,我们可以使用API​​动态地进行吗?
1回复

HiveMQ连接请求URL

我想知道。 当我们通过URL(tcp:\\ localhost:1883)和客户端连接到hiveMQ代理时。 connect(MqttConnectOptions),具有用户名和密码。 是否可以像tcp:\\ localhost:1883 = username + password那样访问
1回复

一段时间后,Hivemq关闭了

我在我的Ubuntu 16.04服务器上安装了HiveMQ(将zip文件放入我的服务器并解压缩)然后我通过终端启动它(使用SSH连接)并且我连接了一个客户端一切都很好。 然后我关闭终端,看看我是否能够再次连接,我会,我也可以在2小时后连接,但突然间我无法连接。 是否有任何命令可以使它始终保
2回复

如何在HiveMQ中正确使用TLS1.3密码套件?(获取SSL异常:在接收对等方的close_notify之前关闭入站)

我想使用 TLS 1.3 与 HiveMQ 进行安全通信。 我已将 HiveMQ 社区版服务器config.xml文件配置为指定使用 TLS 1.3 密码套件,并将其指向包含使用曲线的 256 位椭圆曲线密钥(EC NOT DSA)的密钥对的密钥库: secp256r1 (这是 TLS 1.3 支持
2回复

无法连接到远程服务器上的HiveMQ

我通过 HiveMQ 在远程服务器上运行我自己的 MQTT Broker。 我设置了 Nginx 并且仪表板在http://104.251.210.224上工作正常。 但我无法通过发布者或订阅者连接到它。 在我以某种方式连接到 HiveMQ 沙箱之前 mqtt://broker.hivemq.com
2回复

如何使用PahoC库连接到HiveMQ代理

我在 HiveMq 云中创建了一个 hiveMQ 集群,并创建了用户名和密码。 从 Paho C 库中,我创建了MQTTClient_connectOptions并将我的用户名和密码作为参数: MQTTClient_connect无法连接到代理并返回-1 : 连接失败,返回码-1 我尝试与 MQ