From 293433a1b8cedce71cf272dc8f9b1d670153a508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Tue, 12 Dec 2023 18:43:56 +0800 Subject: [PATCH 1/8] =?UTF-8?q?minio=E9=85=8D=E7=BD=AE=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quickstart/annotation/TimeConsuming.java | 9 +++++ .../aspect/TimeConsumingAspect.java | 35 +++++++++++++++++++ .../service/impl/EsUserServiceImpl.java | 5 +++ .../elasticsearch/DomeApplicationTests.java | 4 +++ 4 files changed, 53 insertions(+) create mode 100644 src/main/java/com/quickstart/annotation/TimeConsuming.java create mode 100644 src/main/java/com/quickstart/aspect/TimeConsumingAspect.java diff --git a/src/main/java/com/quickstart/annotation/TimeConsuming.java b/src/main/java/com/quickstart/annotation/TimeConsuming.java new file mode 100644 index 0000000..b226038 --- /dev/null +++ b/src/main/java/com/quickstart/annotation/TimeConsuming.java @@ -0,0 +1,9 @@ +package com.quickstart.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface TimeConsuming { +} diff --git a/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java b/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java new file mode 100644 index 0000000..a6ea4e2 --- /dev/null +++ b/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java @@ -0,0 +1,35 @@ +package com.quickstart.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +/** + * @author cloud + * @version 1.0 + * @description: TODO + * @date 2023/12/12 17:04 + */ +@Aspect +@Component +@Slf4j +public class TimeConsumingAspect { + @Pointcut("@annotation(com.quickstart.annotation.TimeConsuming)") + public void pointcut() {} + + /** + * 环绕增强,相当于MethodInterceptor + */ + @Around("pointcut()") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); + Object proceed = joinPoint.proceed(); + long end = System.currentTimeMillis(); + log.info("方法耗时==>{}",end-start); + return proceed; + } + +} diff --git a/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java b/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java index 943b74e..15bcf4f 100644 --- a/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java +++ b/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java @@ -101,6 +101,7 @@ public class EsUserServiceImpl implements EsUserService { BulkRequest request = new BulkRequest(); //设置超时时间 request.timeout("10s"); + IndexRequest indexRequest = new IndexRequest(USER_INDEX); // 批量插入请求设置 userList.forEach(user -> request.add( new IndexRequest("user_index") @@ -135,6 +136,10 @@ public class EsUserServiceImpl implements EsUserService { // 构建精确匹配查询条件 // TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username.keyword", "李四"); // MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery(); + // 取消评分 +// WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("username", "张"); +// ConstantScoreQueryBuilder constantScoreQueryBuilder = QueryBuilders.constantScoreQuery(wildcardQueryBuilder); +// builder.query(constantScoreQueryBuilder); // 模糊匹配 WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("username", "张"); builder.query(wildcardQueryBuilder); diff --git a/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java b/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java index 8214699..5d81c5c 100644 --- a/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java +++ b/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java @@ -1,6 +1,8 @@ package com.quickstart.elasticsearch; import com.alibaba.fastjson.JSON; +import com.quickstart.annotation.CustomLog; +import com.quickstart.annotation.TimeConsuming; import com.quickstart.entity.User; import com.quickstart.service.impl.EsUserServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -70,6 +72,8 @@ class DomeApplicationTests { * 查询用户 */ @Test + @CustomLog + @TimeConsuming void searchUser() throws IOException { ArrayList users = esUserService.searchUser(); log.info("查询结果{}", JSON.toJSONString(users)); -- Gitee From faac1b50da99bf774844f26d0fe7a92bf734cbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Tue, 12 Dec 2023 18:53:17 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=97=A5=E5=BF=97bug=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aspect/TimeConsumingAspect.java | 3 +- .../controller/IndexController.java | 2 + .../com/quickstart/entity/model/SysLog.java | 6 + .../elasticsearch/DomeApplicationTests.java | 2 - src/test/resources/log4j2.xml | 118 ++++++++++++++++++ 5 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/log4j2.xml diff --git a/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java b/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java index a6ea4e2..9bcec7a 100644 --- a/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java +++ b/src/main/java/com/quickstart/aspect/TimeConsumingAspect.java @@ -28,7 +28,8 @@ public class TimeConsumingAspect { long start = System.currentTimeMillis(); Object proceed = joinPoint.proceed(); long end = System.currentTimeMillis(); - log.info("方法耗时==>{}",end-start); + //System.out.println("方法耗时==>"+ (end - start)); + log.info("方法耗时{}",(end-start)); return proceed; } diff --git a/src/main/java/com/quickstart/controller/IndexController.java b/src/main/java/com/quickstart/controller/IndexController.java index 42e4a19..dae8f46 100644 --- a/src/main/java/com/quickstart/controller/IndexController.java +++ b/src/main/java/com/quickstart/controller/IndexController.java @@ -1,6 +1,7 @@ package com.quickstart.controller; import com.quickstart.annotation.CustomLog; +import com.quickstart.annotation.TimeConsuming; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +16,7 @@ public class IndexController { */ @GetMapping("/") @CustomLog("基础web") + @TimeConsuming public String test(String msg) { return "欢迎使用 springboot-cli !"; } diff --git a/src/main/java/com/quickstart/entity/model/SysLog.java b/src/main/java/com/quickstart/entity/model/SysLog.java index 5e1a5d5..de3415a 100644 --- a/src/main/java/com/quickstart/entity/model/SysLog.java +++ b/src/main/java/com/quickstart/entity/model/SysLog.java @@ -1,7 +1,10 @@ package com.quickstart.entity.model; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -13,6 +16,9 @@ import java.util.Date; * @author ding */ @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder @Accessors(chain = true) public class SysLog implements Serializable { diff --git a/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java b/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java index 5d81c5c..0e7aa75 100644 --- a/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java +++ b/src/test/java/com/quickstart/elasticsearch/DomeApplicationTests.java @@ -1,7 +1,6 @@ package com.quickstart.elasticsearch; import com.alibaba.fastjson.JSON; -import com.quickstart.annotation.CustomLog; import com.quickstart.annotation.TimeConsuming; import com.quickstart.entity.User; import com.quickstart.service.impl.EsUserServiceImpl; @@ -72,7 +71,6 @@ class DomeApplicationTests { * 查询用户 */ @Test - @CustomLog @TimeConsuming void searchUser() throws IOException { ArrayList users = esUserService.searchUser(); diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2.xml new file mode 100644 index 0000000..ba478d2 --- /dev/null +++ b/src/test/resources/log4j2.xml @@ -0,0 +1,118 @@ + + + + + + + /root/workspace/lucenedemo/logs + /root/workspace/lucenedemo/logs/error + /root/workspace/lucenedemo/logs/warn + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- Gitee From d22840845ce55db8919d838cda70fc7f2bed8fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Thu, 14 Dec 2023 10:36:29 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0rabbitmq=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 +- .../com/quickstart/config/RabbitDefine.java | 74 ++++++ .../com/quickstart/entity/ObjectItem.java | 19 ++ .../mq/rabbitmq/consumer/RabbitConsumer.java | 119 ++++++++++ .../mq/rabbitmq/producer/RabbitProducer.java | 86 +++++++ .../producer/config/RabbitDeadConfig.java | 54 +++++ .../producer/config/RabbitDelayConfig.java | 49 ++++ .../producer/config/RabbitDirectConfig.java | 51 ++++ .../producer/config/RabbitFanoutConfig.java | 47 ++++ .../producer/config/RabbitTopicConfig.java | 66 ++++++ .../config/RabbitTtlDirectConfig.java | 54 +++++ .../java/com/quickstart/utils/FileUtils.java | 36 +++ .../com/quickstart/utils/MinioTemplate.java | 220 ++++++++++++++++++ src/main/resources/application.yml | 27 ++- src/main/resources/lockback.xml | 151 ++++++++++++ src/main/resources/log4j2.xml | 118 ---------- .../java/com/quickstart/minio/MinioTest.java | 92 ++++++++ .../com/quickstart/rabbitMQ/ProducerTest.java | 42 ++++ .../{ => rocketMQ}/rocketMQProducerTest.java | 2 +- src/test/resources/log4j2.xml | 118 ---------- 20 files changed, 1194 insertions(+), 243 deletions(-) create mode 100644 src/main/java/com/quickstart/config/RabbitDefine.java create mode 100644 src/main/java/com/quickstart/entity/ObjectItem.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDeadConfig.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDelayConfig.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDirectConfig.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitFanoutConfig.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTopicConfig.java create mode 100644 src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTtlDirectConfig.java create mode 100644 src/main/java/com/quickstart/utils/FileUtils.java create mode 100644 src/main/java/com/quickstart/utils/MinioTemplate.java create mode 100644 src/main/resources/lockback.xml delete mode 100644 src/main/resources/log4j2.xml create mode 100644 src/test/java/com/quickstart/minio/MinioTest.java create mode 100644 src/test/java/com/quickstart/rabbitMQ/ProducerTest.java rename src/test/java/com/quickstart/{ => rocketMQ}/rocketMQProducerTest.java (95%) delete mode 100644 src/test/resources/log4j2.xml diff --git a/pom.xml b/pom.xml index e7c2624..84f7b15 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ rocketmq-client 4.4.0 - + org.springframework.boot spring-boot-starter-aop @@ -86,21 +86,25 @@ xxl-job-core 2.3.1 + org.apache.logging.log4j log4j-core 2.6.2 + org.apache.logging.log4j log4j-api 2.6.2 + org.elasticsearch.client elasticsearch-rest-high-level-client 7.3.1 + org.elasticsearch.client elasticsearch-rest-client @@ -142,7 +146,11 @@ okhttp 4.9.0 - + + + org.springframework.boot + spring-boot-starter-amqp + diff --git a/src/main/java/com/quickstart/config/RabbitDefine.java b/src/main/java/com/quickstart/config/RabbitDefine.java new file mode 100644 index 0000000..081272e --- /dev/null +++ b/src/main/java/com/quickstart/config/RabbitDefine.java @@ -0,0 +1,74 @@ +package com.quickstart.config; + +/** + * 队列定义 + * + * @author ding + */ +public class RabbitDefine { + + /** + * 普通交换机 + */ + public final static String DIRECT_EXCHANGE = "direct.exchange"; + + /** + * 普通队列 + */ + public final static String DIRECT_QUEUE = "direct.queue"; + + /** + * 延迟队列交换机 + */ + public final static String DELAY_EXCHANGE = "delay.exchange"; + + /** + * 延迟队列 + */ + public final static String DELAY_QUEUE = "delay.queue"; + + /** + * 通配符交换机 + */ + public final static String FANOUT_EXCHANGE = "fanout.exchange"; + + /** + * 通配符队列 + */ + public final static String FANOUT_QUEUE = "fanout.queue"; + + /** + * topic 交换器 + */ + public final static String TOPIC_EXCHANGE = "topic.exchange"; + + /** + * topic队列1 + */ + public final static String TOPIC_QUEUE_ONE = "topic.queue.one"; + + /** + * topic队列2 + */ + public final static String TOPIC_QUEUE_TWO = "topic.queue.two"; + + /** + * 临时队列交换器 + */ + public final static String TTL_EXCHANGE = "ttl.exchange"; + + /** + * 临时队列 + */ + public final static String TTL_QUEUE = "ttl.queue"; + + /** + * 死信交换机 + */ + public final static String DEAD_EXCHANGE = "dead.exchange"; + + /** + * 死信队列 + */ + public final static String DEAD_QUEUE = "dead.queue"; +} diff --git a/src/main/java/com/quickstart/entity/ObjectItem.java b/src/main/java/com/quickstart/entity/ObjectItem.java new file mode 100644 index 0000000..29ddaed --- /dev/null +++ b/src/main/java/com/quickstart/entity/ObjectItem.java @@ -0,0 +1,19 @@ +package com.quickstart.entity; + +import lombok.Data; + +/** + * @Author xiaozq + * @Date 2022/11/17 10:05 + *

@Description:

+ */ +@Data +public class ObjectItem { + + // 文件 + private String objectName; + + // 大小 + private Long size; + +} diff --git a/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java b/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java new file mode 100644 index 0000000..97ec57f --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java @@ -0,0 +1,119 @@ +package com.quickstart.mq.rabbitmq.consumer; + + +import com.quickstart.config.RabbitDefine; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * 消费者 + * + * @author ding + */ +@Component +@Slf4j +public class RabbitConsumer { + + /** + * 普通消息 + */ + @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DIRECT_QUEUE)) + public void consumer1(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者1(直通消息)-队列索引:{},接收到消息:{}", tag, message); + channel.basicAck(tag, false); + } + + /** + * 分裂消息 + */ + @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.FANOUT_QUEUE)) + public void consumer2(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者2(分裂消息)-队列索引:{},接收到消息:{}", tag, message); + channel.basicAck(tag, false); + } + + /** + * 临时消息 + */ + @RabbitListener(bindings = { + @QueueBinding( + value = @Queue(value = RabbitDefine.TTL_QUEUE, + arguments = { + // 指定一下死信交换机 + @Argument(name = "x-dead-letter-exchange", value = RabbitDefine.DEAD_EXCHANGE), + // 指定死信交换机的路由key + @Argument(name = "x-dead-letter-routing-key", value = "dead"), + // 指定队列的过期时间 + @Argument(name = "x-message-ttl", value = "10000", type = "java.lang.Long") + }), + exchange = @Exchange(name = RabbitDefine.TTL_EXCHANGE), + key = "test" + ) + }) + public void consumer3(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者3(临时消息)-队列索引:{},接收到消息:{}", tag, message); + channel.basicAck(tag, false); + } + + /** + * 延时消息 + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(name = RabbitDefine.DELAY_QUEUE), + exchange = @Exchange(name = RabbitDefine.DELAY_EXCHANGE, delayed = "true"), + key = "delay")) + public void consumer4(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者4(延时队列)-队列索引:{},接收到消息:{}", tag, message); + try { + // 接收成功 + channel.basicAck(tag, false); + } catch (Exception e) { + log.error("发生异常,消息签收失败"); + // 第三个参数 requeue = true为将消息重返当前消息队列,还可以重新发送给消费者 + channel.basicNack(tag, false, true); + } + } + + /** + * topic消息1 + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = RabbitDefine.TOPIC_QUEUE_ONE, autoDelete = "false", durable = "true"), + exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), + key = "#.topic.#" + )) + public void consumer5(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者5(topic模式one)-队列索引:{},接收到消息:{}", tag, message); + channel.basicAck(tag, false); + } + + /** + * topic消息2 + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = RabbitDefine.TOPIC_QUEUE_TWO, autoDelete = "false", durable = "true"), + exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), + key = "#.topic.#" + )) + public void consumer6(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者6(topic模式two)-队列索引:{},接收到消息:{}", tag, message); + channel.basicAck(tag, false); + } + + /** + * 死信队列消息 + */ + @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DEAD_QUEUE)) + public void consumer7(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { + log.info("消费者7(死信队列)-队列索引:{},接收到过期消息:{}", tag, message); + channel.basicAck(tag, false); + } + +} diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java new file mode 100644 index 0000000..fd5404d --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java @@ -0,0 +1,86 @@ +package com.quickstart.mq.rabbitmq.producer; + + +import com.quickstart.config.RabbitDefine; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +import java.util.UUID; + + +/** + * 消息提供者 + * + * @author ding + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class RabbitProducer { + + private final RabbitTemplate rabbitTemplate; + + /** + * 直接模式发送消息 + * + * @param message 发送的信息 + */ + public void sendDirect(Object message) { + rabbitTemplate.convertAndSend(RabbitDefine.DIRECT_QUEUE, message, this.getCorrelationData()); + } + + /** + * 分裂模式发送消息 + * + * @param message 发送的信息 + */ + public void sendFanout(Object message) { + rabbitTemplate.convertAndSend(RabbitDefine.FANOUT_EXCHANGE, "", message); + } + + + /** + * 主题模式发送消息 + * + * @param message 发送的信息 + * @param routingKey 匹配的队列名 + */ + public void sendTopic(Object message, String routingKey) { + rabbitTemplate.convertAndSend(RabbitDefine.TOPIC_EXCHANGE, routingKey, message); + } + + + /** + * 发送延迟消息 + * + * @param message 发送的信息 + * @param delay 延迟时间 + */ + public void sendDelay(String message, int delay) { + rabbitTemplate.convertAndSend(RabbitDefine.DELAY_EXCHANGE, "delay", message, msg -> { + msg.getMessageProperties().setDelay(delay); + return msg; + }); + } + + /** + * 发送临时消息 + */ + public void sendAndExpire(Object message) { + rabbitTemplate.convertAndSend(RabbitDefine.TTL_QUEUE, message, this.getCorrelationData()); + } + + /** + * 生成消息标识 + */ + private CorrelationData getCorrelationData() { + String messageId = UUID.randomUUID().toString(); + CorrelationData correlationData = new CorrelationData(); + correlationData.setId(messageId); + return correlationData; + } + +} diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDeadConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDeadConfig.java new file mode 100644 index 0000000..1bb54e3 --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDeadConfig.java @@ -0,0 +1,54 @@ +package com.quickstart.mq.rabbitmq.producer.config; + + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * 死信队列,当消息过期时,消息进入死信队列 + * + * @author ding + */ +@Configuration +public class RabbitDeadConfig { + + /** + * 死信交换机 + * + * @return FanoutExchange + */ + @Bean + public DirectExchange deadExchange() { + return ExchangeBuilder.directExchange(RabbitDefine.DEAD_EXCHANGE) + // 开启持久化 + .durable(true) + // 所有消费者都解除订阅此队列,autoDelete=true时,此队列会自动删除 + .autoDelete() + .build(); + } + + /** + * 死信队列 + * + * @return Queue + */ + @Bean + public Queue deadQueue() { + return QueueBuilder.durable(RabbitDefine.DEAD_QUEUE).build(); + } + + /** + * 绑定 + * + * @return Binding + */ + @Bean + public Binding deadBinding(@Qualifier("deadExchange") DirectExchange deadExchange, @Qualifier("deadQueue") Queue deadQueue) { + return BindingBuilder.bind(deadQueue).to(deadExchange).with("dead"); + } + +} diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDelayConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDelayConfig.java new file mode 100644 index 0000000..229d8f7 --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDelayConfig.java @@ -0,0 +1,49 @@ +package com.quickstart.mq.rabbitmq.producer.config; + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 延迟队列 + * + * @author ding + */ +@Configuration +public class RabbitDelayConfig { + + + /** + * 创建延时交换机 + */ + @Bean + public DirectExchange delayExchange() { + return ExchangeBuilder + .directExchange(RabbitDefine.DELAY_EXCHANGE) + // 开启延时 + .delayed() + // 开启持久化 + .durable(true) + .build(); + } + + /** + * 队列 + */ + @Bean + public Queue delayQueue() { + return QueueBuilder + .durable(RabbitDefine.DELAY_QUEUE) + .build(); + } + + /** + * 交换机绑定队列 + */ + @Bean + public Binding delayBinding() { + return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDirectConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDirectConfig.java new file mode 100644 index 0000000..dc5c059 --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitDirectConfig.java @@ -0,0 +1,51 @@ +package com.quickstart.mq.rabbitmq.producer.config; + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * direct消息队列配置 + *

+ * Direct 类型的交换器由路由规则很简单,它会把消息路由到那些 BindingKey 和 RoutingKey 完全匹配的队列中。 + * Direct Exchange 是 RabbitMQ 默认的交换器模式,也是最简单的模式。它根据 RoutingKey 完全匹配去寻找队列。 + *

+ * + * @author ding + */ +@Configuration +public class RabbitDirectConfig { + + /** + * 创建direct Exchange交换机也叫完全匹配交换机 + */ + @Bean + public DirectExchange directExchange() { + return ExchangeBuilder + .directExchange(RabbitDefine.DIRECT_EXCHANGE) + // 开启持久化 + .durable(true) + .build(); + } + + /** + * 普通队列 + */ + @Bean + public Queue directQueue() { + return QueueBuilder + .durable(RabbitDefine.DIRECT_QUEUE) + .build(); + } + + /** + * 交换机绑定队列 + */ + @Bean + public Binding directBinding() { + return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct"); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitFanoutConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitFanoutConfig.java new file mode 100644 index 0000000..f56ff19 --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitFanoutConfig.java @@ -0,0 +1,47 @@ +package com.quickstart.mq.rabbitmq.producer.config; + + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 通配符交换机 + * + * @author ding + */ +@Configuration +public class RabbitFanoutConfig { + + /** + * 创建Fanout Exchange交换机也叫通配符交换机 + */ + @Bean + public FanoutExchange fanoutExchange() { + return ExchangeBuilder + .fanoutExchange(RabbitDefine.FANOUT_EXCHANGE) + // 开启持久化 + .durable(true) + .build(); + } + + /** + * 创建队列 + */ + @Bean + public Queue fanoutQueue() { + return QueueBuilder + .durable(RabbitDefine.FANOUT_QUEUE) + .build(); + } + + /** + * 确定绑定关系,队列和交换机绑定 + */ + @Bean + public Binding fanoutBinding() { + return BindingBuilder.bind(fanoutQueue()).to(fanoutExchange()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTopicConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTopicConfig.java new file mode 100644 index 0000000..d94526d --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTopicConfig.java @@ -0,0 +1,66 @@ +package com.quickstart.mq.rabbitmq.producer.config; + + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * topic与direct类型的交换器类似,也是将消息路由到RoutingKey与BindingKey匹配的队列中, + * 但它不是完全匹配,而是模糊匹配。 + * 规则;#用于匹配一个单词,*用于匹配多个单词(可以是0个);例如:order.*.current。 + * + * @author ding + */ +@Configuration +public class RabbitTopicConfig { + + /** + * 创建Topic Exchange交换机也叫模糊匹配交换机 + */ + @Bean + public TopicExchange topicExchange() { + return ExchangeBuilder + .topicExchange(RabbitDefine.TOPIC_EXCHANGE) + // 开启持久化 + .durable(true) + .build(); + } + + /** + * 创建队列 1 + */ + @Bean + public Queue topicOneQueue() { + return QueueBuilder + .durable(RabbitDefine.TOPIC_QUEUE_ONE) + .build(); + } + + /** + * 创建队列 2 + */ + @Bean + public Queue topicTwoQueue() { + return QueueBuilder + .durable(RabbitDefine.TOPIC_QUEUE_TWO) + .build(); + } + + /** + * 确定绑定关系 + * #用于匹配一个单词 *用于匹配多个单词 + */ + @Bean + public Binding topicOneBinding(@Qualifier("topicOneQueue") Queue topicQueue, @Qualifier("topicExchange") TopicExchange topicExchange) { + return BindingBuilder.bind(topicQueue).to(topicExchange).with("#.queue.one"); + } + + @Bean + public Binding topicTwoBinding(@Qualifier("topicTwoQueue") Queue topicQueue, @Qualifier("topicExchange") TopicExchange topicExchange) { + return BindingBuilder.bind(topicQueue).to(topicExchange).with("#.queue.*"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTtlDirectConfig.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTtlDirectConfig.java new file mode 100644 index 0000000..36459df --- /dev/null +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/config/RabbitTtlDirectConfig.java @@ -0,0 +1,54 @@ +package com.quickstart.mq.rabbitmq.producer.config; + +import com.quickstart.config.RabbitDefine; +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 临时消息队列配置 + * + * @author ding + */ +@Configuration +public class RabbitTtlDirectConfig { + + /** + * 创建direct Exchange交换机也叫完全匹配交换机 + */ + @Bean + public DirectExchange directTtlExchange() { + return ExchangeBuilder + .directExchange(RabbitDefine.TTL_EXCHANGE) + // 开启持久化 + .durable(true) + // 所有消费者都解除订阅此队列,autoDelete=true时,此交换机会自动删除 + //.autoDelete() + .build(); + } + + /** + * 会过期的队列 + */ + @Bean + public Queue directTtlQueue() { + + return QueueBuilder. + durable(RabbitDefine.TTL_QUEUE) + // .ttl()设置队列的过期时间为10秒 + .ttl(10000) + // 配置消息过期后的处理者(死信队列交换机) + .deadLetterExchange(RabbitDefine.DEAD_EXCHANGE) + // 死信队列路由 + .deadLetterRoutingKey("dead") + // 所有消费者都解除订阅此队列,autoDelete=true时,此交换机会自动删除 + // .autoDelete() + .build(); + } + + @Bean + public Binding directTtlBinding() { + return BindingBuilder.bind(directTtlQueue()).to(directTtlExchange()).with("test"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/quickstart/utils/FileUtils.java b/src/main/java/com/quickstart/utils/FileUtils.java new file mode 100644 index 0000000..32b872c --- /dev/null +++ b/src/main/java/com/quickstart/utils/FileUtils.java @@ -0,0 +1,36 @@ +package com.quickstart.utils; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; + +/** + * @Author xiaozq + * @Date 2022/11/18 13:35 + *

@Description:

+ */ +public class FileUtils { + + /** + * 编码文件名 + * 日期路径 + UUID + * 示例:fileName=2022/11/18/统计报表1668758006562.txt + */ + public static final String extractUploadFilename(MultipartFile file) + { + String fileName = file.getOriginalFilename(); + // 注意,这里需要加上 \\ 将 特殊字符 . 转义 \\. ,否则异常 + String[] fileArray = fileName.split("\\."); + fileName = datePath() + "/" + fileArray[0]+System.currentTimeMillis()+"."+fileArray[1]; + return fileName; + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } +} diff --git a/src/main/java/com/quickstart/utils/MinioTemplate.java b/src/main/java/com/quickstart/utils/MinioTemplate.java new file mode 100644 index 0000000..802d190 --- /dev/null +++ b/src/main/java/com/quickstart/utils/MinioTemplate.java @@ -0,0 +1,220 @@ +package com.quickstart.utils; + + +import com.quickstart.entity.ObjectItem; +import io.minio.*; +import io.minio.messages.DeleteObject; +import io.minio.messages.Item; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author xiaozq + * @Date 2022/8/5 10:42 + *

@Description:

+ */ +@Component +public class MinioTemplate { + + @Autowired + private MinioClient minioClient; + + @Value("${minio.bucket}") + public String bucketName; + + @Value("${minio.urlprefix}") + public String urlprefix; + + /** + * 判断bucket是否存在,不存在则创建 + * @param name + */ + public void existBucket(String name){ + try { + boolean exist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + if(!exist){ + minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build()); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + /** + * 创建存储bucket + * @param bucketName 存储bucket名称 + * @return Boolean + */ + public Boolean makeBucket(String bucketName) { + try { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 删除存储bucket + * @param bucketName 存储bucket名称 + * @return Boolean + */ + public Boolean removeBucket(String bucketName) { + try { + minioClient.removeBucket(RemoveBucketArgs.builder() + .bucket(bucketName) + .build()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 文件上传 + * @param file + * @return + */ + public Map upload(MultipartFile file) { + + String filename = FileUtils.extractUploadFilename(file); + try { + InputStream inputStream = file.getInputStream(); + // 上传到minio服务器 + minioClient.putObject(PutObjectArgs.builder() + .bucket(this.bucketName) + .object(filename) + .stream(inputStream, -1L, 10485760L) + .build()); + } catch (Exception e) { + e.printStackTrace(); + } + // 返回地址 + Map resultMap = new HashMap<>(); + resultMap.put("url",filename); + return resultMap; + } + + /** + * 文件下载 + * @param fileName 文件名 + * @param delete 是否删除 + * @throws IOException + */ + public void fileDownload(@RequestParam(name = "fileName") String fileName, + @RequestParam(defaultValue = "false") Boolean delete, + HttpServletResponse response) { + + InputStream inputStream = null; + OutputStream outputStream = null; + try { + if (StringUtils.isBlank(fileName)) { + response.setHeader("Content-type", "text/html;charset=UTF-8"); + String data = "文件下载失败"; + OutputStream ps = response.getOutputStream(); + ps.write(data.getBytes("UTF-8")); + return; + } + + outputStream = response.getOutputStream(); + // 获取文件对象 + inputStream =minioClient.getObject(GetObjectArgs.builder().bucket(this.bucketName).object(fileName).build()); + byte buf[] = new byte[1024]; + int length = 0; + response.reset(); + response.setHeader("Content-Disposition", "attachment;filename=" + + URLEncoder.encode(fileName.substring(fileName.lastIndexOf("/") + 1), "UTF-8")); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); + // 输出文件 + while ((length = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, length); + } + inputStream.close(); + // 判断:下载后是否同时删除minio上的存储文件 + if (BooleanUtils.isTrue(delete)) { + minioClient.removeObject(RemoveObjectArgs.builder().bucket(this.bucketName).object(fileName).build()); + } + } catch (Throwable ex) { + response.setHeader("Content-type", "text/html;charset=UTF-8"); + String data = "文件下载失败"; + try { + OutputStream ps = response.getOutputStream(); + ps.write(data.getBytes("UTF-8")); + }catch (IOException e){ + e.printStackTrace(); + } + } finally { + try { + outputStream.close(); + if (inputStream != null) { + inputStream.close(); + }}catch (IOException e){ + e.printStackTrace(); + } + } + } + + + /** + * 查看文件对象 + * @param bucketName 存储bucket名称 + * @return 存储bucket内文件对象信息 + */ + public List listObjects(String bucketName) { + Iterable> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()); + List objectItems = new ArrayList<>(); + try { + for (Result result : results) { + Item item = result.get(); + + ObjectItem objectItem = new ObjectItem(); + objectItem.setObjectName(item.objectName()); + objectItem.setSize(item.size()); + + objectItems.add(objectItem); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return objectItems; + } + + /** + * 批量删除文件对象 + * @param bucketName 存储bucket名称 + * @param objects 对象名称集合 + */ + public Map removeObjects(String bucketName, List objects) { + Map resultMap = new HashMap<>(); + List dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); + try { + minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); + resultMap.put("mes","删除成功"); + }catch (Exception e){ + e.printStackTrace(); + resultMap.put("mes","网络异常,删除失败"); + } + return resultMap; + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 27e4ef7..1f4a361 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,6 +7,23 @@ rocketmq: group: my-group send-message-timeout: 60000 spring: + # 配置文件上传大小限制 + servlet: + multipart: + max-file-size: 5000MB + max-request-size: 5000MB + rabbitmq: + host: 117.72.41.151 + port: 5672 + username: guest + password: guest + virtualHost: / + # 手动提交ack消息 + listener: + simple: + acknowledge-mode: manual + direct: + acknowledge-mode: manual data: mongodb: host: 124.223.174.88 @@ -44,11 +61,13 @@ xxl: logpath: logretentiondays: 30 minio: - endpoint: http://124.223.174.88:9090 - accessKey: minioadmin - secretKey: minioadmin + endpoint: http://124.223.174.88:9000 + accessKey: root + secretKey: admin123456 secure: false - bucketName: test + bucketName: wzy +logging: + config: classpath:lockback.xml diff --git a/src/main/resources/lockback.xml b/src/main/resources/lockback.xml new file mode 100644 index 0000000..daac5d0 --- /dev/null +++ b/src/main/resources/lockback.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n + + + + + + DEBUG + ACCEPT + DENY + + + + %date %-5level %logger{5} - %msg%n + + UTF-8 + + + ${logPath}/debug.log + + + + >${logPath}/%d{yyyy-MM-dd}/debug/debug-%d{yyyy-MM-dd}.%i.log + + 15 + + 5MB + + 2GB + + true + + + + + + INFO + ACCEPT + DENY + + + + %date %-5level %logger{5} - %msg%n + + UTF-8 + + + ${logPath}/info.log + + + + ${logPath}/%d{yyyy-MM-dd}/info/info-%d{yyyy-MM-dd}.%i.log + + 15 + + 5MB + + 1GB + + true + + + + + + WARN + ACCEPT + DENY + + + + %date %-5level %logger{5} - %msg%n + + UTF-8 + + + ${logPath}/warn.log + + + + ${logPath}/%d{yyyy-MM-dd}/warn/warn-%d{yyyy-MM-dd}.%i.log + + 15 + + 5MB + + 1GB + + true + + + + + + + ERROR + ACCEPT + DENY + + + + %date %-5level %logger{5} - %msg%n + + UTF-8 + + + ${logPath}/error.log + + + + ${logPath}/%d{yyyy-MM-dd}/error/error-%d{yyyy-MM-dd}.%i.log + + 15 + + 5MB + + 1GB + + true + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml deleted file mode 100644 index ba478d2..0000000 --- a/src/main/resources/log4j2.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - /root/workspace/lucenedemo/logs - /root/workspace/lucenedemo/logs/error - /root/workspace/lucenedemo/logs/warn - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/com/quickstart/minio/MinioTest.java b/src/test/java/com/quickstart/minio/MinioTest.java new file mode 100644 index 0000000..9d55229 --- /dev/null +++ b/src/test/java/com/quickstart/minio/MinioTest.java @@ -0,0 +1,92 @@ +package com.quickstart.minio; + +import com.quickstart.WebApplication; +import com.quickstart.config.MinioProperties; +import io.minio.DownloadObjectArgs; +import io.minio.GetObjectArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.io.FileOutputStream; +import java.io.InputStream; + +/** + * @author muguozheng + * @version 1.0.0 + * @createTime 2022/8/30 16:08 + * @description minio测试 + */ +@Slf4j +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = WebApplication.class) +public class MinioTest { + + @Autowired + private MinioHandler minioHandler; + @Autowired + private MinioClient minioClient; + @Autowired + private MinioProperties minioProperties; + + @Test + public void existBucket() { + boolean wzy = minioHandler.existBucket("wzy"); + System.out.println(wzy); + } + @Test + public void createdBucket() { + try { + MakeBucketArgs test = MakeBucketArgs.builder().bucket("test").build(); + minioClient.makeBucket(test); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Test + public void downloadTest() { + String bucketName = minioProperties.getBucketName(); // 存储桶名称 + //String objectName = "Jenkins资料.zip.netdisk.p.downloading"; // 文件在存储桶中的路径 + String objectName = "test.txt"; // 文件在存储桶中的路径 + //String localFilePath = "D:\\test\\Jenkins资料.zip.netdisk.p.downloading"; // 下载到本地的文件路径 + String localFilePath = "D:\\"; // 下载到本地的文件路径 + + try { + // 下载文件 + downloadBigFile(minioClient, bucketName, objectName, localFilePath); + System.out.println("文件下载成功!"); + } catch (Exception e) { + e.printStackTrace(); + } + + } + private void downloadBigFile(MinioClient minioClient, String bucketName, String objectName, String localFilePath) throws Exception{ + // 获取文件流 + DownloadObjectArgs build = DownloadObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .filename(localFilePath).build(); + minioClient.downloadObject(build); + + } + + private void downloadFile(MinioClient minioClient, String bucketName, String objectName, String localFilePath) throws Exception{ + // 获取文件流 + GetObjectArgs build = GetObjectArgs.builder().bucket(bucketName).object(objectName).build(); + try (InputStream inputStream = minioClient.getObject(build)) { + // 将文件流写入本地文件 + try (FileOutputStream outputStream = new FileOutputStream(localFilePath)) { + byte[] buffer = new byte[1024*10]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) >= 0) { + outputStream.write(buffer, 0, bytesRead); + } + } + } + } +} \ No newline at end of file diff --git a/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java b/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java new file mode 100644 index 0000000..fc84151 --- /dev/null +++ b/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java @@ -0,0 +1,42 @@ +package com.quickstart.rabbitMQ; + + +import com.quickstart.mq.rabbitmq.producer.RabbitProducer; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@Slf4j +public class ProducerTest { + + @Autowired + RabbitProducer rabbitProducer; + + @Test + void sendDirect() { + rabbitProducer.sendDirect("直通消息9527!"); + } + + @Test + void sendFanout() { + rabbitProducer.sendFanout("分裂消息6666!"); + } + + @Test + void sendAndExpire() { + rabbitProducer.sendAndExpire("晚上10点老地方不见不散!该消息有效期10秒"); + } + + @Test + void sendDelay() { + rabbitProducer.sendDelay("有内鬼,终止交易~~", 5000); + } + + + @Test + void sendTopic() { + rabbitProducer.sendTopic("放学别走!", "test123.topic.test456"); + } +} diff --git a/src/test/java/com/quickstart/rocketMQProducerTest.java b/src/test/java/com/quickstart/rocketMQ/rocketMQProducerTest.java similarity index 95% rename from src/test/java/com/quickstart/rocketMQProducerTest.java rename to src/test/java/com/quickstart/rocketMQ/rocketMQProducerTest.java index 2bf3b7e..d59de41 100644 --- a/src/test/java/com/quickstart/rocketMQProducerTest.java +++ b/src/test/java/com/quickstart/rocketMQ/rocketMQProducerTest.java @@ -1,4 +1,4 @@ -package com.quickstart; +package com.quickstart.rocketMQ; import com.quickstart.entity.MqMsg; import com.quickstart.service.RocketMqService; diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2.xml deleted file mode 100644 index ba478d2..0000000 --- a/src/test/resources/log4j2.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - /root/workspace/lucenedemo/logs - /root/workspace/lucenedemo/logs/error - /root/workspace/lucenedemo/logs/warn - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file -- Gitee From a40a0422ee5bd0a4d28457dad222857d6bcd4c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Thu, 14 Dec 2023 11:22:49 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20miniotemplete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/quickstart/utils/MinioTemplate.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/quickstart/utils/MinioTemplate.java b/src/main/java/com/quickstart/utils/MinioTemplate.java index 802d190..8febc06 100644 --- a/src/main/java/com/quickstart/utils/MinioTemplate.java +++ b/src/main/java/com/quickstart/utils/MinioTemplate.java @@ -8,7 +8,6 @@ import io.minio.messages.Item; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @@ -35,10 +34,10 @@ public class MinioTemplate { @Autowired private MinioClient minioClient; - @Value("${minio.bucket}") + //@Value("${minio.bucket}") public String bucketName; - @Value("${minio.urlprefix}") + //@Value("${minio.urlprefix}") public String urlprefix; /** -- Gitee From 0a1dad293e9a36c1ddf72306329ecdc9b2e2cc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Thu, 14 Dec 2023 16:16:14 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20miniotemplete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/quickstart/service/impl/EsUserServiceImpl.java | 2 +- src/main/resources/application.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java b/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java index 15bcf4f..f19dec6 100644 --- a/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java +++ b/src/main/java/com/quickstart/service/impl/EsUserServiceImpl.java @@ -141,7 +141,7 @@ public class EsUserServiceImpl implements EsUserService { // ConstantScoreQueryBuilder constantScoreQueryBuilder = QueryBuilders.constantScoreQuery(wildcardQueryBuilder); // builder.query(constantScoreQueryBuilder); // 模糊匹配 - WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("username", "张"); + WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("keyword.username", "张"); builder.query(wildcardQueryBuilder); request.source(builder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1f4a361..4cd57f8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,8 +15,8 @@ spring: rabbitmq: host: 117.72.41.151 port: 5672 - username: guest - password: guest + username: root + password: root virtualHost: / # 手动提交ack消息 listener: -- Gitee From 5d1d735d320024a28774980cf16890fc6b72097f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Thu, 14 Dec 2023 17:06:38 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=B3=A8=E9=87=8A=20rabbitmq=20=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/rabbitmq/consumer/RabbitConsumer.java | 238 +++++++++--------- .../mq/rabbitmq/producer/RabbitProducer.java | 172 ++++++------- .../com/quickstart/rabbitMQ/ProducerTest.java | 84 +++---- 3 files changed, 247 insertions(+), 247 deletions(-) diff --git a/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java b/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java index 97ec57f..a6fc10a 100644 --- a/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java +++ b/src/main/java/com/quickstart/mq/rabbitmq/consumer/RabbitConsumer.java @@ -1,119 +1,119 @@ -package com.quickstart.mq.rabbitmq.consumer; - - -import com.quickstart.config.RabbitDefine; -import com.rabbitmq.client.Channel; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.*; -import org.springframework.amqp.support.AmqpHeaders; -import org.springframework.messaging.handler.annotation.Header; -import org.springframework.stereotype.Component; - -import java.io.IOException; - -/** - * 消费者 - * - * @author ding - */ -@Component -@Slf4j -public class RabbitConsumer { - - /** - * 普通消息 - */ - @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DIRECT_QUEUE)) - public void consumer1(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者1(直通消息)-队列索引:{},接收到消息:{}", tag, message); - channel.basicAck(tag, false); - } - - /** - * 分裂消息 - */ - @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.FANOUT_QUEUE)) - public void consumer2(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者2(分裂消息)-队列索引:{},接收到消息:{}", tag, message); - channel.basicAck(tag, false); - } - - /** - * 临时消息 - */ - @RabbitListener(bindings = { - @QueueBinding( - value = @Queue(value = RabbitDefine.TTL_QUEUE, - arguments = { - // 指定一下死信交换机 - @Argument(name = "x-dead-letter-exchange", value = RabbitDefine.DEAD_EXCHANGE), - // 指定死信交换机的路由key - @Argument(name = "x-dead-letter-routing-key", value = "dead"), - // 指定队列的过期时间 - @Argument(name = "x-message-ttl", value = "10000", type = "java.lang.Long") - }), - exchange = @Exchange(name = RabbitDefine.TTL_EXCHANGE), - key = "test" - ) - }) - public void consumer3(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者3(临时消息)-队列索引:{},接收到消息:{}", tag, message); - channel.basicAck(tag, false); - } - - /** - * 延时消息 - */ - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = RabbitDefine.DELAY_QUEUE), - exchange = @Exchange(name = RabbitDefine.DELAY_EXCHANGE, delayed = "true"), - key = "delay")) - public void consumer4(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者4(延时队列)-队列索引:{},接收到消息:{}", tag, message); - try { - // 接收成功 - channel.basicAck(tag, false); - } catch (Exception e) { - log.error("发生异常,消息签收失败"); - // 第三个参数 requeue = true为将消息重返当前消息队列,还可以重新发送给消费者 - channel.basicNack(tag, false, true); - } - } - - /** - * topic消息1 - */ - @RabbitListener(bindings = @QueueBinding( - value = @Queue(value = RabbitDefine.TOPIC_QUEUE_ONE, autoDelete = "false", durable = "true"), - exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), - key = "#.topic.#" - )) - public void consumer5(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者5(topic模式one)-队列索引:{},接收到消息:{}", tag, message); - channel.basicAck(tag, false); - } - - /** - * topic消息2 - */ - @RabbitListener(bindings = @QueueBinding( - value = @Queue(value = RabbitDefine.TOPIC_QUEUE_TWO, autoDelete = "false", durable = "true"), - exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), - key = "#.topic.#" - )) - public void consumer6(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者6(topic模式two)-队列索引:{},接收到消息:{}", tag, message); - channel.basicAck(tag, false); - } - - /** - * 死信队列消息 - */ - @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DEAD_QUEUE)) - public void consumer7(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { - log.info("消费者7(死信队列)-队列索引:{},接收到过期消息:{}", tag, message); - channel.basicAck(tag, false); - } - -} +//package com.quickstart.mq.rabbitmq.consumer; +// +// +//import com.quickstart.config.RabbitDefine; +//import com.rabbitmq.client.Channel; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.amqp.core.ExchangeTypes; +//import org.springframework.amqp.rabbit.annotation.*; +//import org.springframework.amqp.support.AmqpHeaders; +//import org.springframework.messaging.handler.annotation.Header; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +// +///** +// * 消费者 +// * +// * @author ding +// */ +//@Component +//@Slf4j +//public class RabbitConsumer { +// +// /** +// * 普通消息 +// */ +// @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DIRECT_QUEUE)) +// public void consumer1(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者1(直通消息)-队列索引:{},接收到消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +// /** +// * 分裂消息 +// */ +// @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.FANOUT_QUEUE)) +// public void consumer2(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者2(分裂消息)-队列索引:{},接收到消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +// /** +// * 临时消息 +// */ +// @RabbitListener(bindings = { +// @QueueBinding( +// value = @Queue(value = RabbitDefine.TTL_QUEUE, +// arguments = { +// // 指定一下死信交换机 +// @Argument(name = "x-dead-letter-exchange", value = RabbitDefine.DEAD_EXCHANGE), +// // 指定死信交换机的路由key +// @Argument(name = "x-dead-letter-routing-key", value = "dead"), +// // 指定队列的过期时间 +// @Argument(name = "x-message-ttl", value = "10000", type = "java.lang.Long") +// }), +// exchange = @Exchange(name = RabbitDefine.TTL_EXCHANGE), +// key = "test" +// ) +// }) +// public void consumer3(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者3(临时消息)-队列索引:{},接收到消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +// /** +// * 延时消息 +// */ +// @RabbitListener(bindings = @QueueBinding( +// value = @Queue(name = RabbitDefine.DELAY_QUEUE), +// exchange = @Exchange(name = RabbitDefine.DELAY_EXCHANGE, delayed = "true"), +// key = "delay")) +// public void consumer4(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者4(延时队列)-队列索引:{},接收到消息:{}", tag, message); +// try { +// // 接收成功 +// channel.basicAck(tag, false); +// } catch (Exception e) { +// log.error("发生异常,消息签收失败"); +// // 第三个参数 requeue = true为将消息重返当前消息队列,还可以重新发送给消费者 +// channel.basicNack(tag, false, true); +// } +// } +// +// /** +// * topic消息1 +// */ +// @RabbitListener(bindings = @QueueBinding( +// value = @Queue(value = RabbitDefine.TOPIC_QUEUE_ONE, autoDelete = "false", durable = "true"), +// exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), +// key = "#.topic.#" +// )) +// public void consumer5(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者5(topic模式one)-队列索引:{},接收到消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +// /** +// * topic消息2 +// */ +// @RabbitListener(bindings = @QueueBinding( +// value = @Queue(value = RabbitDefine.TOPIC_QUEUE_TWO, autoDelete = "false", durable = "true"), +// exchange = @Exchange(value = RabbitDefine.TOPIC_EXCHANGE, type = ExchangeTypes.TOPIC), +// key = "#.topic.#" +// )) +// public void consumer6(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者6(topic模式two)-队列索引:{},接收到消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +// /** +// * 死信队列消息 +// */ +// @RabbitListener(queuesToDeclare = @Queue(RabbitDefine.DEAD_QUEUE)) +// public void consumer7(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { +// log.info("消费者7(死信队列)-队列索引:{},接收到过期消息:{}", tag, message); +// channel.basicAck(tag, false); +// } +// +//} diff --git a/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java b/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java index fd5404d..946a41d 100644 --- a/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java +++ b/src/main/java/com/quickstart/mq/rabbitmq/producer/RabbitProducer.java @@ -1,86 +1,86 @@ -package com.quickstart.mq.rabbitmq.producer; - - -import com.quickstart.config.RabbitDefine; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.connection.CorrelationData; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.stereotype.Component; - -import java.util.UUID; - - -/** - * 消息提供者 - * - * @author ding - */ -@Component -@RequiredArgsConstructor -@Slf4j -public class RabbitProducer { - - private final RabbitTemplate rabbitTemplate; - - /** - * 直接模式发送消息 - * - * @param message 发送的信息 - */ - public void sendDirect(Object message) { - rabbitTemplate.convertAndSend(RabbitDefine.DIRECT_QUEUE, message, this.getCorrelationData()); - } - - /** - * 分裂模式发送消息 - * - * @param message 发送的信息 - */ - public void sendFanout(Object message) { - rabbitTemplate.convertAndSend(RabbitDefine.FANOUT_EXCHANGE, "", message); - } - - - /** - * 主题模式发送消息 - * - * @param message 发送的信息 - * @param routingKey 匹配的队列名 - */ - public void sendTopic(Object message, String routingKey) { - rabbitTemplate.convertAndSend(RabbitDefine.TOPIC_EXCHANGE, routingKey, message); - } - - - /** - * 发送延迟消息 - * - * @param message 发送的信息 - * @param delay 延迟时间 - */ - public void sendDelay(String message, int delay) { - rabbitTemplate.convertAndSend(RabbitDefine.DELAY_EXCHANGE, "delay", message, msg -> { - msg.getMessageProperties().setDelay(delay); - return msg; - }); - } - - /** - * 发送临时消息 - */ - public void sendAndExpire(Object message) { - rabbitTemplate.convertAndSend(RabbitDefine.TTL_QUEUE, message, this.getCorrelationData()); - } - - /** - * 生成消息标识 - */ - private CorrelationData getCorrelationData() { - String messageId = UUID.randomUUID().toString(); - CorrelationData correlationData = new CorrelationData(); - correlationData.setId(messageId); - return correlationData; - } - -} +//package com.quickstart.mq.rabbitmq.producer; +// +// +//import com.quickstart.config.RabbitDefine; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.amqp.rabbit.connection.CorrelationData; +//import org.springframework.amqp.rabbit.core.RabbitTemplate; +//import org.springframework.stereotype.Component; +// +//import java.util.UUID; +// +// +///** +// * 消息提供者 +// * +// * @author ding +// */ +//@Component +//@RequiredArgsConstructor +//@Slf4j +//public class RabbitProducer { +// +// private final RabbitTemplate rabbitTemplate; +// +// /** +// * 直接模式发送消息 +// * +// * @param message 发送的信息 +// */ +// public void sendDirect(Object message) { +// rabbitTemplate.convertAndSend(RabbitDefine.DIRECT_QUEUE, message, this.getCorrelationData()); +// } +// +// /** +// * 分裂模式发送消息 +// * +// * @param message 发送的信息 +// */ +// public void sendFanout(Object message) { +// rabbitTemplate.convertAndSend(RabbitDefine.FANOUT_EXCHANGE, "", message); +// } +// +// +// /** +// * 主题模式发送消息 +// * +// * @param message 发送的信息 +// * @param routingKey 匹配的队列名 +// */ +// public void sendTopic(Object message, String routingKey) { +// rabbitTemplate.convertAndSend(RabbitDefine.TOPIC_EXCHANGE, routingKey, message); +// } +// +// +// /** +// * 发送延迟消息 +// * +// * @param message 发送的信息 +// * @param delay 延迟时间 +// */ +// public void sendDelay(String message, int delay) { +// rabbitTemplate.convertAndSend(RabbitDefine.DELAY_EXCHANGE, "delay", message, msg -> { +// msg.getMessageProperties().setDelay(delay); +// return msg; +// }); +// } +// +// /** +// * 发送临时消息 +// */ +// public void sendAndExpire(Object message) { +// rabbitTemplate.convertAndSend(RabbitDefine.TTL_QUEUE, message, this.getCorrelationData()); +// } +// +// /** +// * 生成消息标识 +// */ +// private CorrelationData getCorrelationData() { +// String messageId = UUID.randomUUID().toString(); +// CorrelationData correlationData = new CorrelationData(); +// correlationData.setId(messageId); +// return correlationData; +// } +// +//} diff --git a/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java b/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java index fc84151..6b90772 100644 --- a/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java +++ b/src/test/java/com/quickstart/rabbitMQ/ProducerTest.java @@ -1,42 +1,42 @@ -package com.quickstart.rabbitMQ; - - -import com.quickstart.mq.rabbitmq.producer.RabbitProducer; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -@Slf4j -public class ProducerTest { - - @Autowired - RabbitProducer rabbitProducer; - - @Test - void sendDirect() { - rabbitProducer.sendDirect("直通消息9527!"); - } - - @Test - void sendFanout() { - rabbitProducer.sendFanout("分裂消息6666!"); - } - - @Test - void sendAndExpire() { - rabbitProducer.sendAndExpire("晚上10点老地方不见不散!该消息有效期10秒"); - } - - @Test - void sendDelay() { - rabbitProducer.sendDelay("有内鬼,终止交易~~", 5000); - } - - - @Test - void sendTopic() { - rabbitProducer.sendTopic("放学别走!", "test123.topic.test456"); - } -} +//package com.quickstart.rabbitMQ; +// +// +//import com.quickstart.mq.rabbitmq.producer.RabbitProducer; +//import lombok.extern.slf4j.Slf4j; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +// +//@SpringBootTest +//@Slf4j +//public class ProducerTest { +// +// @Autowired +// RabbitProducer rabbitProducer; +// +// @Test +// void sendDirect() { +// rabbitProducer.sendDirect("直通消息9527!"); +// } +// +// @Test +// void sendFanout() { +// rabbitProducer.sendFanout("分裂消息6666!"); +// } +// +// @Test +// void sendAndExpire() { +// rabbitProducer.sendAndExpire("晚上10点老地方不见不散!该消息有效期10秒"); +// } +// +// @Test +// void sendDelay() { +// rabbitProducer.sendDelay("有内鬼,终止交易~~", 5000); +// } +// +// +// @Test +// void sendTopic() { +// rabbitProducer.sendTopic("放学别走!", "test123.topic.test456"); +// } +//} -- Gitee From 3a016c606413e50802bbf8fa5f2f27235be86a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Fri, 15 Dec 2023 17:24:32 +0800 Subject: [PATCH 7/8] jpa --- pom.xml | 35 ++++++---- .../com/quickstart/entity/model/Article.java | 68 +++++++++++++++++++ .../com/quickstart/entity/model/Comment.java | 64 +++++++++++++++++ .../repository/ArticleRepository.java | 13 ++++ src/main/resources/application.yml | 10 +-- .../com/quickstart/jpa/JpaRepositoryTest.java | 30 ++++++++ 6 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/quickstart/entity/model/Article.java create mode 100644 src/main/java/com/quickstart/entity/model/Comment.java create mode 100644 src/main/java/com/quickstart/repository/ArticleRepository.java create mode 100644 src/test/java/com/quickstart/jpa/JpaRepositoryTest.java diff --git a/pom.xml b/pom.xml index 84f7b15..23abea9 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,15 @@ mybatis-plus-boot-starter 3.4.3 + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-data-jpa + com.alibaba druid-spring-boot-starter @@ -75,64 +84,64 @@ rocketmq-client 4.4.0 - + org.springframework.boot spring-boot-starter-aop - + com.xuxueli xxl-job-core 2.3.1 - + org.apache.logging.log4j log4j-core 2.6.2 - + org.apache.logging.log4j log4j-api 2.6.2 - + org.elasticsearch.client elasticsearch-rest-high-level-client 7.3.1 - + org.elasticsearch.client elasticsearch-rest-client 7.3.1 - + org.elasticsearch elasticsearch 7.3.1 - + org.springframework.boot spring-boot-starter-data-mongodb - + junit junit test - + io.minio minio 8.3.9 - + okhttp @@ -140,13 +149,13 @@ - + com.squareup.okhttp3 okhttp 4.9.0 - + org.springframework.boot spring-boot-starter-amqp diff --git a/src/main/java/com/quickstart/entity/model/Article.java b/src/main/java/com/quickstart/entity/model/Article.java new file mode 100644 index 0000000..7926ea8 --- /dev/null +++ b/src/main/java/com/quickstart/entity/model/Article.java @@ -0,0 +1,68 @@ +package com.quickstart.entity.model; + +import javax.persistence.*; +import java.util.List; + +/** + * 功能:文章实体类 + * 日期:2023年06月13日 + * 作者:梁辰兴 + */ +@Entity(name = "t_article") +public class Article { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Integer id; + @Column(name = "title") + private String title; + @Column(name = "content") + private String content; + // 查询时将子表一并查询出来 + @OneToMany(fetch = FetchType.EAGER) // FetchType.LAZY 懒加载 + @JoinTable(name = "t_comment", joinColumns = {@JoinColumn(name = "a_id")}, + inverseJoinColumns = {@JoinColumn(name = "id")}) + private List commentList; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public List getCommentList() { + return commentList; + } + + public void setCommentList(List commentList) { + this.commentList = commentList; + } + + @Override + public String toString() { + return "Article{" + + "id=" + id + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", commentList=" + commentList + + '}'; + } +} diff --git a/src/main/java/com/quickstart/entity/model/Comment.java b/src/main/java/com/quickstart/entity/model/Comment.java new file mode 100644 index 0000000..39496ff --- /dev/null +++ b/src/main/java/com/quickstart/entity/model/Comment.java @@ -0,0 +1,64 @@ +package com.quickstart.entity.model; + +import javax.persistence.*; + +/** + * 功能:评论实体类 + * 日期:2023年06月13日 + * 作者:梁辰兴 + */ +@Entity(name = "t_comment") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Integer id; + @Column(name = "content") + private String content; + @Column(name = "author") + private String author; + @Column(name = "a_id") + private Integer aId; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public Integer getaId() { + return aId; + } + + public void setaId(Integer aId) { + this.aId = aId; + } + + @Override + public String toString() { + return "Comment{" + + "id=" + id + + ", content='" + content + '\'' + + ", author='" + author + '\'' + + ", aId=" + aId + + '}'; + } +} diff --git a/src/main/java/com/quickstart/repository/ArticleRepository.java b/src/main/java/com/quickstart/repository/ArticleRepository.java new file mode 100644 index 0000000..1d87ead --- /dev/null +++ b/src/main/java/com/quickstart/repository/ArticleRepository.java @@ -0,0 +1,13 @@ +package com.quickstart.repository; + + +import com.quickstart.entity.model.Article; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * 功能:文章仓库接口 + * 日期:2023年06月13日 + * 作者:梁辰兴 + */ +public interface ArticleRepository extends JpaRepository { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4cd57f8..f646188 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,16 +35,10 @@ spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://124.223.174.88:3306/xxl_job?serverTimezone=UTC + url: jdbc:mysql://localhost:3306/quickstart?serverTimezone=UTC + #url: jdbc:mysql://124.223.174.88:3306/xxl_job?serverTimezone=UTC username: root password: root -mybatis-plus: - global-config: - db-config: - table-prefix: tbl_ - id-type: auto - configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl elasticsearch: host: 124.223.174.88 port: 9200 diff --git a/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java b/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java new file mode 100644 index 0000000..ec0566b --- /dev/null +++ b/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java @@ -0,0 +1,30 @@ +package com.quickstart.jpa; + +import com.quickstart.entity.model.Article; +import com.quickstart.repository.ArticleRepository; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +/** + * @author cloud + * @version 1.0 + * @description: TODO + * @date 2023/12/15 16:42 + */ +@SpringBootTest +public class JpaRepositoryTest { + @Autowired + private ArticleRepository articleRepository; + + @Test // 测试查询全部记录 + public void testFindAll() { + // 查询全部文章记录 + List
articles = articleRepository.findAll(); + // 遍历输出文章列表 + articles.forEach(System.out::println); + } + +} -- Gitee From 8e694532372722828c345a72c2cbf5267f8a59d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=86=E9=A9=BF?= Date: Mon, 18 Dec 2023 10:57:21 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20jpa=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/quickstart/WebApplication.java | 2 ++ src/main/java/com/quickstart/entity/model/Article.java | 1 + .../com/quickstart/repository/ArticleRepository.java | 2 ++ src/main/resources/application.yml | 9 ++++++++- src/test/java/com/quickstart/jpa/JpaRepositoryTest.java | 8 ++++++-- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/quickstart/WebApplication.java b/src/main/java/com/quickstart/WebApplication.java index 81cd590..78c18df 100644 --- a/src/main/java/com/quickstart/WebApplication.java +++ b/src/main/java/com/quickstart/WebApplication.java @@ -3,11 +3,13 @@ package com.quickstart; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; /** * @author ding */ +@EnableJpaRepositories(basePackages = "com.quickstart.repository") @SpringBootApplication @Slf4j public class WebApplication { diff --git a/src/main/java/com/quickstart/entity/model/Article.java b/src/main/java/com/quickstart/entity/model/Article.java index 7926ea8..7800757 100644 --- a/src/main/java/com/quickstart/entity/model/Article.java +++ b/src/main/java/com/quickstart/entity/model/Article.java @@ -8,6 +8,7 @@ import java.util.List; * 日期:2023年06月13日 * 作者:梁辰兴 */ + @Entity(name = "t_article") public class Article { @Id diff --git a/src/main/java/com/quickstart/repository/ArticleRepository.java b/src/main/java/com/quickstart/repository/ArticleRepository.java index 1d87ead..b82dd00 100644 --- a/src/main/java/com/quickstart/repository/ArticleRepository.java +++ b/src/main/java/com/quickstart/repository/ArticleRepository.java @@ -3,11 +3,13 @@ package com.quickstart.repository; import com.quickstart.entity.model.Article; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; /** * 功能:文章仓库接口 * 日期:2023年06月13日 * 作者:梁辰兴 */ +@Repository public interface ArticleRepository extends JpaRepository { } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f646188..c882c76 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,10 +35,17 @@ spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/quickstart?serverTimezone=UTC + url: jdbc:mysql://124.223.174.88:3306/quickstart?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false #url: jdbc:mysql://124.223.174.88:3306/xxl_job?serverTimezone=UTC username: root password: root + jpa: + hibernate: + ddl-auto: update + # 更新或者创建数据表结构 + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + # 控制台显示SQL + show-sql: true elasticsearch: host: 124.223.174.88 port: 9200 diff --git a/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java b/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java index ec0566b..66383a5 100644 --- a/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java +++ b/src/test/java/com/quickstart/jpa/JpaRepositoryTest.java @@ -1,10 +1,13 @@ package com.quickstart.jpa; +import com.quickstart.WebApplication; import com.quickstart.entity.model.Article; import com.quickstart.repository.ArticleRepository; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @@ -14,10 +17,11 @@ import java.util.List; * @description: TODO * @date 2023/12/15 16:42 */ -@SpringBootTest +@RunWith(SpringRunner.class) +@SpringBootTest(classes = WebApplication.class ) public class JpaRepositoryTest { @Autowired - private ArticleRepository articleRepository; + public ArticleRepository articleRepository; @Test // 测试查询全部记录 public void testFindAll() { -- Gitee