策略模式对象初始化为空解决方案及项目中具体的使用

2023-11-17

使用类:

@Component
public class TaskReceiver {
     
    @Autowired
    TaskHandlerMapping mapper;

    @RabbitHandler
    @RabbitListener(queues = {MqTaskConstant.QUEUE_WS_CAMUNDA_EVENT_TASK}  )
    public void sendNotice(Message message, Channel channel) throws IOException {
        if (message.getBody() == null) {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            return;
        }
        String str = new String(message.getBody());
        try {
            
            JsonNode taskMessage = CNPCJacksonUtil.decode(str, JsonNode.class);
            String eventName = taskMessage.get("eventName").asText();
            //获取真正处理消息的处理者
            TaskEventTypeHandler handler = mapper.getHandler(eventName);
            //不同情况进行入库
            if(handler != null){
                handler.handleMessage(str);
            }
        }catch(Exception e){
        }
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

注意:

//需要注入策略类,否则策略没办法初始化
@Autowired
TaskHandlerMapping mapper; 

TaskEventTypeHandler handler = mapper.getHandler(eventName);

映射类

//映射类主要是获取到具体的策略 
@Component
public class TaskHandlerMapping
{
    Map<String, TaskEventTypeHandler> handlerList = new ConcurrentHashMap<>();
    //这里注入也可以使用@AutoWired
    private final TaskCreateHandler taskCreateHandler;
    private final TaskAssignmentHandler taskAssignmentHandler;
 
    public TaskHandlerMapping(TaskCreateHandler taskCreateHandler, TaskAssignmentHandler taskAssignmentHandler )
    {
        this.taskCreateHandler = taskCreateHandler;
        this.taskAssignmentHandler = taskAssignmentHandler;
    }

    @PostConstruct
    public void config()
    {
        handlerList.put(TaskConstant.CREATE, taskCreateHandler);
        handlerList.put(TaskConstant.ASSIGNMENT, taskAssignmentHandler);
    }
    public TaskEventTypeHandler getHandler(String eventName)
    {
        return handlerList.get(eventName);
    }

}

策略接口:

@Component
public interface TaskEventTypeHandler {

    void handleMessage(String message) throws Exception ;

}

具体的策略A

@Component
public class TaskCreateHandler implements TaskEventTypeHandler {

    @Override
    public void handleMessage(String taskMessage) throws Exception {

    }

}

具体的策略B

@Component
public class TaskAssignmentHandler implements TaskEventTypeHandler {
    @Override
    public void handleMessage(String message) {

    }

}

整体的逻辑: receiver接受到mq消息进行消费,因为消息分不同的情况:任务的指派和生成等6种情况都需要入库,并且入库的数据不同,因为给每一种写了对应的策略。

在这里插入图片描述

坑:

1 static代码块初始化会导致注入的策略为空。 因为static随着类的加载而加载,此时策略还没有初始化到springContext 中 . 因此下面这种写法不可取

 static Map<String, TaskEventTypeHandler> handlerList = new ConcurrentHashMap<>();
 @Autowired
 private static TaskCreateHandler taskCreateHandler;
 @Autowired  //为空,spring没有初始化
 private static TaskAssignmentHandler taskAssignmentHandler;
 
 static {
     handlerList.put(TaskConstant.CREATE, taskCreateHandler);
     handlerList.put(TaskConstant.ASSIGNMENT, taskAssignmentHandler);
 }

2 初始化顺序 Constructor >> @Autowired >> @PostConstruct

因为上面的初始化时机的问题,使用@PostConstruct进行初始化:

@Component
public class TaskHandlerMapping
{
    
     Map<String, TaskEventTypeHandler> handlerList = new ConcurrentHashMap<>();
    @Autowired
    private  TaskCreateHandler taskCreateHandler;
    @Autowired
    private  TaskAssignmentHandler taskAssignmentHandler;

    //这样可以初始化
    @PostConstruct
    public void config()
    {
        handlerList.put(TaskConstant.CREATE, taskCreateHandler);
        handlerList.put(TaskConstant.ASSIGNMENT, taskAssignmentHandler);
    }
    //用static初始化就不行,taskCreateHandler和taskAssignmentHandler都为null,因为static初始化太早了
  //   static {
  //       handlerList.put(TaskConstant.CREATE, taskCreateHandler);
  //       handlerList.put(TaskConstant.ASSIGNMENT, taskAssignmentHandler);
   //  }
    
    public TaskEventTypeHandler getHandler(String eventName)
    {
        return handlerList.get(eventName);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

策略模式对象初始化为空解决方案及项目中具体的使用 的相关文章

随机推荐

  • FFmpeg 实战指南

    文章目录 表达式 滤镜效果 zoompan 中心视距由远及近 中心视距由近及远 水平视距从左到右 水平视距从右到左 垂直视距从上到下 垂直视距从下到上 rotate 顺时针旋转 PI 6 弧度 逆时针旋转 PI 6 弧度 顺时针旋转 45
  • 【Flink】处理函数Process

    目录 处理函数 基本处理函数 ProcessFunction 处理函数的功能 ProcessFunction解析 处理函数的分类 按键分区处理函数 KeyedProcessFunction 定时器Timer 和定时服务 TimerServi
  • 几种css炫酷背景欣赏

    这里为大家带来几种表现惊人的css背景效果 纯css表现效果 有桌布效果 星空效果 心形效果 砖墙效果等 请欣赏 background radial gradient rgba 255 255 255 0 0 rgba 255 255 25
  • 2020-10-29 org.apache.commons.lang3.StringUtils

    public static void TestStr null 和 操作 判断是否Null 或者 System out println StringUtils isEmpty null System out println StringUt
  • 基于神经网络的模式识别

    一 项目设计的目的 通过构建BP网络和离散Hopfield网络模式识别实例 输出稳定结果 二 相关原理知识介绍 BP学习算法是通过反向学习过程使误差最小 其算法过程从输出节点开始 反向地向第一隐含层 即最接近输入层的隐含层 传播由总误差引起
  • Ceres Solver从零开始手把手教学使用

    目录 一 简介 二 安装 三 介绍 四 Hello Word 五 导数 1 数值导数 2解析求导 六 实践 Powell函数 一 简介 笔者已经半年没有更新新的内容了 最近学习视觉SLAM的过程中发现自己之前学习的库基础不够扎实 Ceres
  • 用JS获取移动设备信息

    获取设备信息少不了的一个JS脚本就是 mobile detect js 如图第二个script链接就是mobile detect js的网上链接 它的官方链接我给大家放在这里了 mobile detect js官方地址https www m
  • 【毕业设计】深度学习图像语义分割算法研究与实现 - python 机器视觉

    文章目录 0 前言 2 概念介绍 2 1 什么是图像语义分割 3 条件随机场的深度学习模型 3 1 多尺度特征融合 4 语义分割开发过程 4 1 建立 4 2 下载CamVid数据集 4 3 加载CamVid图像 4 4 加载CamVid像
  • SpringBoot学习笔记35——实现List校验@Validated

    在 Controller 类上 加上 Validated 在需要校验的参数上加上 Valid 就可以校验list里的实体类的属性 还需要在统一异常处理类中添加异常处理 参数校验异常类 param exception return autho
  • redis未授权访问漏洞利用+redis日志分析

    redis未授权访问漏洞利用 redis日志分析 redis未授权访问 远程连接redis kali redis cli h IP redis常用语句 set key value 设置键值对 get key 获得值 incr intkey
  • 超分辨率学习记录

    超分辨率学习记录 超分定义 经典模型 前上采样 SRCNN 后上采样 FSRCNN 这篇博客主要内容来自于天池网站的超分辨率理论基础 同时对于其中涉及的学术名词也进行了解释 作为自己学习的记录 注 所有名词右上方带 的下面都有详细解释 博客
  • 最近点对问题

    分而治之 题目来源 Quoit Design Problem Description Have you ever played quoit in a playground Quoit is a game in which flat ring
  • 视频编解码(一):ffmpeg编码H.264帧类型判断

    本文主要讲述ffmpeg编码过程中是如何设置I帧 B帧及P帧的 以及如何通过代码判断帧类型 之前看过很多网上的文章 讲述如何判断I帧 B帧 P帧 然而都是停留在H 264官方文档中的定义 如果不结合ffmpeg 就仿佛纸上谈兵 有点不切实际
  • 人脸识别5.1- insightface人脸检测模型scrfd-训练实战笔记,目标检测的理论理解

    1 insightface detection scrfd模型训练 1 0 数据集 数据集下载说明 https github com deepinsight insightface tree master detection dataset
  • Java面向对象编程

    对于IP地址130 63 160 2 MASK为255 255 255 0 子网号为 A 160 2 B 160 C 63 160 D 130 63 160 答案 B 将网络物理地址转换为IP地址的协议是 A IP B ICMP C ARP
  • uni-app项目中引入uView组件库

    在uni app项目中引入uView组件库 其实uView的官方文档写的很清楚了 但是作为菜鸟踩过坑的我还是记录一下 什么是uView uView是uni app生态专用的UI框架 uni app 是一个使用 Vue js 开发所有前端应用
  • Linux 中的 chmod 命令及示例

    在 Unix 操作系统中 chmod命令用于更改文件的访问模式 该名称是change mode的缩写 其中规定每个文件和目录都有一组权限来控制权限 例如谁可以读取 写入或执行该文件 其中权限分为三类 同时读 写和执行 用 r w 和 x 表
  • Java程序员需看的面试题

    进大厂是大部分程序员的梦想 而进大厂的门槛也是比较高的 所以这里整理了一份阿里 美团 滴滴 头条等大厂面试大全 对于Java后端的朋友来说应该是最全面最完整的面试备战仓库 为了更好地整理每个模块 我也参考了很多网上的优质博文和项目 力求不漏
  • 在父子页面嵌套的结构中,当父页面完成某个操作后给子页面一个回调函数

    企业级系统中有一种常见的页面结构 所有的表单都套在一个父页面里 有业务场景 要求父页面在子页面完成加载后做一些操作 如下 这些代码不是本文的重点内容 不做介绍了 这里的iframe是元素 init my iframe function if
  • 策略模式对象初始化为空解决方案及项目中具体的使用

    使用类 Component public class TaskReceiver Autowired TaskHandlerMapping mapper RabbitHandler RabbitListener queues MqTaskCo