Mqtt的messageArrived里面无法调用Service层进行CRUD解决方案

解决mqtt messageArrived()方法调用操作数据库方法断开连接问题 在springboot中整合mqtt 在回调方法messageArrived()获取数据 如果直接操作数据库会使用连接断开 解决方法:把要操作数据库的方法封装到回调类,在本类中调用 先把mapper注入进来 具体原因可以看我上一篇博客 <A title="入门级JAVA android php LINUX/UNIX讨论" href="http://blog.youkuaiyun.com/dbkmeteor" target=_blank>dbkmeteor的专栏</A> 整个.. 阅读详情

 在MQTT的messageArrived方法中无法直接调用Service层进行CRUD操作,因为messageArrived方法通常是在一个单独的线程中执行的,而Service层的操作可能需要在应用程序的主线程中进行。解决方案如下:

/**
 * Mqtt连接回调函数 ,用来接收已经订阅的消息
 */

public class MqttReceiveCallback implements MqttCallback {

    private ExecutorService executor;

    public MqttReceiveCallback() {
        // 创建一个固定大小的线程池
        executor = Executors.newFixedThreadPool(10);
    }


    
    @Override
    public void connectionLost(Throwable throwable) {
        System.out.println("Client 连接丢失 : "+ throwable.getMessage());
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {

        System.out.println("Client 接收消息主题 : " + topic);
        System.out.println("Client 接收消息Qos : " + message.getQos());
        System.out.println("Client 接收消息内容 : " + new String(message.getPayload()));

        executor.submit(() -> {
            try {
                // 在异步任务中调用Service层进行CRUD操作
                DataStaticService datastaticService = (DataStaticService)SpringContextUtil.getBean("datastaticService");
                Datastatic datastatic = JSON.parseObject(message.getPayload(), Datastatic.class);
                //将数据保存至数据库
                datastaticService.save(datastatic);
            } catch (Exception e) {
                e.printStackTrace();
                // 处理异常情况
            }
        });
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }


}

public class SpringContextUtil implements ApplicationContextAware {
	 
	 private static ApplicationContext   applicationContext;
	 
	    /**
	     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
	     */
	    public void setApplicationContext(ApplicationContext applicationContext){
	        SpringContextUtil.applicationContext = applicationContext;
	    }
	 
	    public static ApplicationContext getApplicationContext(){
	        return applicationContext;
	    }
	 
	    /**
	     * 获取对象
	     */
	    public static Object getBean(String name) throws BeansException{
	        return applicationContext.getBean(name);
	    }
	 
	}

