【发布时间】:2018-07-20 19:22:29
【问题描述】:
假设我有一个配置类(JmsQueueConfig,见下文)。在这个类中,我想为我的整个应用程序配置多个队列。对于一个队列,没有问题。但是,当我添加第二个队列并尝试从服务 (MemberService) 中使用其中一个队列时,Spring-boot 会告诉我
构造函数的参数1 in com.example.notification.application.jms.JmsEventPublisher 需要一个 bean,但找到了 2 个: - queueAccountToNotification:由类路径资源中的“queueAccountToNotification”方法定义 [com/example/notification/application/jms/JmsQueueConfig.class] - queueNotificationToAccount:由类路径资源中的“queueNotificationToAccount”方法定义 [com/example/notification/application/jms/JmsQueueConfig.class]
行动:
考虑将其中一个 bean 标记为 @Primary,更新消费者 接受多个bean,或使用@Qualifier 来识别bean 应该吃掉的
这是我的配置类:
@Configuration
@EnableJms
@ImportAutoConfiguration(classes = {
JmsAutoConfiguration.class,
ActiveMQAutoConfiguration.class
})
public class JmsQueueConfig {
@Value("${APP_QUEUE_ACCOUNT_TO_NOTIFICATION}")
private String queueAccountToNotificationName;
@Value("${APP_QUEUE_NOTIFICATION_TO_ACCOUNT}")
private String queueNotificationNameToAccount;
@Bean
@Qualifier("q1")
public Queue queueAccountToNotification() {
return new ActiveMQQueue(queueAccountToNotificationName);
}
@Bean
@Qualifier("q2")
public Queue queueNotificationToAccount() {
return new ActiveMQQueue(queueNotificationNameToAccount);
}
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
@Bean
@Qualifier("p1")
public EventPublisher eventPublisher(JmsTemplate jmsTemplate) {
return new JmsEventPublisher(jmsTemplate, new ActiveMQQueue(queueAccountToNotificationName));
}
@Bean
public MessageConverter messageConverter() {
return new JmsMessageConverter();
}
}
我的服务:
@Service
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
@Slf4j
public class MemberService {
@Autowired
@Qualifier("q1")
Queue q;
@Qualifier("p1")
EventPublisher eventPublisher;
public void createMemberSubscription(final Member member) {
final MembershipSubscriptionEvent event = new MembershipSubscriptionEvent(UUID.randomUUID().toString(), member.getEmail());
//eventPublisher.publish(event);
log.info("createMemberSubscription");
}
public void removeMemberSubscription(final Member member) {
final MembershipRemovalEvent event = new MembershipRemovalEvent(UUID.randomUUID().toString());
//eventPublisher.publish(event);
log.info("removeMemberSubscription");
}
}
我是 Spring 生态系统的新手,我可能不太了解 @Autowired 和绑定。任何好的文档或示例将不胜感激。 在 Spring 和 SoF 上,我还没有找到任何此类文档。
更新: JmsEventPublisher 类
@Component
@FieldDefaults(level = AccessLevel.PRIVATE)
@Slf4j
@AllArgsConstructor
public class JmsEventPublisher implements EventPublisher {
final JmsTemplate jmsTemplate;
final Destination destination;
@Override
public void publish(DomainEvent event) {
jmsTemplate.convertAndSend(destination, event);
log.trace("Sent event. [destination={}, event={}]", destination, event);
}
}
【问题讨论】:
-
JmsEventPublisher是什么,它是您的自定义类吗?如果可以,您也可以输入该代码 -
给你(在更新的部分下)
标签: java spring spring-boot dependency-injection