【TRAE SOLO 实战案例】自动打印服务实战复盘:从年死机 10 次到 6 万 + 任务零故障,我们踩过的坑与落地体验分享

Trae 自动打印服务实战复盘:从年死机 10 次到 6 万 + 任务零故障,我们踩过的坑与落地体验

做生产制造的同行应该都懂,打印服务看着是不起眼的基础组件,实则是生产线的命门 —— 尤其是产线标签、生产报表这类高频打印场景,打印一卡壳,整条线都得跟着停摆。我们之前用的是基于桌面应用开发的打印服务,用了几年下来,直接成了生产和运维团队的噩梦,2025 年一整年光死机故障就出了 10 次,每次都赶在生产高峰期,车间催单、领导问责,运维半夜被喊起来排查问题是常事。

项目背景:我们被旧系统逼出来的重构决心

旧系统的坑,全是我们实打实踩出来的,每一个痛点都直接影响生产:

  • 性能完全跟不上。单线程队列串行处理任务,一个任务堵了,后面全排队。最夸张的一次,给 5 台打印机各发 100 条打印任务,前前后后等了 4 分钟才全部打完,生产线的强节拍完全被打乱,工人天天反馈等标签耽误产能。

  • 稳定性差到离谱。桌面程序本身系统优先级不高,资源释放管理做得一塌糊涂,跑着跑着就内存泄漏、程序卡死,2025 年的 10 次死机,有 8 次都造成了不同程度的产线停摆。

  • 扩展性几乎为零。面对生产高峰期的高并发打印需求,旧系统完全扛不住,只能硬扛着排队,业务稍微一调整,就得改代码重新部署,灵活性极差。

  • 运维就是纯纯救火。没有集中管理和监控,出问题了只能远程登到服务器上翻本地日志,排查效率极低,有时候一个小问题要找半个多小时,车间的电话都能被打爆。

技术架构:不搞花架子,只选稳定、好用、好运维的方案

痛定思痛后,我们决定重构一套高可用的自动化打印服务系统,也就是 Trae AutoPrintService。选型的核心原则就三个:稳定优先、兼容现有技术栈、运维成本低,不搞花里胡哨的新技术,只选经过行业验证、踩坑少的组件。

最终敲定的技术栈

选这套技术栈,我们也有自己的实际考量:Spring Boot 2.7.15 对 Java8 兼容性极好,团队技术栈匹配度高,开箱即用的特性大幅缩短了开发周期;ActiveMQ 是公司现有中间件,直接复用不用新增运维成本;SQLite 轻量免部署,用来存打印日志查询效率足够,还不用单独搭数据库服务,运维起来特别省心;JACOB 1.19 是对接 BarTender 的核心,经过了大量项目验证,踩坑概率低很多。

系统整体架构

我们做了分层解耦设计,从客户端发起任务到最终打印输出,全链路异步解耦,用下来最大的感受就是,哪一块出问题直接定位到对应模块,不会牵一发而动全身,后续扩展新功能也特别方便。

┌─────────────────────────────────────────────────────────────────┐
│                         客户端应用                               │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│                     消息队列 (ActiveMQ)                          │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│                    AutoPrintService 系统                         │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │  Web 层 (Controllers)                                        │ │
│  │  ├── AuthController - 认证授权                               │ │
│  │  ├── TemplateController - 模板管理                           │ │
│  │  ├── PrintController - 打印服务                               │ │
│  │  ├── LogController - 日志管理                                 │ │
│  │  └── AlertController - 预警管理                               │ │
│  └─────────────────────────────────────────────────────────────┘ │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │  服务层 (Services)                                            │ │
│  │  ├── UserService - 用户管理                                  │ │
│  │  ├── TemplateService - 模板管理                               │ │
│  │  ├── PrintService - 打印服务                                  │ │
│  │  ├── BartenderService - BarTender 集成                        │ │
│  │  ├── PrintLogService - 打印日志                               │ │
│  │  └── AlertService - 预警服务                                  │ │
│  └─────────────────────────────────────────────────────────────┘ │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │  数据访问层 (Repositories)                                    │ │
│  │  ├── UserRepository                                          │ │
│  │  ├── TemplateRepository                                      │ │
│  │  ├── ZPrintLogRepository                                     │ │
│  │  └── ZAlertLogRepository                                     │ │
│  └─────────────────────────────────────────────────────────────┘ │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │  集成层                                                       │ │
│  │  ├── ActiveMQ 集成                                            │ │
│  │  ├── BarTender COM 集成                                        │ │
│  │  └── 企业微信 API 集成                                         │ │
│  └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│                         外部系统                                 │
│  ├── BarTender 打印软件                                          │
│  ├── 企业微信通知                                                │
│  └── SQLite 数据库                                               │
└─────────────────────────────────────────────────────────────────┘

