作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的 MQTT 监听器,用于订阅主题并回调
MqttClient client = new MqttClient(mqttHost, MqttClient.generateClientId());
client.connect();
client.subscribe("test", QUALITY_OF_SERVICE_2, new IMqttMessageListener() {
public void messageArrived(final String s, final MqttMessage mqttMessage) {
System.out.println("Received"+mqttMessage.toString());
// Code that blocks the thread
lock.lock();
//do something
lock.unlock();
});
假设我正在向主题测试发布 1000 条消息,但在 tomcat 上运行上述监听器将显示 < 1000 条控制台输出,表明接收器线程未获取所有发送的消息。
如果没有 lock() 代码,监听器将按预期工作并接收所有消息。
最佳答案
您不应该在 messageArrived
处理程序中执行长时间运行/阻塞的任务,因为这是在客户端的主网络循环上调用的。
如果您有长时间运行/阻塞的任务来处理消息,您应该创建一个本地队列,并使用单个本地线程(如果消息顺序很重要)或线程池(如果您想要)处理来自该队列的消息。尽快处理传入的消息。
Java 有一组内置的核心类,用于构建队列并启动线程来使用这些队列中的消息。查看java.util.concurrent
包中的类。
关于java - MQTT - Paho IMqttMessageLIstener 当监听器线程因操作而被阻止时会丢失消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471956/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!