我正在学习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)
答案 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
。