当前位置: 首页 > news >正文

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

介绍

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

解决办法

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

Redis消息队列实现


    @Resource
    private JedisPool jedisPool;
    @Resource
    @Qualifier("taskExecutor")
    private Executor taskExecutor;

    @Override
    public void publishMessage(String channel, String message) {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.publish(channel, message);
        }catch (Exception e){
            e.printStackTrace();
            log.error("发布消息异常!" + e);

        }
    }
    // 实现订阅方法
    @Override
    public void subscribeToChannel(String channel, MessageListener listener) {
        taskExecutor.execute(() -> {
            try (Jedis jedis = jedisPool.getResource()) {
                JedisPubSub pubSub = new JedisPubSub() {
                    @Override
                    public 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 {
    // ... 其他代码 ...

    @Override
    public 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.dtcms.com/a/40779.html

相关文章:

  • javaweb文件上传:@MultipartConfig注解与Apache Commons FileUpload对比
  • 建筑兔零基础自学python记录32|学过的函数代码记录19-25
  • 判断一个文件中以三个#号开头有多少行的shell脚本怎么写
  • C语言(15)-------------->一维数组
  • Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制
  • 【音视频】编解码相关概念总结
  • 什么是Ollama?什么是GGUF?二者之间有什么关系?
  • gRPG协议
  • 【已解决】JupyterLab:如何在JupyterLab中切换内核
  • 【Linux网络】数据链路层 其他常见的协议
  • 运算放大器噪声
  • nz-upload 手动上传 PDF预览
  • 树莓派简单操作系统制作之四:关于异常等级
  • 51c嵌入式~电路~合集13
  • 深度学习-135-LangGraph之应用实例(四)构建RAG问答系统同时对文档进行元数据增强
  • 游戏开发微信小程序--工具箱之父
  • 基于javaweb的SSM+Maven鲜花商城管理系统设计和实现(源码+文档+部署讲解)
  • Qt for Android下QMessageBox背景黑色、文字点击闪烁
  • 深入探讨Ceph:分布式存储架构的未来
  • 类和对象——拷贝对象时的一些编译器优化
  • AI绘画软件Stable Diffusion详解教程(3):Windows系统本地化部署操作方法(通用版)
  • Mybatis的分页插件
  • 视频级虚拟试衣技术在淘宝的产品化实践
  • 【Linux基础】Linux下的C编程指南
  • HAL库之是stm32cubemx安装
  • 定义数组存储3部汽车对象(class1)
  • 解决“ReadTimeoutError:HTTPSConnectionPool”pip安装超时问题
  • win11编译pytorch cuda128版本流程
  • wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立
  • 笔记:大模型Tokens是啥?为啥大模型按Tokens收费?