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..7a21e39 100644 --- a/pom.xml +++ b/pom.xml @@ -14,4 +14,49 @@ UTF-8 + + + + org.springframework.boot + spring-boot-starter-jdbc + 2.7.18 + + + + + mysql + mysql-connector-java + 8.0.29 + + + + + org.springframework.boot + spring-boot-starter-amqp + 2.6.4 + + + + ch.qos.logback + logback-classic + 1.2.12 + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + com.fasterxml.jackson.core + jackson-databind + 2.12.5 + + + + + + diff --git a/src/main/java/com/bwie/Application.java b/src/main/java/com/bwie/Application.java new file mode 100644 index 0000000..599cdc0 --- /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 下午7:29 + */ +@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..97ffd76 --- /dev/null +++ b/src/main/java/com/bwie/admin/Pur.java @@ -0,0 +1,36 @@ +package com.bwie.admin; + +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 Date Time; + + private String plate; + + private String Card; + + private String Photo1; + + private String Photo2; + +} 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/DataConsumer.java b/src/main/java/com/bwie/consumer/DataConsumer.java new file mode 100644 index 0000000..bb922e7 --- /dev/null +++ b/src/main/java/com/bwie/consumer/DataConsumer.java @@ -0,0 +1,22 @@ +package com.bwie.consumer; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午7:40 + */ +@Component +@Log4j2 +public class DataConsumer { + + @RabbitListener(queues = "data1") + public void consumeData1(String message) { + log.info("Received data1: " + message); + } + + + +} 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..f0bf09d --- /dev/null +++ b/src/main/java/com/bwie/consumer/consumeData2.java @@ -0,0 +1,19 @@ +package com.bwie.consumer; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午7:40 + */ +@Component +@Log4j2 +public class consumeData2 { + + @RabbitListener(queues = "data2") + public void consumeData2(String message) { + + } +} 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..50f0a77 --- /dev/null +++ b/src/main/java/com/bwie/consumer/consumeData3.java @@ -0,0 +1,20 @@ +package com.bwie.consumer; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * @Author: wangxinyuan + * @Date: 2024/4/11 下午7:40 + */ +@Component +@Log4j2 +public class consumeData3 { + + + @RabbitListener(queues = "data3") + public void consumeData3(String message) { + + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..bc7bfe0 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + url: jdbc:mysql://111.231.174.71:3306/day8?useSSL=false&serverTimezone=UTC + username: root + password: wxy@123 + driver-class-name: com.mysql.cj.jdbc.Driver + + rabbitmq: + host: 111.231.174.71 + port: 5672 + username: guest + password: guest