 网上试了很多种方法都没用,还是chatgpt找到了答案!

编写MQTTClient测试程序,和PC端运行的MQTT服务程序进行数据收发 使用STM32、ESP8266实现的MQTTClient程序,可以连接远程服务器订阅和发布消息。 阅读详情

相关推荐

绝对旋转编码器学习笔记(基本原理,与PC通信等,不定期更新中)

前言 最近开始学习编码器相关内容,目的在于搞清楚编码器的原理,与上位机的联系等问题。笔记资料来源为网络,整理的同时也会有一些总结和感悟。由于研究方向需求,主要研究数字旋转编码器。 1.编码器的定义 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。——摘自《百度百科》 通常来说,编码器可以将角度位移、直线位移、转速等物理量转换为电信号。这里的电信号根据不同原理的编码器输出脉冲、二进制数码等不同的类型,下面会提到。 2.编码器的分类 编.

黑化咸鱼的博客 1万+

Java调用MQTT入门

重写三个方法,第一个connectionLost是链接丢失时触发,第二个messageArrived是接收到消息触发,第三个deliveryComplete是消息发布完成触发;调用这个sendMsg()方法就能向test.ranye-iot.net地址发送主题为testtopic的消息了;先调用接收消息getMsg(),然后调用发布消息sendMsg();MQTT服务器地址:test.ranye-iot.net。2、建立连接开启监听,当调用发送消息方法时就能接收到了;可以看到控制台打印回调函数里的内容;..

m0_55118640的博客 2056

单细胞分析实录(12): 如何推断肿瘤细胞

公众号后台回复20210418,获取本文的测试数据 1. 回顾 前面我已经讲解了inferCNV的基本用法,这一节继续学习:如何推断肿瘤细胞。本文应该是到目前为止,全网最详细的帖子(之一)。 关于肿瘤细胞的推断,比如研究上皮细胞起源的肿瘤,我见过的一些做法如下 简单粗暴型:将来源肿瘤病灶的所有上皮细胞都看成是肿瘤细胞 看CNV:将来源于肿瘤病灶的上皮细胞和参考细胞比较,将那些有明显CNV的细胞看作肿瘤细胞 看表达特征:考虑到有的肿瘤细胞可能没有CNV层面的变化,有的文章会根据肿瘤与正常的表达谱来区分是.

TOP生物信息 1万+

MQ消息处理方式(自定义注解)

mq回调的类,一般都提供onMessage, messageArrived这样的方法让我们重写, 但是我们的需求是通过不同topic,去调用不同的方法, 如果使用if else开发,那都会写到一个文件, 回调和消息处理函数耦合度也很高,也不利于团队的开发, 通过改造可以达到以下效果,业务代码写到单独的文件中,只要加上注解就可以。 此处采用反射调用的方法处理,使业务代码与回调分离,代码看起来更优雅 (如果有其它更优雅的方法记得跟我说哦!大家多交流学习) 最终效果 : @Slf4j @Mqtt

dhLianga的博客 2294

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

分析一:232串口信号要点:RS232,全双工,采用三线制传输分别为TXD\RXD\GND,其中TXD为发送信号,RXD为接收信号。在RS232中任何一条信号线的电压均为负逻辑关系。即:-15v ~ -3v 代表1 +3v ~ +15v 代表0测试结果与分析:如图所示,以传输一个8位二进制数值“01101010”为例,异步传输数据的一般格式为:起始位+校验位+数据位+停止位。其中,校验位为可选项。...

乔木鱼 1万+

若依框架实战指南:从RBAC权限到微服务集成的企业级开发

RBAC(基于角色的访问控制)是现代企业级应用权限管理的核心模型,它通过角色关联权限、用户关联角色的方式,实现灵活且安全的访问控制。在Spring Boot技术栈中,这一原理常与Spring Security结合,通过拦截器与注解驱动,为系统提供细粒度的权限校验。其技术价值在于标准化了权限体系,大幅降低了重复开发成本,使开发者能聚焦于业务逻辑创新。在快速构建后台管理系统、内部运营平台等应用场景时,基于Spring Boot的权限管理系统框架成为高效起点。本文以若依框架为例,深入剖析其如何封装RBAC等基础模

weixin_34163553的博客 359

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

若依框架实战:从零搭建企业级后台系统与进阶集成指南

在企业级应用开发中,权限管理与快速开发是核心需求。基于RBAC(基于角色的访问控制)模型,结合Spring Boot和Vue.js的前后端分离架构,能够高效构建安全、可扩展的后台管理系统。通过代码生成器、菜单动态配置等工具,开发者可以大幅提升CRUD功能的开发效率,将精力聚焦于业务逻辑创新。本文以若依(RuoYi)框架为例,深入解析其权限控制机制与代码生成原理,并探讨在真实项目中如何集成SA-Token实现单点登录、适配PostgreSQL数据库,以及对接MQTT/EMQX消息中间件,为物联网等场景提供实时

a1311010193的博客 374

实现电脑同时上内网和外网(或通过外网访问到该电脑通过该电脑访问内网)

一、需求描述 目前使用的公司网络只能够上内网,但是又有上外网查资料的需求: ①想要实现电脑既能上内网的同时也可以上外网; ②想要使用其他外网电脑使用外网连接到该电脑,通过该电脑访问内部的网络内容。 二、准备内容 电脑必须具备两个网卡,即:可以同时连接内网和外网(比如我的笔记本就可以:使用网线连接笔记本网口与内网通讯,使用WIFI连接手机热点访问外部网络); 注意:如果只有一个网口,可以另外购买USB的无线网卡来实现上网卡。 三、实现电脑同时上内网和外网的操作步骤 3.1、网络拓扑图 ..

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

【跳频通信】基于MATLAB的跳频通信系统仿真

同时,跳频通信也具有良好的抗干扰能力,即使有部分频点被干扰,仍能在其他未被干扰的频点上进行正常的通信。由于跳频通信系统是瞬时窄带系统,它易于与其他的窄带通信系统兼容,也就是说,跳频电台可以与常规的窄带电台互通,有利于设备的更新。跳频是最常用的扩频方式之一,其工作原理是指收发双方传输信号的载波频率按照预定规律进行离散变化的通信方式,也就是说,通信中使用的载波频率受伪随机变化码的控制而随机跳变。从通信技术的实现方式来说,“跳频”是一种用码序列进行多频频移键控的通信方式,也是一种码控载频跳变的通信系统。

FPGA/MATLAB学习教程/源码/项目合作开发 6267

智慧社区老年人安全监护系统实现:从设备接入到告警闭环

物联网技术的成熟正推动智慧养老从概念走向落地。在社区养老与居家养老场景中,如何通过传感器与穿戴设备实时感知老人状态,并在跌倒、心率异常、长时间静默等事件发生时及时告警,是安全监护的核心难题。系统通常采用四层架构,设备数据经MQTT等物联网协议上报至平台,利用规则引擎结合历史数据进行二次研判,实现分级告警与自动处置,避免依赖老人主动求助。这一技术路径不仅能显著提升异常事件发现效率,还可为慢病管理积累连续数据。典型的应用包括电子围栏、跌倒检测、行为分析等,尤其在智慧社区项目中,可有效解决“出事了没人知道”的痛点

weixin_34054866的博客 393

别再被 SerialPort 坑了!C# 串口通信的 3 大隐形陷阱与工业级解决方案

NET的SerialPort类更适合实验室调试,而非工业现场——它的设计目标是“能用”,而非“稳定”。工业级串口通信的核心,是在SerialPort基础上构建一层“防护壳”,用主动轮询对抗事件失效,用硬件级操作解决缓冲区谎言,用原子性流程避免关闭死锁。本文提供的类已在30+工业项目中验证(包括汽车生产线、智能仓储、环境监测),可直接替换原生SerialPort,解决90%以上的“玄学问题”。记住:工业场景的“稳定”,从来都不是靠运气,而是靠对每个细节的偏执把控。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 745

多线程环境下队列访问的问题

最近在做一个springboot后端项目,涉及到mqtt服务器接收消息后的回调处理,然后使用websocket通知前端更新数据(websocket的功能已经实现,可以看我上一篇文章)。

weixin_47185482的博客 1035

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MQTT客户端监控连接状态事件

MQTT客户端监控连接状态事件 项目采用paho.mqtt.java客户端,需要监控连接状态变更事件,以进行异常维测和处理。 代码中提供了MqttCallback接口如下: org.eclipse.paho.client.mqttv3-1.2.0-sources.jar!\org\eclipse\paho\client\mqttv3\MqttClient.java public void...

行知致简的专栏 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Springboot + MQTT 在消息到达回调函数中处理数据库操作触发断线问题解决方法

MQTT 在消息到达回调函数中处理数据库操作触发断线问题解决方法问题原因(个人理解)解决办法: 问题原因(个人理解) 在MQtt消息到达回调函数中 不能有一些异常的操作否则都会触掉线 比如:我在回调函数中,获取到的数据类型是Float类型,我用Integer类型变量进行比较的时候,它就会触发掉线操作(我也挺纳闷的,不过强转成Float类型后就不再有问题了)。 正题: 为什么做到对Dao层的操作就掉...

桥豆麻袋丶 8492

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringBoot中MQTT发布与接收消息

【代码】SpringBoot中MQTT发布与接收消息。

weixin_42999287的博客 1264

MQTT协议初识——简单收发

第一部分:认识MQTT 先来一段百度文库的介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。 MQTT协议是为大量计算能力有限,且

whb3299065的博客 8784

Handler的使用方法

一,概述Android中为什么需要Handler机制?因为在android中有两个规定: 1. 网络请求操作要放到子线程。 2. 不能在子线程更新UI。所以Android中必须有线程间的通讯机制,Handler的作用就是负责线程间的通信。在网络请求完成后,通过handler告诉UI线程更新UI,并传递数据。

fightingXia的博客 2560

Mqtt集成Spring,解决callBack重连之后订阅消息失败的问题

废话不多说,直接上代码 消息接收端:MqttConsumers.java package com.mqtt; import javax.annotation.Resource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.pah...

tm7796的专栏 5381

MQTT通信协议以及使用方法

MQTT的使用方法

AChaoe的博客 1万+

mqtt callback注意事项

mqtt 订阅之后就执行一个callback,而callback 需要实现MqttCallback接口,实现三个方法 public void messageArrived(MqttTopic topic, MqttMessage message)接收订阅的消息后执行的方法。 public void deliveryComplete(MqttDeliveryToken token)接收到已经发布...

qq_35285375的博客 1万+

一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布

一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布

weixin_44749255的博客 1万+

MQTT消息订阅与解析

MQTT消息订阅与解析 通过配置文件创建mqtt客户端 1.1 xml文件中添加mqtt客户端配置项 &lt;!-- mqtt客户端 --&gt; &lt;bean id="clientFactory" class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory"&gt; &lt;propert...

iamapsycho的博客 7794
上一篇: vue ReferenceError PubSub is not defined 解决方案
下一篇: Java图像处理Thumbnails库BUG解决(压缩图片导致分辨率改变)
君杰 no_equal
博客等级 码龄5年 12粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值