设计模式-命令模式实战之WCS核心控制重构(四)

本文探讨了在设计模式中的命令模式如何应用于WCS核心控制重构。内容包括调度器和队列的规划,如堆垛机监控、工作线程监控和任务读取的全局与局部调度分析,以及命令抽象、具体命令类、硬件对象实现和调用类的详细设计。在问题思考部分,讨论了多硬件配合任务和控制记录的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

基于前面三篇文章背景、分析、设计、实现的铺垫,接下来基于命令行模式对之前的实现进行重构,以及重构过程中需要考虑的问题进行重点分析。

实现原则分析

实现的业务流程是固定,不需要有变化;需要变化的是代码结构,从SOLID原则出发,考虑问题,梳理代码结构,模块关系,数据聚合逻辑。下面是需要关注的问题点:

  1. 做全局调度还是做局部调度(每个堆垛机有一个自己的调度器)
  2. 队列是放在放在全局调度中心,还是放在堆垛机的实现中

调度器规划

涉及到调度的任务有:堆垛机的监控工作线程的监控任务的读取;这三项任务看似是 全局的,有的也可以拆分到具体的堆垛机控制实现中。在上一篇文章的实现中是放在全局进行的,伪代码如下:

scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                // 检查堆垛机状态,具体实现参考上一篇文章
                // 启动工作线程
                // 检查工作线程状态,具体实现参考上一篇文章
				// 读取任务
            }
        }, 0, 500, TimeUnit.MILLISECONDS);
    }

可以看到,在全局有一个调度线程池,每隔500毫秒,会全部调度一次。
简单对优缺点进行分析

- 堆垛机监控 工作线程监控 任务的读取
全局 方便管理,感知异常后可以迅速控制任务的下发 可以保证只要程序正常就可以完成监控工作 任务放在全局,需要对任务读取,然后识别分配放在内存进行
局部 放在局部,通过健康命令来实现;符合全局结构,易扩展 不适合放在局部,局部进行自监控需要保障局部线程正常 任务读取如果放在局部需要再全局增加任务分发队列

综合分析下的实现方案:
堆垛机监控: 同步健康命令实现,相当于在全局出发命令生成,在工作线程执行。
工作线程的监控: 放在全局实现,便于保活(发现挂掉,及时拉起)
任务读取: 在全局从数据库读取,并转为命令

队列规划

对于硬件来说一次只能执行一个命令,也就是说命令是串行执行的;这很符合队列结构解决问题的场景。对于硬件的控制来说,软件和硬件都是单独线程进行的。

- 全局 局部
队列 如果放在全局,需要Map结构维护数据关系;全局读取任务后转为命令可以直接入队列;对于判断硬件的任务状态等数据治理更方便 放在局部可以在局部形成闭环,监听,读取,执行,反馈直接在局部实现。

综合分析的实现方案:
队列属于控制命令流,硬件执行命令的关键通道。从软件架构原则上来说,放在局部堆垛机内更加合适。

问题思考

1.一个任务需要多个硬件配合完成,意味一个任务会生成多个命令,这种场景怎么解决?
2. 对机器控制的记录怎么处理?

WCS控制实现

先看一下实现的类结构:
在这里插入图片描述

详细实现

接下来基于命令行模式的情景下 ,对整个实现进行简单的描述。

命令抽象

在前面背景的描述基础下,需要对命令进行抽象;命令的其实是和机器的每个动作是对应的。这样就需要对机器的每个动作进行抽象出共性部分,结合软件实现要求,命令抽象如下:

public interface Command {
   
    public int cmdType();
    public String cmdName();
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五之

真实案例以及商业项目技术

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值