spring-boot amqp基于数据库数据创建队列

nhaq1z21  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(485)

我想使用spring引导应用程序在rabbitmq中基于数据库中的一些数据创建队列。例如:我有一个带有一些队列名称的实体。我需要为它们中的每一个创建一个新队列。稍后我想使用它们而不创建它们。
我已经创建了一些配置来创建队列并将它们绑定到exchange。但我的数据库中的数据将发生变化,对于特定实体中的每个新条目,我稍后将需要一个新队列。
一个想法是在我的@configuration服务中@autowired,从数据库中获取所需的数据。不幸的是,这不起作用,因为我自动连线的服务得到了beancreationexception。
我做错了什么?还是有其他方法可以基于数据库条目创建队列?
这是我建造的班级:

  1. @Configuration
  2. public class RabbitMQQueueConfiguration {
  3. private QueueNameService queueNameService;
  4. @Autowired
  5. public RabbitMQQueueConfiguration(QueueNameService queueNameService){
  6. this.queueNameService =queueNameService;
  7. }
  8. private String queueA = getQueueNameA(1L);
  9. private String queueB="queueB";
  10. @Bean
  11. public Queue queueA() {
  12. return new Queue(queueA);
  13. }
  14. @Bean
  15. public Queue queueB() {
  16. return new Queue(queueB);
  17. }
  18. private String getQueueNameA(Long queueID){
  19. return queueNameService.getQueueName(queueID);
  20. }
  21. }

这是我得到的线索:

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rabbitMQQueueConfiguration' defined in file [...\classes\com\example\DemoRabbitMq\config\RabbitMQQueueConfiguration.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.DemoRabbitMq.config.RabbitMQQueueConfiguration$$EnhancerBySpringCGLIB$$bc4b2845]: Constructor threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "com.example.DemoRabbitMq.service.QueueNameService.getQueueName(java.lang.Long)" because "this.queueNameService" is null
  2. at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:313) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  3. at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:294) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  4. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  5. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1203) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  6. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  7. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  8. at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  9. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  10. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  11. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  12. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  13. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  14. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  15. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  16. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  17. at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  18. at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  19. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  20. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.3.RELEASE.jar:2.3.3.RELEASE]
  21. at com.example.DemoRabbitMq.DemoRabbitMqApplication.main(DemoRabbitMqApplication.java:24) ~[classes/:na]
  22. Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.DemoRabbitMq.config.RabbitMQQueueConfiguration$$EnhancerBySpringCGLIB$$bc4b2845]: Constructor threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "com.example.DemoRabbitMq.service.QueueNameService.getQueueName(java.lang.Long)" because "this.queueNameService" is null
  23. at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:217) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  24. at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  25. at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:309) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  26. ... 19 common frames omitted
  27. Caused by: java.lang.NullPointerException: Cannot invoke "com.example.DemoRabbitMq.service.QueueNameService.getQueueName(java.lang.Long)" because "this.queueNameService" is null
  28. at com.example.DemoRabbitMq.config.RabbitMQQueueConfiguration.getQueueNameA(RabbitMQQueueConfiguration.java:34) ~[classes/:na]
  29. at com.example.DemoRabbitMq.config.RabbitMQQueueConfiguration.<init>(RabbitMQQueueConfiguration.java:19) ~[classes/:na]
  30. at com.example.DemoRabbitMq.config.RabbitMQQueueConfiguration$$EnhancerBySpringCGLIB$$bc4b2845.<init>(<generated>) ~[classes/:na]
  31. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
  32. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64) ~[na:na]
  33. at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
  34. at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) ~[na:na]
  35. at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) ~[na:na]
  36. at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
  37. ... 21 common frames omitted

编辑:作为请求设置我的服务

  1. @Service
  2. public class QueueNameService {
  3. private static final Logger LOGGER = LoggerFactory.getLogger(QueueNameService.class);
  4. private final SomeOtherRepository someOtherRepository;
  5. private final SomeRepository someRepository;
  6. @Autowired
  7. public QueueNameService(SomeOtherRepository someOtherRepository, SomeRepository someRepository) {
  8. this.someOtherRepository= someOtherRepository;
  9. this.someRepository= someRepository;
  10. }
  11. public String getQueueName(int tld_id) throws NoSuchElementException {
  12. Optional<Foo> foo= someOtherRepository.findById(foo_id);
  13. Optional<Bar> bar= someRepository.findById(foo.get().getBarId());
  14. return bar.map(Bar::getName).orElse(null);
  15. }
  16. }
uinbv5nw

uinbv5nw1#

你有这样的代码:

  1. private String queueA = getQueueNameA(1L);

在构造函数调用之前调用。既然你想进入这个地方( queueNameService )它是从构造函数初始化的,因此它以 NullPointerException .
在您的问题中没有任何特定于spring(或amqp)的东西:它只是一般的java使用问题。

相关问题