核心功能:全是围着痛点做的,没有多余的花架子

整个系统的功能设计,完全是从生产实际场景出发,上线后跑了 3 个多月,每一个功能都经过了产线的实际检验,说说真实的使用体验:

1. 核心打印服务:彻底解决排队痛点,响应速度质的飞跃

这是整个系统的心脏,也是我们优化最多的地方。通过 ActiveMQ 异步接收打印任务,彻底告别了旧系统同步调用的阻塞问题;支持标签、报表、PDF 多类型模板统一管理,不用再分开维护好几套打印程序;最关键的是和 BarTender 做了深度集成,通过 COM 接口做了池化管理,原来每次打印都要启停实例的卡顿问题直接解决。

还有虚拟打印机功能,生产上需要先预览校验的场景,直接输出为文件,不用浪费纸质标签,车间的同事都说这个功能特别实用,不用再反复试打调整模板。

2. 全链路日志管理:运维再也不用登服务器翻日志了

这是运维团队满意度最高的功能。旧系统出问题,只能登服务器翻本地日志,找半天都定位不到根因;现在所有打印任务的全链路信息,包括请求时间、执行状态、失败原因、打印机信息,全都存在 SQLite 里,Web 管理界面直接按时间、打印机、任务状态筛选查询,几秒钟就能定位问题。

我们还做了日志自动清理功能,按配置自动清理过期日志,不用再担心磁盘被日志占满,完全不用人工干预,省了超多运维琐事。

3. 智能预警机制:从 “事后救火” 变成 “事前预防”

这个功能直接把我们从无休止的救火里解放了出来。之前都是车间反馈打印不了了,我们才知道系统出了问题,往往已经造成了影响;现在连续打印失败超过阈值、系统出现严重错误,都会立刻通过企业微信给运维和对应负责人发告警通知,问题刚冒头就能处理,再也没出现过小问题拖成产线停摆的情况。所有预警信息也都有日志留存,方便后续复盘优化。

4. 系统管理与权限控制:兼顾安全和易用性

基于 JWT 做了完整的认证授权,不同岗位设置不同权限,比如车间管理员只能看对应产线的打印任务,运维能看全量日志和系统配置,从根源上避免了误操作改乱系统配置的问题。Web 管理界面做得很直观,哪怕不是技术人员,也能一眼看懂打印任务的执行状态,不用每次都找开发查数据。同时健康检查接口也对接了公司的监控平台,系统运行状态一目了然。

核心优化:每一个改动,都是被线上问题逼出来的

整个开发和上线过程,我们踩了无数坑,每一个优化都不是为了炫技,都是为了解决实际遇到的问题,落地后效果立竿见影,挑几个核心的跟大家分享:

1. BarTender COM 实例池管理,彻底解决内存泄漏死机

这是最核心的优化,也是旧系统死机的元凶。之前的桌面程序,每次打印都会创建一个 BarTender 应用实例,打印完又不能完全释放资源,跑久了就内存泄漏,最终程序卡死、服务器死机。

我们用对象池模式重构了这一块,按需创建 BarTender 实例,默认最大实例数限制在 15 个,用 AtomicInteger 做原子性的实例总数跟踪,封装了borrowApp()returnApp()方法严格管理实例的生命周期,哪怕打印任务报错,也能确保实例被正确回收。

真实使用体验:上线到现在 3 个多月,跑了 6 万 + 打印任务,服务器内存占用一直稳定在合理区间,再也没出现过因为资源泄漏导致的死机问题,直接解决了我们最大的痛点。

2. 按打印机名分配隔离线程池,告别 “一堵全堵”

旧系统单线程串行的最大问题,就是一台打印机出问题,所有打印机的任务都得等着。我们重构了线程池设计,按打印机名称动态创建独立的线程池,单台打印机默认最大并发数限制在 2 个,用ConcurrentHashMap<String, ExecutorService>做打印机和线程池的映射管理,服务关闭时自动清理所有线程池资源,不会有残留线程占用资源。

真实使用体验:现在每台打印机的打印任务完全隔离,互不影响。哪怕某一台打印机因为网络问题断连,其他打印机的任务照样正常执行,再也不会出现一个任务堵死全公司打印的情况。之前 5 台打印机各 100 条任务要 4 分钟,现在 1 分钟就能全部跑完,效率提升肉眼可见,产线再也没催过打印慢。

