无法创建生产者以在ActiveMQ上发送消息

时间:2020-08-01 12:18:57

标签: java spring spring-boot activemq-artemis

我正在学习JMS和其他类型的经纪人。我目前正在将ActiveMQ(Artemis)用于虚拟项目。

我目前在默认设置下运行Artemis。我可以转到管理控制台,查看队列和主题。 我现在正在创建2个基于Java Spring的应用程序;一种用于生产,一种用于消耗。 我那里几乎没有教程,但是我正在获得NPE,我不确定-为什么,因为我相信我正确地自动装配了bean。

这些是我的课程:

主类:

@SpringBootApplication
public class SpringJmsApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringJmsApplication.class, args);

    SendMessage send = new SendMessage("This is the test message");
  }
}

发件人:

public class Sender {

  private static final Logger LOGGER =
      LoggerFactory.getLogger(Sender.class);

  @Autowired
  private JmsTemplate jmsTemplate;

  public void send(String message) {
    LOGGER.info("sending message='{}'", message);
    jmsTemplate.convertAndSend("helloworld.q", message);
  }
}

发件人配置:

@Configuration
public class SenderConfig {

  @Value("${artemis.broker-url}")
  private String brokerUrl;

  @Bean
  public ActiveMQConnectionFactory senderActiveMQConnectionFactory() {
    return new ActiveMQConnectionFactory(brokerUrl);
  }

  @Bean
  public CachingConnectionFactory cachingConnectionFactory() {
    return new CachingConnectionFactory(
        senderActiveMQConnectionFactory());
  }

  @Bean
  public JmsTemplate jmsTemplate() {
    return new JmsTemplate(cachingConnectionFactory());
  }

  @Bean
  public Sender sender() {
    return new Sender();
  }
}

SendMessage服务:

public class SendMessage {  
    @Autowired
    Sender sender;

    public SendMessage(String message){
        this.sender.send(message);
    }
}

所以基本上错误是由SendMessage类引起的,它无法自动连接发送方Bean,但是我不确定为什么会发生此错误,因为在SenderConfig类中创建了Sender Bean,因此肯定应该添加Spring它到Spring容器/ Bean工厂/应用程序上下文中?

这是堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at com.codenotfound.jms.SendMessage.<init>(SendMessage.java:11)
    at com.codenotfound.SpringJmsApplication.main(SpringJmsApplication.java:16)

2 个答案:

答案 0 :(得分:1)

这是您主要班级的罪魁祸首。

SendMessage send = new SendMessage("This is the test message");

您是自己创建对象,而不是从上下文中获取对象,Spring DI不会应用于我们自己创建的对象。

解决方法是,通过用SendMessage进行注释,将@Component标记为Spring管理的bean,并从上下文中获取它。

答案 1 :(得分:1)

您的问题并非来自SendMessage类,该类似乎还可以。

您的NPE是由您获取SendMessage类的实例的方式引起的,也就是说,您实际上并没有获得由Spring Container管理的@Bean;相反,您是使用new关键字手动创建的,如下所示:

SendMessage send = new SendMessage("This is the test message");

这在堆中分配了一个完全new对象,该对象不会最终出现在Spring容器中,因此→不会由Spring管理,因此→其字段sender将不是@Autowired