SpringBoot利用策略模式处理rocketMQ消息

SpringBoot利用策略模式处理rocketMQ消息

1 maven依赖
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
2 配置文件
rocketmq:
  # rocketmq的ip和端口  
  name-server: 192.168.1.200:9876
  producer:
    #组名
    group: anran-producer-group

3 创建消息生产者接口
@RestController
@RequestMapping("msg/analysisrocketmq")
@Api(tags="生产者产生消息")
public class AnalysisRocketMQController {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;


    @PostMapping("producer")
    @ApiOperation("消息队列生产者")
    public void producer(@RequestBody AnalysisStructVideoDTO analysisStructVideoDTO) {

        String string = JSON.toJSONString(analysisStructVideoDTO);
//        System.out.println("生产者:" + analysisStructVideoDTO);
        // 将消息进行一次转发
        rocketMQTemplate.convertAndSend("behavior",string);

    }
}
4 创建策略模式的接口
public interface AnalysisBehavior {

    // 处理逻辑的方法
    AnalysisStructVideoDTO doOperation(AnalysisStructVideoDTO analysisStructVideoDTO);
}
5 创建AOP将字符串转为实体类
/**
* 利用annotation实现切面
*/
public @interface InfoException {
}
/**
* 切面的实现逻辑
*/
@Pointcut("@annotation(msg.analysis.common.annotation.InfoException)")
public void infoException() {

}
@Around("infoException()")
public Object before(ProceedingJoinPoint point) throws Throwable {

    Object[] args = point.getArgs();

    Object videoStructObject = args[0];
    String json = JSON.toJSONString(videoStructObject);

    // 将JSON字符串转为实体对象
    JSONObject jsonObject = JSONObject.parseObject(json);
    
    AnalysisStructVideoDTO analysisStructVideoDTO = JSON.toJavaObject(jsonObject, AnalysisStructVideoDTO.class);
    // 将消息先做一次主体保存
    analysisStructVideoService.save(analysisStructVideoDTO);
    args[0] = analysisStructVideoDTO;
    return point.proceed(args);
}
6 创建接口的实现类

AnalysisBehaviorAbsenceImpl

@Service
public class AnalysisBehaviorAbsenceImpl implements AnalysisBehavior {

  
    @Autowired
    private AnalysisStructVideoAbsenceService analysisStructVideoAbsenceService;

   

    @Override
    @InfoException  // 切面
    @Transactional  // 回滚
    public AnalysisStructVideoDTO doOperation(AnalysisStructVideoDTO > > analysisStructVideoDTO) {

        // 获取主体之外的其他信息
        AnalysisStructVideoAbsenceDTO analysisStructVideoAbsenceDTO =
                ConvertUtils.sourceToTarget(analysisStructVideoDTO.getData(), AnalysisStructVideoAbsenceDTO.class);
        // 将主体对象的ID赋值给其他信息的对象
        analysisStructVideoAbsenceDTO.setStructVideo(analysisStructVideoDTO.getId());
        analysisStructVideoAbsenceService.save(analysisStructVideoAbsenceDTO);


        return analysisStructVideoDTO;
    }
}

AnalysisBehaviorAbsenceImpl

@Service
public class AnalysisBehaviorAbsenceImpl implements AnalysisBehavior {

  
    @Autowired
    private AnalysisStructVideoBehaviorWarningService analysisStructVideoBehaviorWarningService;

   

    @Override
    @InfoException  // 切面
    @Transactional  // 回滚
    public AnalysisStructVideoDTO doOperation(AnalysisStructVideoDTO analysisStructVideoDTO) {

        // 获取主体对象之外的其他信息
        AnalysisStructVideoBehaviorWarningDTO behaviorWarning =
                ConvertUtils.sourceToTarget(analysisStructVideoDTO.getData(),
                        AnalysisStructVideoBehaviorWarningDTO.class);
        // 将主体对象的ID赋值给其他信息的对象
        behaviorWarning.setStructVideo(analysisStructVideoDTO.getId());
        analysisStructVideoBehaviorWarningService.save(behaviorWarning);


        return analysisStructVideoDTO;
    }
}
7 创建策略枚举类
/**
* 根据字段自动装载service
*/
public enum AnalysisBehaviorEnum {

    FACE(0, "face", "analysisBehaviorFaceImpl", "重点目标告警"),
    BEHAVIOR(1, "behavior", "analysisBehaviorBehaviorImpl", "行为告警"), //行为分析
    CROWD_DENSITY(2, "crowdDensity", "analysisBehaviorCrowDensityImpl", "异常聚集"), //人员聚集
    MOTOR_COMMODITY(3, "motorCommodity", "analysisBehaviorMotorCommodityImpl", "机物告警"),//视频结构化
    PASSENGER_NUMBER(4, "passengerNumber", "analysisBehaviorPassengerNumberImpl", "人数统计"),
    HEART_BEAT(5, "heartBeat", "analysisBehaviorHeartBeatImpl", ""),
    ABSENCE(16, "absence", "analysisBehaviorAbsenceImpl", "离岗检测");

    private Integer code;

    private String value;

    private String impl;

    private String name;

    AnalysisBehaviorEnum(Integer code, String value, String impl, String name) {
        this.code = code;
        this.value = value;
        this.impl = impl;
        this.name = name;
    }
    public static String getImpl(String type) {
        for(AnalysisBehaviorEnum auditEnum : AnalysisBehaviorEnum.values()) {
            if(type.equals(auditEnum.getValue())) {
                return auditEnum.getImpl();
            }
        }
        return null ;
    }

    public Integer getCode() {
        return code;
    }

    public String getImpl() {
        return impl;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }
}
8 创建rocketmq消费者
/**
 * 消费者
 *
 */
@Component
@RocketMQMessageListener(topic = "behavior",consumerGroup = "my-consumer-group")
public class AnalysisBehaviorConsumer implements RocketMQListener<String> {

    @Autowired
    private Map<String, AnalysisBehavior> services;


    @Autowired
    private AnalysisWarningTypeService analysisWarningTypeService;

    @Autowired
    private SysRoleService sysRoleService;

    @Autowired
    private SysRoleUserService sysRoleUserService;

    @Autowired
    private AnalysisMapCoverageService analysisMapCoverageService;

    @Override
    public void onMessage(String s) {
        JSONObject analysisStructVideoDTO = JSON.parseObject(s);

        AnalysisStructVideoDTO analysisStructVideo = JSON.toJavaObject(analysisStructVideoDTO, AnalysisStructVideoDTO.class);


//        System.out.println("消费者:" + analysisStructVideo);

        String type = analysisStructVideo.getType();
        String impl = AnalysisBehaviorEnum.getImpl(type);
        AnalysisBehavior service = services.get(impl);
        Date date = new Date();
        date.setTime(analysisStructVideo.getTimestamp());
        analysisStructVideo.setHappenDate(date);



        analysisStructVideo = service.doOperation(analysisStructVideo);
        MessageData<AnalysisStructVideoDTO> messageData = new MessageData<AnalysisStructVideoDTO>();
        messageData.setDescribe(type);
        messageData.setData(analysisStructVideo);
        // 利用WebSocket发送已处理过的消息
        ScreenBehaviorWebSocketServer.sendMessageAll(messageData);


    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值