3. 细节优化,解决生产环境的各种 “奇葩坑”

除了核心架构,我们还针对生产环境遇到的各种小问题做了优化,别看都是细节,用起来是真的省心:

  • 模板路径处理优化:构建绝对路径,兼容中文路径和不同系统的分隔符,提前做文件存在性检查,不会出现打印到一半才发现模板找不到的问题;

  • JMS 连接池配置优化:启用 ActiveMQ 连接池,调优了最大连接数和超时参数,彻底解决了之前会话和消费者异常关闭导致的消息丢失问题;

  • 线程池参数调优:根据服务器配置和生产实际的并发量,反复测试敲定了核心线程数、最大线程数、队列容量,既保证了并发处理能力,又不会因为线程过多导致服务器资源耗尽。

落地效果:数据说话,更重要的是全链路体验升级

系统 2025 年 12 月 29 日上线,到现在 3 个多月,已经稳定执行了 6 万 + 打印任务,效果远超我们的预期,不只是数据好看,更重要的是生产、运维、开发全链路的体验都有了质的飞跃。

核心性能对比

除了数据上的提升,更直观的是实际工作中的变化:

  • 稳定性拉满:上线至今,没有出现过一次死机、队列阻塞的问题,仅有的 1 条失败记录,是 MES 系统配置错误导致的 “未找到打印机”,和系统本身无关,真正做到了无人值守稳定运行;

  • 生产效率大幅提升:车间再也不用等打印标签,强节拍的生产场景完全能跟上,再也没因为打印问题导致产线停摆,车间的同事再也没找过我们吐槽打印问题;

  • 运维成本直线下降:原来运维要 7*24 小时盯着打印服务,现在有预警提前通知,出问题 Web 界面几秒定位,不用再半夜爬起来登服务器排查问题,运维工作量直接降了 80%;

  • 扩展对接超省心:标准化的 API 接口,现在其他业务系统要对接打印功能,只需要简单调用接口就行,不用再单独开发打印模块,已经有 3 个部门的业务系统完成了对接,都反馈集成成本极低,特别好用。

推广价值与后续规划

这个系统不是为了做一个技术 demo,而是完全从生产实际痛点出发打磨出来的,落地后也验证了它的价值,不管是公司内部推广,还是给同行业的朋友做参考,都有很强的实用性。

对内来说,它已经能覆盖公司内所有的自动打印需求,不管是生产标签、质检报表、财务票据,都能统一管理,不用再各个部门各自为战,搞一堆不好用的桌面打印程序,既提高了效率,又降低了整体的运维成本。标准化的 API 设计,和公司现有 MES、ERP、帆软报表系统都能无缝对接,集成成本极低。

对外来说,这套架构的扩展性很强,制造业、物流、零售等需要大量批量打印的行业,都能复用这套方案,只需要根据业务场景微调模板和对接方式,就能快速落地。

后续我们也有一些规划,核心还是围绕着 “更好用、更省心” 来做:

  • 继续优化系统性能,针对更高并发的打印场景做调优,支持更多类型的打印机和打印协议;

  • 完善监控和预警能力,结合历史打印数据,做故障预测,提前规避潜在问题;

  • 探索云化部署方案,支持异地工厂、分支机构的统一打印管理;

  • 对接更多的业务系统,把打印服务做成公司内部的标准化基础服务。

写在最后

这次打印服务的重构,我们没有用到什么高大上的新技术,核心就是盯着生产里的每一个痛点,一个个踩坑、一个个解决。企业级的基础服务,从来不是技术越牛越好,稳定、好用、能真正解决问题,才是最核心的。

从上线前的天天救火,到现在 6 万 + 任务零故障稳跑,我们最深的感受就是,再小的基础组件,只要能真正解决业务痛点,就能创造实实在在的价值。也希望我们的这点实战经验,能给遇到同样打印痛点的同行们避避坑,少走点我们走过的弯路。

2 个赞

欢迎大家在评论区交流探讨!!有没有制造企业的程序员或者管理者?可以交流一下你们公司的实现方案

1 个赞

看起来很厉害

3 个赞

果然Trae Solo 一把梭啊,厉害了 :fu: ,爆赞!:grinning_face:

3 个赞

张老师过奖了

1 个赞

又发了个AI生成的文档

1 个赞

这是常州Trae友干货贴 :smiley:

1 个赞

打印模板是怎么处理的?可以自定义模板吗?

1 个赞

BarTender软件了解一下

1 个赞