dev798
wxy 2024-04-09 14:09:24 +08:00
parent 62cd733b04
commit 1a26d23135
13 changed files with 408 additions and 1 deletions

View File

@ -54,7 +54,7 @@ public class ProductController {
@PostMapping("/productInsert") @PostMapping("/productInsert")
public R<Product>productInsert(@Valid @RequestBody ProductReq productReq){ public R<Product>productInsert(@Valid @RequestBody ProductReq productReq){
productService.productInsert(productReq); productService.productInsert(productReq);
return R.ok(); return R.ok(null,"添加成功");
} }
@ApiOperation("删除商品") @ApiOperation("删除商品")
@ -64,6 +64,13 @@ public class ProductController {
return AjaxResult.success(res==1?"删除成功":"删除失败"); return AjaxResult.success(res==1?"删除成功":"删除失败");
} }
@ApiOperation("修改商品")
@PostMapping("/productUpdate")
public R productUpdate(@Valid @RequestBody ProductReq productReq){
productService.productUpdate(productReq);
return R.ok(null,"添加成功");
}
@ApiOperation("图片上传") @ApiOperation("图片上传")
@PostMapping("/upload") @PostMapping("/upload")

View File

@ -19,4 +19,6 @@ public interface ProductService {
Integer deleteProduct(Integer id); Integer deleteProduct(Integer id);
void productUpdate(ProductReq productReq);
} }

View File

@ -129,6 +129,11 @@ public class ProductServiceImpl implements ProductService {
return productMapper.deleteProduct(id); return productMapper.deleteProduct(id);
} }
@Override
public void productUpdate(ProductReq productReq) {
}
private void insertProductSku(ProductReq productReq) { private void insertProductSku(ProductReq productReq) {
List<ProductSku> productSkuList = productReq.getProductSkus(); List<ProductSku> productSkuList = productReq.getProductSkus();
int productId = productReq.getProduct().getId(); int productId = productReq.getProduct().getId();

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>muyu</artifactId>
<version>3.6.3</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>muyu-rabbit</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,32 @@
package com.muyu.rabbit.Consumer;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Author: wangxinyuan
* @Date: 2024/4/8 21:02
*/
@Component
public class MessageReceiver {
@RabbitListener(queues = "DxQueue")
public void receiveMessage(@Payload String message) {
try {
// 手动添加异常代码,模拟消费时的异常情况
if (message.contains("error")) {
throw new RuntimeException("Simulated error");
}
System.out.println("Received message: " + message);
// 模拟消费成功打印ack成功日志
System.out.println("ACK: Message processed successfully");
} catch (Exception e) {
// 消费异常,打印失败日志
System.err.println("Failed to process message: " + e.getMessage());
// 可以选择进行消息的重试或者将消息进行持久化等操作
}
}
}

View File

@ -0,0 +1,22 @@
package com.muyu.rabbit.Consumer;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Author: wangxinyuan
* @Date: 2024/4/8 21:02
*/
@Component
public class MessageSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void sendMessage(String message){
amqpTemplate.convertAndSend("exchange", "routingKey", message);
}
}

View File

@ -0,0 +1,15 @@
package com.muyu.rabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: wangxinyuan
* @Date: 2024/4/8 15:06
*/
@SpringBootApplication
public class RabbitApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitApplication.class);
}
}

View File

@ -0,0 +1,53 @@
package com.muyu.rabbit.util;
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;
/**
* RabbitAdminRabbitMQJavaRabbitMQRabbitMQ
*/
@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;
}
}

View File

@ -0,0 +1,79 @@
package com.muyu.rabbit.util.config;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
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;
import org.springframework.context.annotation.Primary;
/**
* @CLassName MqConfig
* @Description
* @Author Meng.Wang
* @Date 2023/11/24 21:15
*/
@Configuration
@Log4j2
public class MqConfig implements RabbitTemplate.ReturnsCallback,RabbitTemplate.ConfirmCallback{
public static final String DXQUEUE = "DxQueue";
public static final String DXEXCHANGE = "DxExchange";
public static final String ROUTINGKEY = "RoutingKey";
private RabbitTemplate rabbitTemplate;
//创建消息转换器
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
//创建队列
@Bean
public Queue queue(){
return new Queue(DXQUEUE,true);
}
//创建交换机
@Primary
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
this.rabbitTemplate = rabbitTemplate;
rabbitTemplate.setMessageConverter(messageConverter());
rabbitTemplate();
return rabbitTemplate;
}
@Bean("DxExchange")
public DirectExchange directExchange(){
return new DirectExchange(DXEXCHANGE);
}
public void rabbitTemplate(){
rabbitTemplate.setConfirmCallback(this);
rabbitTemplate.setReturnsCallback(this);
}
@Bean
public Binding binding(){
return BindingBuilder.bind(queue()).to(directExchange()).with(ROUTINGKEY);
}
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
if(b){
log.info("{}消息到达交换机",correlationData.getId());
}else {
log.error("{}消息丢失",correlationData.getId());
}
}
@Override
public void returnedMessage(ReturnedMessage returnedMessage) {
log.error("{}消息未到达队列",returnedMessage.getMessage().getMessageProperties().getMessageId());
}
}

View File

@ -0,0 +1,32 @@
package com.muyu.rabbit.util.config;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.sql.Connection;
/**
* @Author: wangxinyuan
* @Date: 2024/4/8 20:23
*/
@Configuration
@EnableRabbit
public class RabbitConfig {
@Bean
public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
}

View File

@ -0,0 +1,18 @@
package com.muyu.rabbit.util.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: wangxinyuan
* @Date: 2024/4/8 21:00
*/
@Configuration
public class RabbitMQConfig {
@Bean
public Queue queue() {
return new Queue("queue");
}
}

View File

@ -0,0 +1,65 @@
server:
port: 9197
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
druid:
initial-size: 5
min-idle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,slf4j
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://111.231.174.71:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: wxy@123
# 从库数据源
# slave:
# username:
# password:
# url:
# driver-class-name:
main:
allow-bean-definition-overriding: true
application:
name: muyu-rabbit
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
serverAddr: 111.231.174.71:8848
config:
serverAddr: 111.231.174.71:8848
fileExtension: yml
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
rabbitmq:
username: guest
password: guest
virtualHost: /
port: 5672
host: 111.231.174.71
listener:
simple:
prefetch: 1 # 每次只能获取一条,处理完成才能获取下一条
publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange)
publisher-returns: true #确认消息已发送到队列(Queue)

View File

@ -216,6 +216,7 @@
<module>muyu-modules</module> <module>muyu-modules</module>
<module>muyu-common</module> <module>muyu-common</module>
<module>muyu-modules/muyu-product</module> <module>muyu-modules/muyu-product</module>
<module>muyu-modules/muyu-rabbit</module>
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>