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);
}
}