Java: Mediator Pattern

项目结构:

image

 

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:53
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelBusinessMessageDto.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.dto;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 珠宝业务消息传输DTO
 * 承载中介传递的业务消息数据,对应C# JewelBusinessMessageDto
 */
public class JewelBusinessMessageDto implements Serializable {
    /**
     * 业务唯一标识
     */
    private UUID businessId;
    /**
     * 业务流程当前状态
     */
    private int flowState;
    /**
     * 消息内容描述
     */
    private String messageContent;
    /**
     * 目标部门编号,0代表广播全部部门
     */
    private int targetDepartmentCode;
    /**
     * 消息发生时间
     */
    private LocalDateTime occurTime;
    /**
     * 异常备注,存放异常堆栈文本
     */
    private String remark;

    public JewelBusinessMessageDto() {
    }

    public UUID getBusinessId() {
        return businessId;
    }

    public void setBusinessId(UUID businessId) {
        this.businessId = businessId;
    }

    public int getFlowState() {
        return flowState;
    }

    public void setFlowState(int flowState) {
        this.flowState = flowState;
    }

    public String getMessageContent() {
        return messageContent;
    }

    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }

    public int getTargetDepartmentCode() {
        return targetDepartmentCode;
    }

    public void setTargetDepartmentCode(int targetDepartmentCode) {
        this.targetDepartmentCode = targetDepartmentCode;
    }

    public LocalDateTime getOccurTime() {
        return occurTime;
    }

    public void setOccurTime(LocalDateTime occurTime) {
        this.occurTime = occurTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:54
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessFlowState.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.enums;

/**
 * 珠宝业务流程状态枚举
 * 流转顺序:采购核验→设计制图→加工生产→质检→包装→物流→销售完成
 */
public enum BusinessFlowState {
    /**
     * 原料采购核验
     */
    PURCHASE(1, "原料采购核验"),
    /**
     * 设计制图
     */
    DESIGN(2, "设计制图"),
    /**
     * 加工生产
     */
    MANUFACTURE(3, "加工生产"),
    /**
     * 质检
     */
    QUALITY_INSPECT(4, "质检"),
    /**
     * 包装
     */
    PACKAGE(5, "包装"),
    /**
     * 物流发货
     */
    LOGISTICS(6, "物流发货"),
    /**
     * 业务销售完成
     */
    SALE_COMPLETE(7, "销售完成");

    private final int code;
    private final String desc;

    BusinessFlowState(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:54
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : CircuitBreakerState.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.enums;

/**
 * 熔断器状态枚举,对应C# CircuitBreakerState
 */
public enum CircuitBreakerState {
    /**
     * 闭合状态,允许请求通行
     */
    CLOSED,
    /**
     * 打开熔断状态,直接拒绝请求
     */
    OPEN,
    /**
     * 半开状态,放行少量探测请求
     */
    HALF_OPEN
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:54
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessFlowException.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.exceptions;

/**
 * 业务流程自定义异常,业务校验、非法状态跳转抛出
 */
public class BusinessFlowException extends RuntimeException {

    /**
     * 业务错误码
     */
    private final int errorCode;

    public BusinessFlowException(String message) {
        super(message);
        this.errorCode = 5000;
    }

    public BusinessFlowException(int errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    public BusinessFlowException(int errorCode, String message, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:54
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IBusinessColleague.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.interfaces;

import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 中介模式:同事接口,各个业务部门实现该接口
 */
public interface IBusinessColleague {
    /**
     * 获取绑定部门编码
     * @return 部门数字编码
     */
    int getDepartmentCode();

    /**
     * 设置中介者实例
     * @param mediator 中介对象
     */
    void setMediator(IJewelMediator mediator);

    /**
     * 接收中介转发业务消息
     * @param messageDto 业务消息DTO
     */
    void receiveMessage(JewelBusinessMessageDto messageDto);
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:55
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IJewelMediator.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.interfaces;

import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 珠宝业务中介者顶层接口
 * 负责消息分发:广播消息 / 定向发送指定部门
 */
public interface IJewelMediator {
    /**
     * 注册业务同事(部门处理器)
     * @param colleague 部门实现
     */
    void registerColleague(IBusinessColleague colleague);

    /**
     * 发送消息,根据DTO内targetDepartmentCode选择广播/定向路由
     * @param dto 业务消息对象
     */
    void send(JewelBusinessMessageDto dto);
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:55
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IMessageRepository.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.interfaces;

import MediatorPattern.core.dto.JewelBusinessMessageDto;

import java.util.List;
import java.util.UUID;

/**
 * 消息仓储接口,持久化业务消息记录
 */
public interface IMessageRepository {
    /**
     * 保存业务消息
     * @param dto 消息DTO
     */
    void save(JewelBusinessMessageDto dto);

    /**
     * 根据业务Id查询全部消息
     * @param businessId 业务ID
     * @return 消息集合
     */
    List<JewelBusinessMessageDto> findByBusinessId(UUID businessId);

    /**
     * 查询全部消息
     * @return 全部消息列表
     */
    List<JewelBusinessMessageDto> findAll();

    /**
     * 删除指定业务全部消息
     * @param businessId 业务ID
     */
    void deleteByBusinessId(UUID businessId);
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:55
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IResiliencePolicy.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.interfaces;

import MediatorPattern.core.enums.CircuitBreakerState;

import java.util.function.Supplier;

/**
 * 弹性策略接口:重试、熔断
 */
public interface IResiliencePolicy {
    /**
     * 获取熔断器当前状态
     * @return 熔断器状态枚举
     */
    CircuitBreakerState getCircuitState();

    /**
     * 执行带熔断+重试保护逻辑
     * @param supplier 业务执行逻辑
     * @return 业务返回结果
     * @param <T> 返回泛型
     * @throws Exception 执行异常
     */
    <T> T executeWithPolicy(Supplier<T> supplier) throws Exception;
}



/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:55
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IRetryMessageQueue.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.interfaces;

import MediatorPattern.core.dto.JewelBusinessMessageDto;

import java.util.List;

/**
 * 重试消息队列接口
 */
public interface IRetryMessageQueue {
    /**
     * 入队待重试消息
     * @param dto 业务消息
     * @param retryCount 当前重试计数
     */
    void enqueue(JewelBusinessMessageDto dto, int retryCount);

    /**
     * 获取待处理队列消息,非阻塞取出
     * @param batchSize 批次大小
     * @return 待处理消息集合
     */
    List<JewelBusinessMessageDto> dequeuePending(int batchSize);

    /**
     * 获取队列当前长度
     * @return 队列数量
     */
    int getQueueSize();

    /**
     * 清空全部重试队列
     */
    void clear();
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ResiliencePolicyOptions.java
 * explain   : 学习  类
 **/

package MediatorPattern.core.options;

/**
 * 弹性策略配置项,对应C# ResiliencePolicyOptions
 */
public class ResiliencePolicyOptions {
    /**
     * 最大重试次数
     */
    private int maxRetryTimes;
    /**
     * 熔断失败阈值,连续失败多少次打开熔断器
     */
    private int circuitBreakerFailThreshold;
    /**
     * 熔断半开等待毫秒
     */
    private long circuitBreakerWaitHalfOpenMs;
    /**
     * 重试休眠间隔毫秒
     */
    private long retrySleepMs;

    public ResiliencePolicyOptions() {
    }

    public int getMaxRetryTimes() {
        return maxRetryTimes;
    }

    public void setMaxRetryTimes(int maxRetryTimes) {
        this.maxRetryTimes = maxRetryTimes;
    }

    public int getCircuitBreakerFailThreshold() {
        return circuitBreakerFailThreshold;
    }

    public void setCircuitBreakerFailThreshold(int circuitBreakerFailThreshold) {
        this.circuitBreakerFailThreshold = circuitBreakerFailThreshold;
    }

    public long getCircuitBreakerWaitHalfOpenMs() {
        return circuitBreakerWaitHalfOpenMs;
    }

    public void setCircuitBreakerWaitHalfOpenMs(long circuitBreakerWaitHalfOpenMs) {
        this.circuitBreakerWaitHalfOpenMs = circuitBreakerWaitHalfOpenMs;
    }

    public long getRetrySleepMs() {
        return retrySleepMs;
    }

    public void setRetrySleepMs(long retrySleepMs) {
        this.retrySleepMs = retrySleepMs;
    }
}

 

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 业务部门
 * 销售接单、客户对接、订单跟进、客诉处理
 */
public class BusinessDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 9;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[业务部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : DesignDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 设计制图部门
 */
public class DesignDepartment extends BaseBusinessColleague {
    @Override
    public int getDepartmentCode() {
        return 2;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[设计制图部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : FinanceDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 财务部门
 * 原料结算、成本核算、订单收款、票据对账
 */
public class FinanceDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 7;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[财务部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : HrAdminDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 人事行政部门
 * 人员管理、考勤、后勤行政、制度管理
 */
public class HrAdminDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 10;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[人事行政部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ItDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * IT部门
 * 系统运维、数据维护、软硬件故障处理
 */
public class ItDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 11;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[IT部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogisticsDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 物流部门
 * 珠宝货品安保发货、在途跟踪、出入库交接
 */
public class LogisticsDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 6;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[物流部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ManufactureDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 加工生产部门
 * 负责珠宝毛坯加工、镶嵌、打磨工序处理
 */
public class ManufactureDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 3;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[加工生产部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:58
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MarketingDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 营销推广部门
 * 新品宣传、活动策划、品牌推广、流量运营
 */
public class MarketingDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 8;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[营销推广部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PackageDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 包装部门
 * 珠宝首饰礼盒包装、证书封装、防伪标签粘贴
 */
public class PackageDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 5;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[包装部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:56
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PurchaseDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 原料采购核验部门
 */
public class PurchaseDepartment extends BaseBusinessColleague {
    @Override
    public int getDepartmentCode() {
        return 1;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[采购核验部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:57
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : QualityInspectDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 质检部门
 * 珠宝成品品质检验、宝石核验、瑕疵检测
 */
public class QualityInspectDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 4;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[质检部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : TrainingDepartment.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.businessdepartments;

import MediatorPattern.application.mediator.BaseBusinessColleague;
import MediatorPattern.core.dto.JewelBusinessMessageDto;

/**
 * 培训部门
 * 员工技能培训、珠宝专业知识培训、岗位实训
 */
public class TrainingDepartment extends BaseBusinessColleague {

    @Override
    public int getDepartmentCode() {
        return 12;
    }

    @Override
    public void receiveMessage(JewelBusinessMessageDto messageDto) {
        System.out.printf("[培训部门] 收到业务消息 BusinessId:%s,内容:%s%n",
                messageDto.getBusinessId(), messageDto.getMessageContent());
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : DepartmentFactory.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.factory;

import MediatorPattern.application.businessdepartments.*;
import MediatorPattern.core.interfaces.IBusinessColleague;

import java.util.ArrayList;
import java.util.List;

/**
 * 部门工厂类,批量创建全部12个业务部门实例
 */
public class DepartmentFactory {

    /**
     * 创建全部12个部门实例集合
     * @return 全部部门处理器列表
     */
    public static List<IBusinessColleague> createAllDepartments(){
        List<IBusinessColleague> list = new ArrayList<>();
        list.add(new PurchaseDepartment());
        list.add(new DesignDepartment());
        list.add(new ManufactureDepartment());
        list.add(new QualityInspectDepartment());
        list.add(new PackageDepartment());
        list.add(new LogisticsDepartment());
        list.add(new FinanceDepartment());
        list.add(new MarketingDepartment());
        list.add(new BusinessDepartment());
        list.add(new HrAdminDepartment());
        list.add(new ItDepartment());
        list.add(new TrainingDepartment());
        return list;
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BaseBusinessColleague.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.mediator;
import MediatorPattern.core.dto.JewelBusinessMessageDto;
import MediatorPattern.core.interfaces.IBusinessColleague;
import MediatorPattern.core.interfaces.IJewelMediator;

/**
 * 业务同事抽象基类,所有部门处理器继承此类
 */
public abstract class BaseBusinessColleague implements IBusinessColleague {
    protected IJewelMediator mediator;

    /**
     * 部门编码,子类实现返回对应编码
     * @return int
     */
    @Override
    public abstract int getDepartmentCode();

    @Override
    public void setMediator(IJewelMediator mediator) {
        this.mediator = mediator;
    }

    /**
     * 接收消息抽象方法,各部门实现业务处理逻辑
     * @param messageDto 消息DTO
     */
    @Override
    public abstract void receiveMessage(JewelBusinessMessageDto messageDto);
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 22:59
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelBusinessMediator.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.mediator;

import MediatorPattern.core.dto.JewelBusinessMessageDto;
import MediatorPattern.core.interfaces.IBusinessColleague;
import MediatorPattern.core.interfaces.IJewelMediator;

import java.util.ArrayList;
import java.util.List;

/**
 * 珠宝业务中介实现,完成消息广播、定向路由
 */
public class JewelBusinessMediator implements IJewelMediator {
    private final List<IBusinessColleague> colleagueList;

    public JewelBusinessMediator() {
        colleagueList = new ArrayList<>();
    }

    @Override
    public void registerColleague(IBusinessColleague colleague) {
        if (!colleagueList.contains(colleague)) {
            colleagueList.add(colleague);
        }
    }

    @Override
    public void send(JewelBusinessMessageDto dto) {
        int targetCode = dto.getTargetDepartmentCode();
        if(targetCode == 0){
            //广播全部部门
            for (IBusinessColleague c : colleagueList) {
                c.receiveMessage(dto);
            }
        }else{
            //定向发送指定部门
            for (IBusinessColleague c : colleagueList) {
                if(c.getDepartmentCode() == targetCode){
                    c.receiveMessage(dto);
                }
            }
        }
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:00
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelFlowScheduler.java
 * explain   : 学习  类
 **/

package MediatorPattern.application.scheduler;

import MediatorPattern.core.dto.JewelBusinessMessageDto;
import MediatorPattern.core.interfaces.IJewelMediator;
import MediatorPattern.core.interfaces.IRetryMessageQueue;

import java.time.LocalDateTime;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 珠宝业务流程调度器
 * 虚拟线程调度,后台轮询重试队列,驱动业务流转
 */
public class JewelFlowScheduler {
    private final IJewelMediator mediator;
    private final IRetryMessageQueue retryQueue;
    private ScheduledExecutorService schedulerService;
    private volatile boolean running;

    public JewelFlowScheduler(IJewelMediator mediator, IRetryMessageQueue retryQueue) {
        this.mediator = mediator;
        this.retryQueue = retryQueue;
    }

    /**
     * 启动调度器,后台定时轮询重试队列
     */
    public void start(){
        running = true;
        //JDK21 虚拟线程调度池
        schedulerService = Executors.newScheduledThreadPool(1, Thread.ofVirtual().factory());
        schedulerService.scheduleAtFixedRate(this::pollRetryQueue, 0, 3, TimeUnit.SECONDS);
    }

    /**
     * 停止调度任务
     */
    public void stop(){
        running = false;
        if(schedulerService != null){
            schedulerService.shutdown();
        }
    }

    /**
     * 轮询重试队列,取出消息重新交给中介分发
     */
    private void pollRetryQueue(){
        if(!running){
            return;
        }
        try {
            var pendingList = retryQueue.dequeuePending(10);
            for(JewelBusinessMessageDto dto : pendingList){
                dto.setOccurTime(LocalDateTime.now());
                mediator.send(dto);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

    /**
     * 提交业务消息进入调度流程
     * @param businessId 业务ID
     * @param targetDeptCode 目标部门编码,0广播
     * @param content 消息内容
     */
    public void submitBusinessMessage(UUID businessId, int targetDeptCode, String content){
        JewelBusinessMessageDto dto = new JewelBusinessMessageDto();
        dto.setBusinessId(businessId);
        dto.setTargetDepartmentCode(targetDeptCode);
        dto.setMessageContent(content);
        dto.setOccurTime(LocalDateTime.now());
        mediator.send(dto);
    }
}

  

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:00
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ConcurrentRequestLimiter.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.concurrency;

import java.util.concurrent.Semaphore;

/**
 * 并发请求限流器,信号量实现高并发控制,线程安全
 */
public class ConcurrentRequestLimiter {
    private final Semaphore semaphore;

    /**
     * @param maxConcurrent 最大允许并发数量
     */
    public ConcurrentRequestLimiter(int maxConcurrent) {
        semaphore = new Semaphore(maxConcurrent);
    }

    /**
     * 获取许可,阻塞直到拿到许可
     * @throws InterruptedException 中断异常
     */
    public void acquire() throws InterruptedException {
        semaphore.acquire();
    }

    /**
     * 释放许可
     */
    public void release(){
        semaphore.release();
    }

    /**
     * 当前可用许可数量
     * @return int
     */
    public int availablePermits(){
        return semaphore.availablePermits();
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:01
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LoggingConfigurator.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.logging;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.logging.*;

/**
 * 日志配置器:按日期创建文件夹,按日志等级分文件;控制台+文件双输出
 * Logs/yyyy-MM-dd/app-info.log、app-error.log、app-warn.log、app-debug.log
 */
public class LoggingConfigurator {

    /**
     * 初始化日志系统
     */
    public static void configure(){
        Logger rootLogger = Logger.getLogger("");
        rootLogger.setUseParentHandlers(false);
        for(Handler h : rootLogger.getHandlers()){
            rootLogger.removeHandler(h);
        }

        LocalDate today = LocalDate.now();
        String dateFolderName = today.format(DateTimeFormatter.ISO_LOCAL_DATE);
        File logBaseDir = Paths.get("Logs", dateFolderName).toFile();
        if(!logBaseDir.exists()){
            logBaseDir.mkdirs();
        }

        UniformLogFormatter logFormatter = new UniformLogFormatter();

        //控制台输出
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(logFormatter);
        consoleHandler.setLevel(Level.ALL);
        rootLogger.addHandler(consoleHandler);

        try {
            //INFO日志文件
            FileHandler infoHandler = new FileHandler(new File(logBaseDir,"app-info.log").getAbsolutePath(), true);
            infoHandler.setFormatter(logFormatter);
            infoHandler.setLevel(Level.INFO);
            rootLogger.addHandler(infoHandler);

            //WARN日志文件
            FileHandler warnHandler = new FileHandler(new File(logBaseDir,"app-warn.log").getAbsolutePath(), true);
            warnHandler.setFormatter(logFormatter);
            warnHandler.setLevel(Level.WARNING);
            rootLogger.addHandler(warnHandler);

            //ERROR日志文件
            FileHandler errorHandler = new FileHandler(new File(logBaseDir,"app-error.log").getAbsolutePath(), true);
            errorHandler.setFormatter(logFormatter);
            errorHandler.setLevel(Level.SEVERE);
            rootLogger.addHandler(errorHandler);

            //DEBUG日志文件
            FileHandler debugHandler = new FileHandler(new File(logBaseDir,"app-debug.log").getAbsolutePath(), true);
            debugHandler.setFormatter(logFormatter);
            debugHandler.setLevel(Level.FINE);
            rootLogger.addHandler(debugHandler);
        } catch (IOException e) {
            e.printStackTrace();
        }
        rootLogger.setLevel(Level.ALL);
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:01
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : UniformLogFormatter.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.logging;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

/**
 * 统一日志格式化器,控制台与文件输出格式保持完全一致
 */
public class UniformLogFormatter extends Formatter {
    private static final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    @Override
    public String format(LogRecord record) {
        LocalDateTime dt = LocalDateTime.now();
        StringBuilder sb = new StringBuilder();
        sb.append(dt.format(dtFormatter));
        sb.append(" [").append(record.getLevel()).append("] ");
        sb.append("Thread:").append(Thread.currentThread().getName()).append(" ");
        sb.append(record.getSourceClassName()).append("#").append(record.getSourceMethodName());
        sb.append(" | ").append(formatMessage(record));
        sb.append(System.lineSeparator());
        if(record.getThrown() != null){
            Throwable t = record.getThrown();
            sb.append(t.getMessage()).append(System.lineSeparator());
            for(StackTraceElement ste : t.getStackTrace()){
                sb.append("\t").append(ste.toString()).append(System.lineSeparator());
            }
        }
        return sb.toString();
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:01
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : InMemoryMessageRepository.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.repository;
import MediatorPattern.core.dto.JewelBusinessMessageDto;
import MediatorPattern.core.interfaces.IMessageRepository;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 内存版消息仓储实现,线程安全,ConcurrentHashMap存储
 */
public class InMemoryMessageRepository implements IMessageRepository {
    private final ConcurrentHashMap<UUID, List<JewelBusinessMessageDto>> store;

    public InMemoryMessageRepository() {
        store = new ConcurrentHashMap<>();
    }

    @Override
    public void save(JewelBusinessMessageDto dto) {
        UUID bid = dto.getBusinessId();
        store.computeIfAbsent(bid, k -> new ArrayList<>()).add(dto);
    }

    @Override
    public List<JewelBusinessMessageDto> findByBusinessId(UUID businessId) {
        return store.getOrDefault(businessId, new ArrayList<>());
    }

    @Override
    public List<JewelBusinessMessageDto> findAll() {
        List<JewelBusinessMessageDto> all = new ArrayList<>();
        store.values().forEach(all::addAll);
        return all;
    }

    @Override
    public void deleteByBusinessId(UUID businessId) {
        store.remove(businessId);
    }
}

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:01
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ResiliencePolicy.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.resilience;

import MediatorPattern.core.enums.CircuitBreakerState;
import MediatorPattern.core.interfaces.IResiliencePolicy;
import MediatorPattern.core.options.ResiliencePolicyOptions;

import java.util.function.Supplier;

/**
 * 弹性策略实现:重试+熔断器,线程安全
 */
public class ResiliencePolicy implements IResiliencePolicy {
    private final ResiliencePolicyOptions options;
    private volatile CircuitBreakerState circuitState;
    private volatile int failCounter;
    private volatile long halfOpenTriggerTime;

    public ResiliencePolicy(ResiliencePolicyOptions options) {
        this.options = options;
        this.circuitState = CircuitBreakerState.CLOSED;
        this.failCounter = 0;
    }

    @Override
    public CircuitBreakerState getCircuitState() {
        return circuitState;
    }

    @Override
    public <T> T executeWithPolicy(Supplier<T> supplier) throws Exception {
        int attempt = 0;
        while(true){
            checkCircuit();
            try {
                T result = supplier.get();
                onSuccess();
                return result;
            }catch (Throwable ex){
                attempt++;
                onFail();
                if(attempt > options.getMaxRetryTimes()){
                    throw new Exception("执行失败,达到最大重试次数", ex);
                }
                Thread.sleep(options.getRetrySleepMs());
            }
        }
    }

    private void checkCircuit(){
        long now = System.currentTimeMillis();
        if(circuitState == CircuitBreakerState.OPEN){
            if(now >= halfOpenTriggerTime){
                circuitState = CircuitBreakerState.HALF_OPEN;
            }
        }
    }

    private void onSuccess(){
        failCounter = 0;
        if(circuitState == CircuitBreakerState.HALF_OPEN){
            circuitState = CircuitBreakerState.CLOSED;
        }
    }

    private void onFail(){
        failCounter++;
        if(circuitState == CircuitBreakerState.CLOSED && failCounter >= options.getCircuitBreakerFailThreshold()){
            circuitState = CircuitBreakerState.OPEN;
            halfOpenTriggerTime = System.currentTimeMillis() + options.getCircuitBreakerWaitHalfOpenMs();
        }
    }
}


/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 21
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/9/6 - 23:02
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : InMemoryRetryMessageQueue.java
 * explain   : 学习  类
 **/

package MediatorPattern.infrastructure.retryqueue;

import MediatorPattern.core.dto.JewelBusinessMessageDto;
import MediatorPattern.core.interfaces.IRetryMessageQueue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 内存重试队列实现,线程安全,LinkedBlockingQueue
 */
public class InMemoryRetryMessageQueue implements IRetryMessageQueue {
    private final BlockingQueue<JewelBusinessMessageDto> queue;

    public InMemoryRetryMessageQueue() {
        queue = new LinkedBlockingQueue<>();
    }

    @Override
    public void enqueue(JewelBusinessMessageDto dto, int retryCount) {
        dto.setRemark(dto.getRemark() + "|retry:" + retryCount);
        queue.offer(dto);
    }

    @Override
    public List<JewelBusinessMessageDto> dequeuePending(int batchSize) {
        List<JewelBusinessMessageDto> list = new ArrayList<>();
        for(int i=0;i<batchSize;i++){
            JewelBusinessMessageDto item = queue.poll();
            if(item == null){
                break;
            }
            list.add(item);
        }
        return list;
    }

    @Override
    public int getQueueSize() {
        return queue.size();
    }

    @Override
    public void clear() {
        queue.clear();
    }
}

  

调用:

/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:中介者行为模式 Mediator Pattern 行为模式 Behavioral Patterns
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/5 - 11:06
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MediatorBll.java
 * explain   : 学习  类
 **/

package BLL;

import MediatorPattern.application.scheduler.JewelFlowScheduler;
import MediatorPattern.extensions.ServiceCollectionExtensions;
import MediatorPattern.infrastructure.logging.LoggingConfigurator;

import java.util.UUID;

public class MediatorBll {


    public void demo(){
        //初始化日志系统,按日期文件夹、按等级分日志文件
        LoggingConfigurator.configure();

        //组装全部组件
        JewelFlowScheduler scheduler = ServiceCollectionExtensions.buildAllComponents();
        //启动后台轮询调度
        scheduler.start();

        //模拟提交一条珠宝业务,target=0广播全部部门
        UUID businessId = UUID.randomUUID();
        scheduler.submitBusinessMessage(businessId, 0, "珠宝原料采购业务开始流转");

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        scheduler.stop();
    }
}

  

输出:

image

 

 

  

 

posted @ 2026-09-06 23:37  ®Geovin Du Dream Park™  阅读(8)  评论(0)    收藏  举报