001--什么是SpringData

SpringData作为Spring框架的子项目,旨在提供一种统一且简化的方式来处理各种类型的持久化存储,无论是关系型数据库还是NoSQL数据库。它通过提供通用的数据访问接口(如CrudRepository和PagingAndSortingRepository)来减少开发人员在数据访问层的工作量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.参考网址:https://blog.youkuaiyun.com/zgf19930504/article/details/50537198

2.核心内容:

** Spring Data **是Spring 的一个子项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等。Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。

一: Spring data 包含内容

1096351-06a90c3a0d41f05b
image

二:统一各类型持久化数据库

1096351-d6afc633e5e24c31
image

三 简化数据库操作,减少数据访问层 (DAO) 的开发量.

Spring Data则提供了基于这些层面的统一接口(CrudRepository,PagingAndSortingRepository)以及对持久化存储的实现。

1096351-4fcdff9be52a796d
image
<think>根据用户的问题和提供的引用内容,用户需要的是Spring AMQP 2.1.8.RELEASE版本中关于publisher-confirm的正确配置方式。从引用[1]和引用[2]中可以看出,不同版本的Spring Boot中配置方式有所不同。 在Spring Boot 2.1.x版本(对应Spring AMQP 2.1.x)中,配置生产者确认机制(publisher confirm)使用的是`spring.rabbitmq.publisher-confirms`属性(注意是`publisher-confirms`,而不是`publisher-confirm-type`)。同时,对于消息返回机制(publisher return)使用的是`spring.rabbitmq.publisher-returns`属性。 另外,还需要设置`rabbitTemplate`的`mandatory`属性为`true`,以确保消息无法路由时能够触发return回调。 因此,针对Spring Boot 2.1.8.RELEASE(即Spring AMQP 2.1.8.RELEASE)的配置示例如下: ### 1. **application.yml配置** ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest # 开启生产者确认(confirm)模式 publisher-confirms: true # 注意:这里是publisher-confirms,不是publisher-confirm-type # 开启生产者消息返回(return)模式 publisher-returns: true # 注意:这里是publisher-returns template: # 设置mandatory为true,确保消息无法路由时能够返回给生产者 mandatory: true ``` ### 2. **配置ConfirmCallback和ReturnCallback** 在代码中,需要为`RabbitTemplate`设置`ConfirmCallback`和`ReturnCallback`。注意,在2.1.8版本中,设置ConfirmCallback的方式是调用`setConfirmCallback`方法,设置ReturnCallback的方式是调用`setReturnCallback`方法(在更高版本中,ReturnCallback改为了`setReturnsCallback`,但2.1.8版本使用的是`setReturnCallback`)。 ```java import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class RabbitConfig { @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void init() { // 设置ConfirmCallback rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { if (ack) { System.out.println("消息发送到Exchange成功: " + correlationData); } else { System.err.println("消息发送到Exchange失败: " + cause); } } }); // 设置ReturnCallback(注意:2.1.8版本使用setReturnCallback) rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> { System.err.println("消息从Exchange路由到Queue失败: " + message); System.err.println("失败原因: " + replyText); }); } } ``` ### 3. **发送消息** 发送消息时,可以携带一个`CorrelationData`对象(用于在confirm回调中关联消息),但这不是必须的。如果不携带,则confirm回调中的`correlationData`为`null`。 ```java rabbitTemplate.convertAndSend("exchangeName", "routingKey", message, new CorrelationData("msgId-1")); ``` ### 关键点说明: 1. **配置属性**:在2.1.8版本中,使用`publisher-confirms: true`开启确认机制,使用`publisher-returns: true`开启返回机制[^2]。 2. **回调设置**: - `ConfirmCallback`用于处理消息是否成功发送到Exchange的回调。 - `ReturnCallback`用于处理消息成功发送到Exchange但未能路由到任何Queue的情况(需要`mandatory=true`)[^4]。 3. **版本差异**:在Spring Boot 2.3.x及以上版本(对应Spring AMQP 2.3.x)中,配置方式发生了变化: - `publisher-confirms`被`publisher-confirm-type`替代(可选值:`none`、`simple`、`correlated`)。 - `publisher-returns`仍然保留。 - `ReturnCallback`被替换为`ReturnsCallback`(方法名变为`setReturnsCallback`)。 ### 注意事项: - 确保在配置文件中设置了`mandatory: true`(或在`rabbitTemplate`中设置),否则即使消息无法路由也不会触发ReturnCallback。 - `CorrelationData`可以用于在回调中关联消息(如消息ID),方便进行业务处理。 ### 工作流程: ```mermaid graph LR A[生产者] -- 发送消息 --> B[Exchange] B -- 成功 --> C[ConfirmCallback: ack=true] B -- 失败 --> D[ConfirmCallback: ack=false] B -- 路由到Queue --> E[成功] B -- 无法路由 --> F[ReturnCallback] ``` > 注意:在2.1.8版本中,如果消息无法路由到任何队列且没有设置备份交换机(alternate exchange),则会触发ReturnCallback。如果同时设置了备份交换机,则消息会被路由到备份交换机,不会触发ReturnCallback。 ### 常见问题排查: 1. **ConfirmCallback未触发**:检查配置`publisher-confirms`是否为`true`,以及是否设置了`ConfirmCallback`。 2. **ReturnCallback未触发**:检查是否设置了`publisher-returns: true`和`mandatory: true`。 §§相关问题§§ 1. Spring Boot 2.3.x版本中如何配置生产者确认机制? 2. 如何为RabbitMQ消息设置全局唯一ID以便在ConfirmCallback中追踪? 3. RabbitTemplate的mandatory属性具体作用是什么? 4. 在消息无法路由时,备份交换机和ReturnCallback哪个优先级更高? 5. 如何测试生产者确认和返回机制?</think>### Spring AMQP 2.1.8.RELEASE 配置指南(publisher-confirm) 在 Spring Boot 2.1.x(对应 Spring AMQP 2.1.8.RELEASE)中,生产者确认机制的配置与新版不同,需使用 **`publisher-confirms`** 而非 `publisher-confirm-type`。以下是完整配置示例: #### 1. **application.yml 配置** ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest # 开启生产者确认机制(confirm) publisher-confirms: true # 关键配置项 # 开启消息返回机制(return) publisher-returns: true # 用于处理不可路由消息 template: # 强制消息返回(需与publisher-returns配合) mandatory: true ``` #### 2. **Java 配置类** ```java @Configuration public class RabbitConfig { @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate template = new RabbitTemplate(connectionFactory); // 1. 设置Confirm回调 template.setConfirmCallback((correlationData, ack, cause) -> { if (ack) { System.out.println("消息到达Exchange成功: " + correlationData); } else { System.err.println("消息到达Exchange失败: " + cause); } }); // 2. 设置Return回调(消息无法路由时触发) template.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> { System.err.println("消息无法路由: " + new String(message.getBody())); System.err.println("退回原因: " + replyText); }); return template; } } ``` #### 3. **消息发送示例** ```java @Service public class MessageSender { @Autowired private RabbitTemplate rabbitTemplate; public void sendWithConfirm(String exchange, String routingKey, String message) { // 创建关联数据(用于confirm回调识别) CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); // 发送消息 rabbitTemplate.convertAndSend( exchange, routingKey, message, correlationData // 携带关联数据 ); } } ``` ### 关键差异说明(2.1.8 vs 2.3+) | **配置项** | 2.1.8 版本 | 2.3+ 版本 | |--------------------|----------------------------|---------------------------| | **确认机制开关** | `publisher-confirms: true` | `publisher-confirm-type: correlated` | | **回调接口** | `setConfirmCallback` | `setConfirmCallback` | | **返回机制** | `setReturnCallback` | `setReturnsCallback` | ### 工作流程 ```mermaid sequenceDiagram Producer->>+RabbitTemplate: convertAndSend() RabbitTemplate->>+Exchange: 发送消息 alt 到达Exchange成功 Exchange-->>-RabbitTemplate: 触发ConfirmCallback(ack=true) alt 可路由到队列 Exchange->>Queue: 投递消息 else 无法路由 Exchange-->>-RabbitTemplate: 触发ReturnCallback end else 到达Exchange失败 Exchange-->>-RabbitTemplate: 触发ConfirmCallback(ack=false) end ``` ### 注意事项 1. **`mandatory=true` 必须配置** 确保消息无法路由时能触发 `ReturnCallback`[^2] 2. **`CorrelationData` 作用** ```java // 发送时携带 rabbitTemplate.convertAndSend(exchange, key, msg, new CorrelationData("MSG-001")); // 在回调中识别 confirmCallback(CorrelationData data, boolean ack, String cause) { if(data != null) System.out.println("消息ID: " + data.getId()); } ``` 3. **性能影响** 同步确认模式(旧版默认)会阻塞线程,建议在关键业务消息中使用,非关键消息改用异步确认。 > **最佳实践**:生产环境建议结合备份交换机(Alternate Exchange)处理不可路由消息[^1]: > ```yaml > spring: > rabbitmq: > template: > exchange: "main.exchange" > # 声明备份交换机 > cache: > channel: > size: 32 > # 在代码中声明备份交换机绑定 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值