@Component @RequiredArgsConstructor public class PublisherConfirmAndReturnConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback { private final RabbitTemplate rabbitTemplate; //todo 11.20 this @PostConstruct public void init(){ rabbitTemplate.setConfirmCallback(this); rabbitTemplate.setReturnsCallback(this); } @Override //重写接口中抽象方法 public void confirm(CorrelationData correlationData, boolean ack, String s) { if (ack) { System.out.println("收到了producer发送的消息"); }else { System.out.println("没有收到消息"); } }}
时间: 2024-02-14 18:24:28 浏览: 149
这是一个使用了Spring AMQP框架的RabbitMQ的生产者确认和返回配置类,它实现了RabbitTemplate.ConfirmCallback和RabbitTemplate.ReturnsCallback接口,并通过构造函数注入了RabbitTemplate对象。在init()方法中,将该类的实例作为回调函数设置给RabbitTemplate的ConfirmCallback和ReturnsCallback。当消息成功发送到RabbitMQ并被确认时,confirm()方法会被调用,如果ack为true,则表示消息已被确认。如果ack为false,则表示消息未被确认。如果消息未被路由到任何队列,则会调用ReturnsCallback方法。
相关问题
@Component("initRun") public class InitRun implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(InitRun.class); @Resource private DataSource dataSource; @Resource private RedisComponent redisCo
这段代码定义了一个名为 `InitRun` 的类,使用了 `@Component` 注解表示它是一个 Spring 组件,并实现了 `ApplicationRunner` 接口,表示在 Spring 应用程序启动完成后要执行的初始化操作。
在这个类中,使用了 `@Resource` 注解注入了两个依赖:`DataSource` 和 `RedisComponent`,这些依赖在 Spring 容器中被创建和管理。`DataSource` 对象表示一个数据库连接池,用于管理连接到数据库的连接;`RedisComponent` 对象表示一个 Redis 客户端,用于操作 Redis 数据库。
在 `InitRun` 类中,实现了 `ApplicationRunner` 接口的 `run()` 方法,这个方法在 Spring 应用程序启动完成后会被执行。在这个方法中,可以编写一些初始化操作,例如连接数据库、初始化数据、启动定时任务等等。这些操作可以使用注入的 `DataSource` 和 `RedisComponent` 对象进行。在执行完初始化操作后,应用程序就可以正常运行了。
我把我现在的代码给你看下,报错的是:"Parameter 0 of method setTaskletService in com.uniinclusive.jxgfcs.taskletimpl.TaskletContext required a single bean, but 10 were found",代码内容如下: @Component public class TaskletContext<T> { private TaskletService<T> taskletService; @Autowired public void setTaskletService(TaskletService<T> taskletService) { this.taskletService = taskletService; } public List<T> executeTaskletService(List<String> strList, Map<String,Object> map) throws ParseException { return taskletService.match(strList,map); } } @Component public interface TaskletService<T> { List<T> match(List<String> strList, Map<String,Object> map) throws ParseException; } @Component public class ADLoanEntity4Tasklet implements TaskletService<LoanEntity> { @Override public List<LoanEntity> match(List<String> strList, Map<String, Object> map) throws ParseException { List<LoanEntity> list = new ArrayList<>(); return list; } } @Component public class AFFLoanEntity4Tasklet implements TaskletService<LoanEntity> { @Resource private LoanDao loanDao; //字符长度 private final int strLength = 22; @Override public List<LoanEntity> match(List<String> strList, Map<String,Object> map) throws ParseException { List<LoanEntity> list = new ArrayList<>(); return list; } }
根据你提供的代码,出现报错的原因是在 `TaskletContext` 类的 `setTaskletService` 方法中存在多个符合条件的 `TaskletService<T>` bean。
为了解决这个问题,你可以尝试以下几种方法:
1. 使用 `@Qualifier` 注解明确指定要注入的 bean。你可以在 `setTaskletService` 方法上添加 `@Qualifier` 注解,并指定要注入的 bean 的名称,如下所示:
```java
@Autowired
public void setTaskletService(@Qualifier("adLoanEntity4Tasklet") TaskletService<T> taskletService) {
this.taskletService = taskletService;
}
```
在这个示例中,我们使用 `@Qualifier("adLoanEntity4Tasklet")` 来明确指定要注入的是名为 "adLoanEntity4Tasklet" 的 bean。请确保在相应的类上添加了 `@Component("adLoanEntity4Tasklet")` 注解来标识该 bean。
2. 使用 `@Primary` 注解来指定默认的 bean。你可以在实现 `TaskletService<T>` 接口的类上添加 `@Primary` 注解,如下所示:
```java
@Component
@Primary
public class ADLoanEntity4Tasklet implements TaskletService<LoanEntity> {
// ...
}
```
在这个示例中,我们使用 `@Primary` 注解来标识 `ADLoanEntity4Tasklet` 类是默认的 bean。当存在多个匹配的 bean 时,Spring 会优先选择带有 `@Primary` 注解的 bean。
3. 手动指定要注入的 bean。你可以直接在 `main` 方法中手动指定要注入的 bean,如下所示:
```java
public static void main(String[] args) {
// ...
// 使用 ADLoanEntity4Tasklet 执行
main.taskletContext.setTaskletService(main.adLoanEntity4Tasklet);
// ...
// 使用 AFFLoanEntity4Tasklet 执行
main.taskletContext.setTaskletService(main.affLoanEntity4Tasklet);
// ...
}
```
在这个示例中,我们手动指定了要注入的 `adLoanEntity4Tasklet` 和 `affLoanEntity4Tasklet` 对象。
请根据你的实际需求选择适合的解决方法,并确保只有一个唯一的 bean 被注入到 `setTaskletService` 方法中。如果问题仍然存在,请提供更多的代码和配置信息,以便我更好地帮助你解决问题。
阅读全文
相关推荐

















