串口解析的服务器流程优化

ops/2025/3/1 5:49:52/

介绍

笔者项目中使用purejavacomm实现串口通信,purejavacomm自带线程池以实现COM口的监听,但是当后续数据处理流程过长,线程占用时间过长,会导致监听阻塞,会导致粘包出现。

解决办法

笔者项目中使用redis来做缓存,也就顺便用redis做了消息队列,以实现purejavacomm线程池线程的快速归还,然后再用自定义更大的线程池来实现串口数据的处理。

Redis消息队列实现

@Resourceprivate JedisPool jedisPool;@Resource@Qualifier("taskExecutor")private Executor taskExecutor;@Overridepublic void publishMessage(String channel, String message) {try (Jedis jedis = jedisPool.getResource()) {jedis.publish(channel, message);}catch (Exception e){e.printStackTrace();log.error("发布消息异常!" + e);}}// 实现订阅方法@Overridepublic void subscribeToChannel(String channel, MessageListener listener) {taskExecutor.execute(() -> {try (Jedis jedis = jedisPool.getResource()) {JedisPubSub pubSub = new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {listener.onMessage(channel, message);}};jedis.subscribe(pubSub, channel);} catch (Exception e) {e.printStackTrace();}});}

串口数据解析

CommandLineRunner 是一个非常有用的接口,特别适合在应用启动时执行初始化或监听任务。在代码中,它被用来启动 Redis 消息监听器,确保应用启动后能够立即开始处理来自 Redis 的消息。

@Component
@Slf4j
public class DataHandler implements CommandLineRunner {// ... 其他代码 ...@Overridepublic void run(String... args) throws Exception {log.info("DataHandler 启动成功!开始监听消息");redisService.subscribeToChannel(REDIS_QUEUE_NAME, (channel, message) -> {log.info("DataHandler 收到消息:{}", message);try {String[] split = message.split(":");if (split.length == 2) {String comNum = split[0];byte[] readBuffer = ByteUtil.hexToByteArray(split[1], false);dataHandle(readBuffer, comNum);}} catch (Exception e) {e.printStackTrace();log.error("DataHandler 处理消息出错:{}", e.getMessage());}});}
}

http://www.ppmy.cn/ops/162148.html

相关文章

SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能,PageHelper是一个非常流行的MyBatis分页插件,它支持多数据库分页,无需修改SQL语句即可实现分页功能。 本文在最后展示了两种依赖验证的结果。 文章目录 一、第一种依赖方式二、第二种依赖方式三、创建数…

学习Chrome浏览器插件开发的系统路线规划 入门、实战和持续提升 逐步掌握核心技能

以下是学习Chrome浏览器插件开发的系统路线规划,分为基础入门、进阶实战和持续提升三个阶段,帮助你逐步掌握核心技能: 第一阶段:基础入门(1-2周) 1. 理解浏览器插件的基本概念 官方文档:通读C…

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制,支持多播的可持久化的消息队列,用户实现发布订阅的功能,借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key:St…

IOS基础面试题

1. 什么是MVC? MVC(Model-View-Controller)是一种常见的设计模式,用于组织代码 Model(模型): 代表数据层,处理数据的逻辑。View(视图): 负责展示…

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…

AI“势头超猛”: 深圳走出怎样的步伐?

何为“耐心资本”? 就是引导资本做“时间的朋友”,不受短期市场波动的干扰,陪伴硬科技、科学家与创业者“长跑”。对于战略性新兴产业而言,早期的发展都离不开大量的资金投入,用来维持持续的创新和研发工作。 在今年两…

SpringBoot整合SpringSecurity、MyBatis-Plus综合实例:认证、授权

Spring Security 安全框架,系列文章: 《SpringSecurity创建一个简单的自定义表单的认证应用》 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity实现自定义用户认证方案》 《SpringSecurity密码编码器:使用BCrypt算法加密、自定义密码编码器》 《SpringSecur…

Linux:Shell环境变量与命令行参数

目录 Shell的变量功能 什么是变量 变数的可变性与方便性 影响bash环境操作的变量 脚本程序设计(shell script)的好帮手 变量的使用:echo 变量的使用:HOME 环境变量相关命令 获取环境变量 环境变量和本地变量 命令行…