diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 603082f..b329f49 100644 --- a/pom.xml +++ b/pom.xml @@ -14,4 +14,77 @@ UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 2.6.2 + + + + + + + org.springframework.boot + spring-boot-starter-test + 3.2.1 + test + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.kafka + spring-kafka + + + + org.springframework.boot + spring-boot-starter-amqp + + + + mysql + mysql-connector-java + 8.0.33 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.39 + + + + org.projectlombok + lombok + + + + org.springframework + spring-oxm + + + + + + + diff --git a/src/main/java/com/bwie/Application.java b/src/main/java/com/bwie/Application.java new file mode 100644 index 0000000..2045533 --- /dev/null +++ b/src/main/java/com/bwie/Application.java @@ -0,0 +1,15 @@ +package com.bwie; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午9:08 + */ +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class); + } +} diff --git a/src/main/java/com/bwie/admin/Pur.java b/src/main/java/com/bwie/admin/Pur.java new file mode 100644 index 0000000..d695820 --- /dev/null +++ b/src/main/java/com/bwie/admin/Pur.java @@ -0,0 +1,38 @@ +package com.bwie.admin; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.deser.std.DateDeserializers; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午7:33 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Pur { + + + private String id; + + private String xm; + + private String age; + + private String time; + + private String card; + + private String photo1; + + + +} diff --git a/src/main/java/com/bwie/admin/Pur2.java b/src/main/java/com/bwie/admin/Pur2.java new file mode 100644 index 0000000..807515a --- /dev/null +++ b/src/main/java/com/bwie/admin/Pur2.java @@ -0,0 +1,27 @@ +package com.bwie.admin; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/12 下午3:10 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Pur2 { + + private String id; + + private String xm; + + + + private String card; + + private String photo1; + + private String photo2; +} diff --git a/src/main/java/com/bwie/admin/Pur3.java b/src/main/java/com/bwie/admin/Pur3.java new file mode 100644 index 0000000..64b286e --- /dev/null +++ b/src/main/java/com/bwie/admin/Pur3.java @@ -0,0 +1,24 @@ +package com.bwie.admin; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/12 下午3:12 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Pur3 { + + private String id; + + + private String time; + + private String plate; + + +} diff --git a/src/main/java/com/bwie/config/ConfirmCallbackConfig.java b/src/main/java/com/bwie/config/ConfirmCallbackConfig.java new file mode 100644 index 0000000..f5c7885 --- /dev/null +++ b/src/main/java/com/bwie/config/ConfirmCallbackConfig.java @@ -0,0 +1,48 @@ +package com.bwie.config; + +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送确认配置 消息发送到交换机的确认 + */ +@Component +public class ConfirmCallbackConfig implements RabbitTemplate.ConfirmCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * @PostContruct是spring框架的注解,在⽅法上加该注解会在项⽬启动的时候执⾏该⽅法,也可以理解为在spring容器初始化的时候执 + * @PostConstruct bean 被初始化的时候执行的方法的注解 + * @PreDestory bean 被销毁的时候执行的方法的注解 + */ + @PostConstruct + public void init() { + rabbitTemplate.setConfirmCallback(this); + } + + /** + * 交换机不管是否收到消息的一个回调方法 + * + * @param correlationData 消息相关数据 + * @param ack 交换机是否收到消息 + * @param cause 失败原因 + */ + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + if (ack) { + // 消息投递到 broker 的状态,true表示成功 + System.out.println("消息发送成功!"); + } else { + // 发送异常 + System.out.println("发送异常原因 = " + cause); + // TODO 可以将消息 内容 以及 失败的原因 记录到 日志表中 + } + } + +} diff --git a/src/main/java/com/bwie/config/RabbitAdminConfig.java b/src/main/java/com/bwie/config/RabbitAdminConfig.java new file mode 100644 index 0000000..9b114fd --- /dev/null +++ b/src/main/java/com/bwie/config/RabbitAdminConfig.java @@ -0,0 +1,53 @@ +package com.bwie.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * RabbitAdmin是RabbitMQ的一个Java客户端库,它提供了管理RabbitMQ资源的功能。它是通过与RabbitMQ服务器进行交互来执行管理操作的。 + */ +@Configuration +public class RabbitAdminConfig { + + @Value("${spring.rabbitmq.host}") + private String host; + @Value("${spring.rabbitmq.username}") + private String username; + @Value("${spring.rabbitmq.password}") + private String password; + @Value("${spring.rabbitmq.virtualhost}") + private String virtualhost; + + /** + * 构建 RabbitMQ的连接工厂 + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); + connectionFactory.setAddresses(host); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost(virtualhost); + // 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效 + connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); + connectionFactory.setPublisherReturns(true); + return connectionFactory; + } + + /** + * 自己初始化 RabbitAdmin + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } +} diff --git a/src/main/java/com/bwie/config/RabbitmqConfig.java b/src/main/java/com/bwie/config/RabbitmqConfig.java new file mode 100644 index 0000000..6b98815 --- /dev/null +++ b/src/main/java/com/bwie/config/RabbitmqConfig.java @@ -0,0 +1,15 @@ +package com.bwie.config; + +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitmqConfig { + // 消息转换配置 + @Bean + public MessageConverter jsonMessageConverter() { + return new Jackson2JsonMessageConverter(); + } +} diff --git a/src/main/java/com/bwie/config/ReturnCallbackConfig.java b/src/main/java/com/bwie/config/ReturnCallbackConfig.java new file mode 100644 index 0000000..55de563 --- /dev/null +++ b/src/main/java/com/bwie/config/ReturnCallbackConfig.java @@ -0,0 +1,34 @@ +package com.bwie.config; + +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送到队列的确认 一旦消息发送到队列失败 则会执行 returnedMessage 方法 + */ +@Component +public class ReturnCallbackConfig implements RabbitTemplate.ReturnsCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + @PostConstruct // @PostContruct是spring框架的注解,在⽅法上加该注解会在项⽬启动的时候执⾏该⽅法,也可以理解为在spring容器初始化的时候执 + public void init() { + rabbitTemplate.setReturnsCallback(this); + } + + /** + * 消息发送到 队列失败 执行的 方法 + * @param returnedMessage the returned message and metadata. + */ + @Override + public void returnedMessage(ReturnedMessage returnedMessage) { + System.out.println("消息" + returnedMessage.getMessage().toString() + "被交换机" + returnedMessage.getExchange() + "回退!" + + "退回原因为:" + returnedMessage.getReplyText()); + // 回退了所有的信息,可做补偿机制 记录到 数据库 + } +} diff --git a/src/main/java/com/bwie/consumer/ConsumeData2.java b/src/main/java/com/bwie/consumer/ConsumeData2.java new file mode 100644 index 0000000..b55b35f --- /dev/null +++ b/src/main/java/com/bwie/consumer/ConsumeData2.java @@ -0,0 +1,62 @@ +//package com.bwie.consumer; +// +//import lombok.extern.log4j.Log4j2; +//import org.springframework.amqp.rabbit.annotation.RabbitListener; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.stereotype.Component; +// +//import java.sql.Timestamp; +// +///** +// * @Author: wangxinyuan +// * @Date: 2024/4/11 下午7:40 +// */ +////@Component +//@Log4j2 +//public class ConsumeData2 { +// +// //@Autowired +// private JdbcTemplate jdbcTemplate; +// +// //@RabbitListener(queues = "data2") +// public void consumeData2(String message) { +// log.info("Received data2: " + message); +// saveDataToDatabase(message); +// } +// +// private void saveDataToDatabase(String message) { +// try { +// String[] parts = message.split(","); +// if (parts.length >= 9) { +// String id = parts[0]; +// String XM = parts[1]; +// String Age = parts[2]; +// String timeStr = parts[3]; +// Timestamp Time = Timestamp.valueOf(timeStr); +// String plate = parts[4]; +// String Card = parts[5]; +// String Photo1 = parts[7]; +// String Photo2 = parts[8]; +// +// +// String querySql = "SELECT * FROM pur WHERE id = ?"; +// Integer count = jdbcTemplate.queryForObject(querySql, new Object[]{id}, Integer.class); +// +// if (count == null || count == 0) { +// String insertSql = "INSERT INTO pur (id, XM, Age, Time, plate, Card, Photo1, Photo2) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; +// jdbcTemplate.update(insertSql, id, XM, Age, Time, plate, Card, Photo1, Photo2); +// log.info("Data saved to database successfully."); +// } else { +// String updateSql = "UPDATE pur SET XM = ?, Age = ?, Time = ?, plate = ?, Card = ?, Photo1 = ?, Photo2 = ? WHERE id = ?"; +// jdbcTemplate.update(updateSql, XM, Age, Time, plate, Card, Photo1, Photo2, id); +// log.info("Data updated in database successfully."); +// } +// } else { +// log.info("Data saved to database failed."); +// } +// } catch (Exception e) { +// log.error("Error while saving data to database: " + e.getMessage()); +// } +// } +//} diff --git a/src/main/java/com/bwie/consumer/ConsumeData3.java b/src/main/java/com/bwie/consumer/ConsumeData3.java new file mode 100644 index 0000000..3c8d90f --- /dev/null +++ b/src/main/java/com/bwie/consumer/ConsumeData3.java @@ -0,0 +1,64 @@ +//package com.bwie.consumer; +// +//import lombok.extern.log4j.Log4j2; +//import org.springframework.amqp.rabbit.annotation.RabbitListener; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.stereotype.Component; +// +//import java.sql.Timestamp; +// +///** +// * @Author: wangxinyuan +// * @Date: 2024/4/11 下午7:40 +// */ +////@Component +//@Log4j2 +//public class ConsumeData3 { +// +// +// //@Autowired +// private JdbcTemplate jdbcTemplate; +// +// //@RabbitListener(queues = "data3") +// public void consumeData3(String message) { +// log.info("Received data3: " + message); +// saveDataToDatabase(message); +// } +// +// private void saveDataToDatabase(String message) { +// try { +// String[] parts = message.split(","); +// if (parts.length >= 9) { +// String id = parts[0]; +// String XM = parts[1]; +// String Age = parts[2]; +// String timeStr = parts[3]; +// Timestamp Time = Timestamp.valueOf(timeStr); +// String plate = parts[4]; +// String Card = parts[5];/**/ +// String Photo1 = parts[7]; +// String Photo2 = parts[8]; +// +// +// String querySql = "SELECT * FROM pur WHERE id = ?"; +// Integer count = jdbcTemplate.queryForObject(querySql, new Object[]{id}, Integer.class); +// +// +// if (count == null || count == 0) { +// String insertSql = "INSERT INTO pur (id, XM, Age, Time, plate, Card, Photo1, Photo2) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; +// jdbcTemplate.update(insertSql, id, XM, Age, Time, plate, Card, Photo1, Photo2); +// log.info("Data saved to database successfully."); +// } else { +// String updateSql = "UPDATE pur SET XM = ?, Age = ?, Time = ?, plate = ?, Card = ?, Photo1 = ?, Photo2 = ? WHERE id = ?"; +// jdbcTemplate.update(updateSql, XM, Age, Time, plate, Card, Photo1, Photo2, id); +// log.info("Data updated in database successfully."); +// } +// } else { +// log.info("Data saved to database failed."); +// } +// } catch (Exception e) { +// log.error("Error while saving data to database: " + e.getMessage()); +// } +// } +//} diff --git a/src/main/java/com/bwie/consumer/ConsumerDate1.java b/src/main/java/com/bwie/consumer/ConsumerDate1.java new file mode 100644 index 0000000..da3d06f --- /dev/null +++ b/src/main/java/com/bwie/consumer/ConsumerDate1.java @@ -0,0 +1,70 @@ +//package com.bwie.consumer; +// +//import com.bwie.admin.Pur; +//import lombok.extern.log4j.Log4j2; +//import org.junit.jupiter.api.Test; +//import org.springframework.amqp.rabbit.annotation.RabbitListener; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.stereotype.Component; +// +//import java.sql.Timestamp; +//import java.util.Date; +// +///** +// * @Author: wangxinyuan +// * @Date: 2024/4/11 下午7:40 +// */ +////@Component +//@Log4j2 +//public class ConsumerDate1 { +// +// +// //@Autowired +// private JdbcTemplate jdbcTemplate; +// +// //@RabbitListener(queues = "data1") +// public void consumeData1(String message) { +// log.info("Received data1: " + message); +// saveDataToDatabase(message); +// } +// +// +// private void saveDataToDatabase(String message) { +// try { +// String[] parts = message.split(","); +// if (parts.length >= 9) { +// String id = parts[0]; +// String XM = parts[1]; +// String Age = parts[2]; +// String timeStr = parts[3]; +// Timestamp Time = Timestamp.valueOf(timeStr); +// String plate = parts[4]; +// String Card = parts[5]; +// String Photo1 = parts[7]; +// String Photo2 = parts[8]; +// +// String querySql = "SELECT * FROM pur WHERE id = ?"; +// Integer count = jdbcTemplate.queryForObject(querySql, new Object[]{id}, Integer.class); +// +// +// if (count == null || count == 0) { +// String insertSql = "INSERT INTO pur (id, XM, Age, Time, plate, Card, Photo1, Photo2) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; +// jdbcTemplate.update(insertSql, id, XM, Age, Time, plate, Card, Photo1, Photo2); +// log.info("Data saved to database successfully."); +// } else { +// String updateSql = "UPDATE pur SET XM = ?, Age = ?, Time = ?, plate = ?, Card = ?, Photo1 = ?, Photo2 = ? WHERE id = ?"; +// jdbcTemplate.update(updateSql, XM, Age, Time, plate, Card, Photo1, Photo2, id); +// log.info("Data updated in database successfully."); +// } +// } else { +// log.info("Data saved to database failed."); +// } +// } catch (Exception e) { +// log.error("Error while saving data to database: " + e.getMessage()); +// } +// } +// +// +// +//} diff --git a/src/main/java/com/bwie/consumer/DataConsumer.java b/src/main/java/com/bwie/consumer/DataConsumer.java new file mode 100644 index 0000000..ae998d2 --- /dev/null +++ b/src/main/java/com/bwie/consumer/DataConsumer.java @@ -0,0 +1,116 @@ +package com.bwie.consumer; + + +import com.alibaba.fastjson2.JSONObject; +import com.bwie.admin.Pur; +import com.bwie.admin.Pur2; +import com.bwie.admin.Pur3; +import com.bwie.controller.PurController; +import com.bwie.mapper.PurMapper; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.rabbitmq.client.Channel; +import org.springframework.stereotype.Repository; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午9:24 + */ +@Component +@Log4j2 +public class DataConsumer { + + + @Autowired + private PurController purController; + + + @Autowired + private PurMapper purMapper; + + + @RabbitListener(queuesToDeclare = {@Queue(name = "data1")}) + public void consumeData1(Object data, Channel channel, Message message) throws IOException { + Pur pur = new Pur(); + if (pur != null) { + pur = (Pur) data; + } + log.info("消费的数据为:{}", JSONObject.toJSONString(pur)); + List list = purMapper.list(); + int count = 0; + if (pur.getId() != null && !"".equals(pur.getId())) { + for (String s : list) { + if (pur.getId().equals(s)) { + count++; + } + } + if (count > 0) { + purMapper.updateData1(pur); + } else { + purMapper.insertData1(pur); + } + } + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + @RabbitListener(queuesToDeclare = {@Queue(name = "data2")}) + public void consumeData2(Object data, Channel channel, Message message) throws IOException { + Pur2 pur2 = new Pur2(); + if (pur2 != null) { + pur2 = (Pur2) data; + } + log.info("消费的数据为:{}", JSONObject.toJSONString(pur2)); + List list = purMapper.Purlist2(); + int count = 0; + if (pur2.getId() != null && !"".equals(pur2.getId())) { + for (String s : list) { + if (pur2.getId().equals(s)) { + count++; + } + } + if (count > 0) { + purMapper.updateData2(pur2); + } else { + purMapper.insertData2(pur2); + } + } + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + @RabbitListener(queuesToDeclare = {@Queue(name = "data3")}) + public void consumeData3(Object data, Channel channel, Message message) throws IOException { + Pur3 pur3 = new Pur3(); + if (pur3 != null) { + pur3 = (Pur3) data; + } + log.info("消费的数据为:{}", JSONObject.toJSONString(pur3)); + List list = purMapper.Purlist3(); + int count = 0; + if (pur3.getId() != null && !"".equals(pur3.getId())) { + for (String s : list) { + if (pur3.getId().equals(s)) { + count++; + } + } + if (count > 0) { + purMapper.updateData3(pur3); + } else { + purMapper.insertData3(pur3); + } + } + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + +} diff --git a/src/main/java/com/bwie/controller/PurController.java b/src/main/java/com/bwie/controller/PurController.java new file mode 100644 index 0000000..bc76685 --- /dev/null +++ b/src/main/java/com/bwie/controller/PurController.java @@ -0,0 +1,48 @@ +package com.bwie.controller; + + +import com.bwie.admin.Pur; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午10:37 + */ +@RestController +public class PurController { + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private ObjectMapper objectMapper; + + + + @GetMapping("/data1") + @Transactional + public void sendData1() throws JsonProcessingException { + Pur pur = new Pur(); + pur.setId("593720128240812819055333"); + pur.setXm("dsc"); + pur.setCard("128963"); + pur.setAge("56"); + pur.setTime("2022-10-10 10:10:11"); + String message = objectMapper.writeValueAsString(pur); + rabbitTemplate.convertAndSend("data1", "id", message); + } + +} diff --git a/src/main/java/com/bwie/mapper/PurMapper.java b/src/main/java/com/bwie/mapper/PurMapper.java new file mode 100644 index 0000000..cc9066c --- /dev/null +++ b/src/main/java/com/bwie/mapper/PurMapper.java @@ -0,0 +1,34 @@ +package com.bwie.mapper; + +import com.bwie.admin.Pur; +import com.bwie.admin.Pur2; +import com.bwie.admin.Pur3; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午11:34 + */ +@Mapper +public interface PurMapper { + List list(); + + void updateData1(Pur pur); + + void insertData1(Pur pur); + + + List Purlist2(); + + void updateData2(Pur2 pur2); + + void insertData2(Pur2 pur2); + + List Purlist3(); + + void updateData3(Pur3 pur3); + + void insertData3(Pur3 pur3); +} diff --git a/src/main/java/com/bwie/task/Task.java b/src/main/java/com/bwie/task/Task.java new file mode 100644 index 0000000..5c8ba45 --- /dev/null +++ b/src/main/java/com/bwie/task/Task.java @@ -0,0 +1,109 @@ +package com.bwie.task; + +import com.bwie.admin.Pur; +import com.bwie.admin.Pur2; +import com.bwie.admin.Pur3; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.net.URL; +import java.util.List; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/12 下午3:35 + */ +@Component +public class Task { + + @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次 + public void doTask() { + // 查询data1的全部数据,得到data1s + List data1s = queryPur1(); + + for (Pur data1 : data1s) { + // 根据id去data2和data3进行查询 + Pur2 data2 = queryPur2(data1.getId()); + Pur3 data3 = queryPur3(data1.getId()); + + // 如果查询到的data2和data3有一个为空,则跳过,等待下次定时调度 + if (data2 == null || data3 == null) { + continue; + } + + // 编写图片保存方法,将图片存储到本地路径 ,并返回图片名称 + String imageName = saveImage(data1.getPhoto1()); + + // 根据data1、2、3及返回的图片名称,拼接字符串写入到bcp文件中,并返回文件名称 + String bcpFileName = writeBcpFile(data1, data2, data3, imageName); + + // 写入规则为字段+"\t" + // 读取索引的模板文件(xml),并替换掉文件名称,并将新的xml内容写到文件中 + String xmlFileName = replaceXmlContent(bcpFileName); + + // 压缩生产的三个文件为zip,压缩到其他目录 + String zipFileName = compressFiles(bcpFileName, xmlFileName, imageName); + + } + } + + private String compressFiles(String bcpFileName, String xmlFileName, String imageName) { + return null; + } + + private String replaceXmlContent(String bcpFileName) { + return null; + } + + private String writeBcpFile(Pur data1, Pur2 data2, Pur3 data3, String imageName) { + // 实现根据data1、2、3及返回的图片名称,拼接字符串写入到bcp文件中,并返回文件名称的逻辑 + try { + String fileName = "D:/save/files/" + data1.getId() + ".bcp"; + BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); + writer.write(data1.toString() + "\t"); + writer.write(data2.toString() + "\t"); + writer.write(data3.toString() + "\t"); + writer.write(imageName); + writer.close(); + return fileName; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + private String saveImage(String photo1) { + try { + URL url = new URL(photo1); + String fileName = photo1.substring(photo1.lastIndexOf("/") + 1); + InputStream inputStream = url.openStream(); + FileOutputStream outputStream = new FileOutputStream("D:/to/image/" + fileName); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + inputStream.close(); + outputStream.close(); + return fileName; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + private Pur3 queryPur3(String id) { + return null; + } + + private Pur2 queryPur2(String id) { + return null; + } + + private List queryPur1() { + return null; + } + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..dfdacd8 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,63 @@ + +# Tomcat +server: + port: 9000 + +# Spring +spring: + application: + # 应用名称 + name: boot-4.11z + rabbitmq: + host: 111.231.174.71 + port: 5672 + username: guest + password: guest + virtual-host: / + publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange) + publisher-returns: true #确认消息已发送到队列(Queue) + template: + # 只要消息抵达Queue,就会异步发送优先回调return firm + mandatory: true + profiles: + # 环境配置 + active: dev + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://111.231.174.71:3306/day8?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false + username: root + password: wxy@123 + druid: + # 下面为连接池的补充设置,应用到上面所有数据源中 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 +# mybatis +mybatis: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*Mapper.xml + type-aliases-package: com.bwie.admin + global-config: + db-config: + id-type: auto diff --git a/src/main/resources/mapper/mapper.xml b/src/main/resources/mapper/mapper.xml new file mode 100644 index 0000000..da30ff3 --- /dev/null +++ b/src/main/resources/mapper/mapper.xml @@ -0,0 +1,54 @@ + + + + + + INSERT INTO pur (id, xm, age, time, plate, card, photo1, photo2) + VALUES (#{id}, #{xm}, #{age}, #{time}, #{plate}, #{card}, #{photo1}, #{photo2}); + + + + + + INSERT INTO pur (id, xm, age, time, plate, card, photo1, photo2) + VALUES (#{id}, #{xm}, #{age}, #{time}, #{plate}, #{card}, #{photo1}, #{photo2}); + + + + INSERT INTO pur (id, xm, age, time, plate, card, photo1, photo2) + VALUES (#{id}, #{xm}, #{age}, #{time}, #{plate}, #{card}, #{photo1}, #{photo2}); + + + + -- 更新数据 + UPDATE pur + SET xm = #{xm}, age = #{age}, time = #{time}, plate = #{plate}, card = #{card}, photo1 = #{photo1}, photo2 = #{photo2} + WHERE id = #{id}; + + + + + UPDATE pur + SET xm = #{xm}, age = #{age}, time = #{time}, plate = #{plate}, card = #{card}, photo1 = #{photo1}, photo2 = #{photo2} + WHERE id = #{id}; + + + + + UPDATE pur + SET xm = #{xm}, age = #{age}, time = #{time}, plate = #{plate}, card = #{card}, photo1 = #{photo1}, photo2 = #{photo2} + WHERE id = #{id}; + + + + + + +