diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java index cc244fb..165d5fa 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java @@ -88,7 +88,9 @@ public class ManyDataSource { @Lazy private List dataSourceInfoList(){ - return remoteBusinessService.listAll(); + List entinfos = remoteBusinessService.listAll(); + entinfos.add(Entinfo.builder().entCode("test_00").ip("192.168.120.128").port(3306).build()); + return entinfos; } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/job/ManyJob.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/job/ManyJob.java index c0d3d01..f4492a1 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/job/ManyJob.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/job/ManyJob.java @@ -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 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 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 list1= messageDetailMapper.listVehicleMess(); + list1.forEach(vehicleMessage -> { + redisTemplate.delete(vehicleMessage.getVin()+"List"); + List messageDetailList = messageDetailService.list(new QueryWrapper(). + 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 list= messageDetailMapper.listVehicleMess(); + list.forEach(vehicleMessage -> { + redisTemplate.delete(vehicleMessage.getVin()+"List"); + String[] split = vehicleMessage.getMessageIds().split(","); + ArrayList messageDetailArrayList = new ArrayList<>(); + for (String s : split) { + MessageDetail one = messageDetailMapper.selectOne( + new LambdaQueryWrapper() + .eq(MessageDetail::getId, Long.valueOf(s))); + messageDetailArrayList.add(one); + } + messageDetailArrayList.forEach(messageDetail -> { + redisTemplate.opsForList().rightPush(vehicleMessage.getVin()+"List", JSON.toJSONString(messageDetail)); + }); + }); + DynamicDataSourceHolder.removeDynamicDataSourceKey(); + } + } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/mapper/MessageDetailMapper.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/mapper/MessageDetailMapper.java index d5ae7c6..a068498 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/mapper/MessageDetailMapper.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/mapper/MessageDetailMapper.java @@ -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 { 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 listVehicleMess(); + + /** + * 根据messageIds (1,2,3,4,5,)查询 + * @param messageIds + * @return + */ + List selectByMessageIds(@Param("messageIds") String messageIds); } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/rabbitmq/producer/VehicleProducer.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/rabbitmq/producer/VehicleProducer.java index c21c685..9fd9d70 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/rabbitmq/producer/VehicleProducer.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/rabbitmq/producer/VehicleProducer.java @@ -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 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 list= groupMapper.list(); -// log.info("list:{}",list); - List list = messageDetailService.list(new MessageDetail()); - HashMap> 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 messageDetailList = messageDetailService.list(new QueryWrapper(). + in("id", Arrays.asList(vehicleMessage.getMessageIds().split(",")))); + messageDetailList.forEach(messageDetail -> { + redisTemplate.opsForList().rightPush(msg+"List",JSON.toJSONString(messageDetail)); + }); DynamicDataSourceHolder.removeDynamicDataSourceKey(); - Map cacheMap = redisService.getCacheMap(faultRecord.getVin()); - log.info(cacheMap); } }); //确认消费 @@ -212,4 +206,48 @@ public class VehicleProducer { } } } + + + + public void manyJobMess(){ + List 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 list= messageDetailMapper.listVehicleMess(); + list.forEach(vehicleMessage -> { + redisTemplate.delete(vehicleMessage.getVin()+"List"); + String messageIds = vehicleMessage.getMessageIds(); + List messageDetails = messageDetailMapper.selectList(new LambdaQueryWrapper().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 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(); + } + } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/MessageDetailService.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/MessageDetailService.java index b729422..3743e79 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/MessageDetailService.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/MessageDetailService.java @@ -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 { */ public List list(MessageDetail messageDetail); - Object addMessageIds(VehicleMessage vehicleMessageVo); + Result addMessageIds(VehicleMessage vehicleMessageVo); + + } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/impl/MessageDetailServiceImpl.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/impl/MessageDetailServiceImpl.java index d0cbc9c..ad05691 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/impl/MessageDetailServiceImpl.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/service/impl/MessageDetailServiceImpl.java @@ -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 redisTemplate; /** * 查询报文详情列表 * @@ -47,25 +58,41 @@ public class MessageDetailServiceImpl extends ServiceImpl messageDetailArrayList = new ArrayList<>(); - for (String s : split) { - MessageDetail one = this.getOne( - new LambdaQueryWrapper() - .eq(MessageDetail::getId, Long.valueOf(s))); - messageDetailArrayList.add(one); - } - HashMap> hashMap = new HashMap<>(); - hashMap.put(vehicleMessageVo.getVin()+"mgs",messageDetailArrayList); - redisService.setCacheMap(vehicleMessageVo.getVin()+"msg",hashMap); - DynamicDataSourceHolder.removeDynamicDataSourceKey(); - Map cacheMap = redisService.getCacheMap(vehicleMessageVo.getVin()); - return null; + 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); return null; } + + @Autowired + private MessageDetailService messageDetailService; + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 报文配置存入redis + * @param vehicleMessageVo + */ + private void redis(VehicleMessage vehicleMessageVo) { + List messageDetailList = messageDetailService.list(new QueryWrapper(). + in("id", Arrays.asList(vehicleMessageVo.getMessageIds().split(",")))); + messageDetailList.forEach(messageDetail -> { + redisTemplate.opsForList().rightPush(vehicleMessageVo.getVin()+"List", JSON.toJSONString(messageDetail)); + }); + } } diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/resources/mapper/messages/MessageDetailMapper.xml b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/resources/mapper/messages/MessageDetailMapper.xml index ed3008a..493c7ea 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/resources/mapper/messages/MessageDetailMapper.xml +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/resources/mapper/messages/MessageDetailMapper.xml @@ -19,4 +19,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" INSERT INTO `zhilian-cloud`.`vehicle_message` (`vin`, `message_ids`) VALUES (#{vin}, #{messageIds}); + + UPDATE `zhilian-cloud`.`vehicle_message` SET `message_ids` = #{messageIds} WHERE `vin` = #{vin}; + + + DELETE FROM `zhilian-cloud`.`vehicle_message` WHERE `vin` = #{vin}; + + + +