故障预警选择存入报文配置

master
hbr 2024-06-27 16:34:51 +08:00
parent c656f7c0dc
commit 7b121f92f9
7 changed files with 253 additions and 66 deletions

View File

@ -88,7 +88,9 @@ public class ManyDataSource {
@Lazy
private List<Entinfo> dataSourceInfoList(){
return remoteBusinessService.listAll();
List<Entinfo> entinfos = remoteBusinessService.listAll();
entinfos.add(Entinfo.builder().entCode("test_00").ip("192.168.120.128").port(3306).build());
return entinfos;
}

View File

@ -1,17 +1,28 @@
package com.zhiLian.vehicle.job;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhiLian.common.business.domain.Entinfo;
import com.zhiLian.common.business.remote.RemoteBusinessService;
import com.zhiLian.common.redis.service.RedisService;
import com.zhiLian.vehicle.datasource.config.holder.DynamicDataSourceHolder;
import com.zhiLian.vehicle.domain.MessageDetail;
import com.zhiLian.vehicle.domain.Vehicle;
import com.zhiLian.vehicle.domain.VehicleMessage;
import com.zhiLian.vehicle.mapper.MessageDetailMapper;
import com.zhiLian.vehicle.mapper.VehicleMapper;
import com.zhiLian.vehicle.service.IVehicleService;
import com.zhiLian.vehicle.service.MessageDetailService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
@ -33,10 +44,16 @@ public class ManyJob {
private RedisTemplate<String,String> redisTemplate;
@Autowired
private RedisService redisService;
private VehicleMapper vehicleService;
@Autowired
private VehicleMapper vehicleService;
private RemoteBusinessService remoteBusinessService;
@Autowired
private MessageDetailMapper messageDetailMapper;
@Autowired
private MessageDetailService messageDetailService;
@Scheduled(cron = "0 0 0 * * ?")// 每10分钟执行一次
public void manyJob(){
@ -57,4 +74,50 @@ public class ManyJob {
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
@Scheduled(cron = "* */20 * * * ?")// 每10分钟执行一次
public void manyJobMess(){
List<Entinfo> list = remoteBusinessService.listAll();
ExecutorService executorService = Executors.newFixedThreadPool(list.size());
list.forEach(entinfo -> {
executorService.submit(new Runnable() {
@Override
public void run() {
DynamicDataSourceHolder.setDynamicDataSourceKey(entinfo.getEntCode());
List<VehicleMessage> list1= messageDetailMapper.listVehicleMess();
list1.forEach(vehicleMessage -> {
redisTemplate.delete(vehicleMessage.getVin()+"List");
List<MessageDetail> messageDetailList = messageDetailService.list(new QueryWrapper<MessageDetail>().
in("id", Arrays.asList(vehicleMessage.getMessageIds().split(","))));
messageDetailList.forEach(messageDetail -> {
redisTemplate.opsForList().rightPush(vehicleMessage.getVin()+"List", JSON.toJSONString(messageDetail));
});
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
});
});
}
public void redis(Entinfo entinfo){
DynamicDataSourceHolder.setDynamicDataSourceKey(entinfo.getEntCode());
List<VehicleMessage> list= messageDetailMapper.listVehicleMess();
list.forEach(vehicleMessage -> {
redisTemplate.delete(vehicleMessage.getVin()+"List");
String[] split = vehicleMessage.getMessageIds().split(",");
ArrayList<MessageDetail> messageDetailArrayList = new ArrayList<>();
for (String s : split) {
MessageDetail one = messageDetailMapper.selectOne(
new LambdaQueryWrapper<MessageDetail>()
.eq(MessageDetail::getId, Long.valueOf(s)));
messageDetailArrayList.add(one);
}
messageDetailArrayList.forEach(messageDetail -> {
redisTemplate.opsForList().rightPush(vehicleMessage.getVin()+"List", JSON.toJSONString(messageDetail));
});
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
}

View File

@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhiLian.vehicle.domain.MessageDetail;
import com.zhiLian.vehicle.domain.VehicleMessage;
import com.zhiLian.vehicle.domain.vo.VehicleMessageVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
@ -15,4 +18,37 @@ import com.zhiLian.vehicle.domain.vo.VehicleMessageVo;
public interface MessageDetailMapper extends BaseMapper<MessageDetail> {
Boolean addMess(VehicleMessage vehicleMessageVo);
/**
* vin
* @param vehicleMessageVo
* @return
*/
VehicleMessage findByVin(VehicleMessage vehicleMessageVo);
/**
*
* @param vehicleMessage
*/
void deleteMess(VehicleMessage vehicleMessage);
/**
* vin
* @param vehicleMessageVo
* @return
*/
Boolean updateByVin(VehicleMessage vehicleMessageVo);
/**
*
* @return
*/
List<VehicleMessage> listVehicleMess();
/**
* messageIds 1,2,3,4,5,
* @param messageIds
* @return
*/
List<MessageDetail> selectByMessageIds(@Param("messageIds") String messageIds);
}

View File

@ -2,13 +2,18 @@ package com.zhiLian.vehicle.rabbitmq.producer;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.rabbitmq.client.Channel;
import com.zhiLian.common.redis.service.RedisService;
import com.zhiLian.common.business.domain.Entinfo;
import com.zhiLian.common.business.remote.RemoteBusinessService;
import com.zhiLian.vehicle.datasource.config.holder.DynamicDataSourceHolder;
import com.zhiLian.vehicle.domain.FaultRecord;
import com.zhiLian.vehicle.domain.MessageDetail;
import com.zhiLian.vehicle.domain.Vehicle;
import com.zhiLian.vehicle.domain.VehicleMessage;
import com.zhiLian.vehicle.mapper.GroupMapper;
import com.zhiLian.vehicle.mapper.MessageDetailMapper;
import com.zhiLian.vehicle.mapper.VehicleMapper;
import com.zhiLian.vehicle.service.FaultRecordService;
import com.zhiLian.vehicle.service.MessageDetailService;
@ -18,11 +23,10 @@ import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -44,32 +48,21 @@ public class VehicleProducer {
@Autowired
private VehicleMapper vehicleService;
@Autowired
private MessageDetailService messageDetailService;
@Autowired
private RedisService redisService;
private RemoteBusinessService remoteBusinessService;
@Autowired
private MessageDetailMapper messageDetailMapper;
@Autowired
private final static String ZHILIAN_END="zhiLian-vehicle-end";
private final static String ZHILIAN_VIN="zhiLian-vehicle-vin";
private final static String ZHILIAN_START="zhiLian-vehicle-start";
public void manyJob(){
DynamicDataSourceHolder.setDynamicDataSourceKey("test_00");
List<Vehicle> list = vehicleService.selectVehicleListAll(new Vehicle());
ExecutorService executor = Executors.newFixedThreadPool(list.size());
list.forEach(vehicle -> {
executor.submit(new Runnable() {
@Override
public void run() {
redisTemplate
.opsForValue()
.set(vehicle.getNumber()+"1",
String.valueOf(vehicle.getBusinessId()));
}
});
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
//调用注解 添加队列名称
@RabbitListener(queuesToDeclare = {@Queue(name = "zhiLian-vehicle-start")})
@RabbitListener(queuesToDeclare = {@Queue(name = ZHILIAN_START)})
public void smsConfigStart(String msg, Message message, Channel channel){
//获取消息的ID
String messageId = message.getMessageProperties().getMessageId();
@ -116,7 +109,9 @@ public class VehicleProducer {
throw new RuntimeException(e);
}
}
@RabbitListener(queuesToDeclare = {@Queue(name = "zhiLian-vehicle-end")})
@RabbitListener(queuesToDeclare = {@Queue(name = ZHILIAN_END)})
public void smsConfigEnt(String msg, Message message, Channel channel){
//获取消息的ID
String messageId = message.getMessageProperties().getMessageId();
@ -163,7 +158,11 @@ public class VehicleProducer {
}
}
}
@RabbitListener(queuesToDeclare = {@Queue(name = "zhiLian-vehicle-vin")})
@Autowired
private MessageDetailService messageDetailService;
@RabbitListener(queuesToDeclare = {@Queue(name = ZHILIAN_VIN)})
public void smsConfigVin(String msg, Message message, Channel channel){
//获取消息的ID
String messageId = message.getMessageProperties().getMessageId();
@ -174,25 +173,20 @@ public class VehicleProducer {
if (count == 1) {
log.info("消费:{}",msg);
manyJob();
FaultRecord faultRecord = JSON.parseObject(msg, FaultRecord.class);
// //判断车辆属于哪个企业
String s = redisTemplate.opsForValue().get(faultRecord.getVin()+"1");
String s = redisTemplate.opsForValue().get(msg+"1");
redisTemplate.delete(msg+"List");
Executors.newFixedThreadPool(1).execute(new Runnable() {
@Override
public void run() {
//选择数据源,切换数据源,
DynamicDataSourceHolder.setDynamicDataSourceKey("test_"+s);
// List<MessageDetail> list= groupMapper.list();
// log.info("list{}",list);
List<MessageDetail> list = messageDetailService.list(new MessageDetail());
HashMap<String, List<MessageDetail>> hashMap = new HashMap<>();
hashMap.put(faultRecord.getVin()+"mgs",list);
redisService.setCacheMap(faultRecord.getVin()+"msg",hashMap);
VehicleMessage vehicleMessage = messageDetailMapper.findByVin(VehicleMessage.builder().vin(msg).build());
List<MessageDetail> messageDetailList = messageDetailService.list(new QueryWrapper<MessageDetail>().
in("id", Arrays.asList(vehicleMessage.getMessageIds().split(","))));
messageDetailList.forEach(messageDetail -> {
redisTemplate.opsForList().rightPush(msg+"List",JSON.toJSONString(messageDetail));
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
Map<String, Object> cacheMap = redisService.getCacheMap(faultRecord.getVin());
log.info(cacheMap);
}
});
//确认消费
@ -212,4 +206,48 @@ public class VehicleProducer {
}
}
}
public void manyJobMess(){
List<Entinfo> list = remoteBusinessService.listAll();
ExecutorService executorService = Executors.newFixedThreadPool(list.size());
list.forEach(entinfo -> {
executorService.submit(new Runnable() {
@Override
public void run() {
DynamicDataSourceHolder.setDynamicDataSourceKey(entinfo.getEntCode());
List<VehicleMessage> list= messageDetailMapper.listVehicleMess();
list.forEach(vehicleMessage -> {
redisTemplate.delete(vehicleMessage.getVin()+"List");
String messageIds = vehicleMessage.getMessageIds();
List<MessageDetail> messageDetails = messageDetailMapper.selectList(new LambdaQueryWrapper<MessageDetail>().in(MessageDetail::getId, messageIds));
messageDetails.forEach(messageDetail -> {
redisTemplate.opsForList().rightPush(vehicleMessage.getVin()+"List", JSON.toJSONString(messageDetail));
});
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
});
});
}
public void manyJob(){
DynamicDataSourceHolder.setDynamicDataSourceKey("test_00");
List<Vehicle> list = vehicleService.selectVehicleListAll(new Vehicle());
ExecutorService executor = Executors.newFixedThreadPool(list.size());
list.forEach(vehicle -> {
executor.submit(new Runnable() {
@Override
public void run() {
redisTemplate
.opsForValue()
.set(vehicle.getNumber()+"1",
String.valueOf(vehicle.getBusinessId()));
}
});
});
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
}

View File

@ -1,6 +1,7 @@
package com.zhiLian.vehicle.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zhiLian.common.core.domain.Result;
import com.zhiLian.vehicle.domain.MessageDetail;
import com.zhiLian.vehicle.domain.VehicleMessage;
import com.zhiLian.vehicle.domain.vo.VehicleMessageVo;
@ -22,5 +23,7 @@ public interface MessageDetailService extends IService<MessageDetail> {
*/
public List<MessageDetail> list(MessageDetail messageDetail);
Object addMessageIds(VehicleMessage vehicleMessageVo);
Result addMessageIds(VehicleMessage vehicleMessageVo);
}

View File

@ -1,8 +1,11 @@
package com.zhiLian.vehicle.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhiLian.common.core.domain.Result;
import com.zhiLian.common.redis.service.RedisService;
import com.zhiLian.vehicle.datasource.config.holder.DynamicDataSourceHolder;
import com.zhiLian.vehicle.domain.MessageDetail;
@ -12,13 +15,15 @@ import com.zhiLian.vehicle.mapper.MessageDetailMapper;
import com.zhiLian.vehicle.service.MessageDetailService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.weaver.ast.Or;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Service
@ -32,6 +37,12 @@ public class MessageDetailServiceImpl extends ServiceImpl<MessageDetailMapper, M
@Autowired
private MessageDetailMapper messageDetailMapper;
/**
* redis
*/
@Autowired
private RedisTemplate<String,String> redisTemplate;
/**
*
*
@ -47,25 +58,41 @@ public class MessageDetailServiceImpl extends ServiceImpl<MessageDetailMapper, M
@Autowired
private RedisService redisService;
@Override
public Object addMessageIds(VehicleMessage vehicleMessageVo) {
log.info("addMessageids:{}",vehicleMessageVo);
public Result addMessageIds(VehicleMessage vehicleMessageVo) {
redisTemplate.delete(vehicleMessageVo.getVin()+"List");
VehicleMessage vehicleMessage=messageDetailMapper.findByVin(vehicleMessageVo);
redis(vehicleMessageVo);
rabbitTemplate.convertAndSend ( "zhiLian-vehicle-return",vehicleMessage.getVin() , messag ->{
messag.getMessageProperties ( ).setMessageId ( UUID.randomUUID ( ).toString ( ) );
log.info ( "消息发送成功" );
return messag;
});
//判断 新增/ 修改
if (vehicleMessage!=null){
//修改
Boolean b=messageDetailMapper.updateByVin(vehicleMessageVo);
return Result.success();
}
//新增
Boolean b = messageDetailMapper.addMess(vehicleMessageVo);
if(b){
String[] split = vehicleMessageVo.getMessageIds().split(",");
ArrayList<MessageDetail> messageDetailArrayList = new ArrayList<>();
for (String s : split) {
MessageDetail one = this.getOne(
new LambdaQueryWrapper<MessageDetail>()
.eq(MessageDetail::getId, Long.valueOf(s)));
messageDetailArrayList.add(one);
}
HashMap<String, List<MessageDetail>> hashMap = new HashMap<>();
hashMap.put(vehicleMessageVo.getVin()+"mgs",messageDetailArrayList);
redisService.setCacheMap(vehicleMessageVo.getVin()+"msg",hashMap);
DynamicDataSourceHolder.removeDynamicDataSourceKey();
Map<String, Object> cacheMap = redisService.getCacheMap(vehicleMessageVo.getVin());
return null;
}
return null;
@Autowired
private MessageDetailService messageDetailService;
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* redis
* @param vehicleMessageVo
*/
private void redis(VehicleMessage vehicleMessageVo) {
List<MessageDetail> messageDetailList = messageDetailService.list(new QueryWrapper<MessageDetail>().
in("id", Arrays.asList(vehicleMessageVo.getMessageIds().split(","))));
messageDetailList.forEach(messageDetail -> {
redisTemplate.opsForList().rightPush(vehicleMessageVo.getVin()+"List", JSON.toJSONString(messageDetail));
});
}
}

View File

@ -19,4 +19,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<insert id="addMess">
INSERT INTO `zhilian-cloud`.`vehicle_message` (`vin`, `message_ids`) VALUES (#{vin}, #{messageIds});
</insert>
<update id="updateByVin">
UPDATE `zhilian-cloud`.`vehicle_message` SET `message_ids` = #{messageIds} WHERE `vin` = #{vin};
</update>
<delete id="deleteMess">
DELETE FROM `zhilian-cloud`.`vehicle_message` WHERE `vin` = #{vin};
</delete>
<select id="findByVin" resultType="com.zhiLian.vehicle.domain.VehicleMessage">
select * from vehicle_message where vin = #{vin}
</select>
<select id="listVehicleMess" resultType="com.zhiLian.vehicle.domain.VehicleMessage">
select * from vehicle_message
</select>
<select id="selectByMessageIds" resultType="com.zhiLian.vehicle.domain.MessageDetail">
select * from message_detail where id in
<foreach collection="messageIds" item="messageId" open="(" separator="," close=")">
#{messageId}
</foreach>
</select>
</mapper>