一、背景介绍
在实际项目开发中,我需要使用ActiveMQ消息队列来接收发送消息。我是Springboot工程,因此在 application.properties 文件中配置了连接ActiveMQ的信息,如下所示
application.properties
# 生产环境 mq
spring.activemq.broker-url=tcp://10.223.94.20:61616
spring.activemq.user=admin
spring.activemq.password=admin
#spring.activemq.in-memory=true
#spring.activemq.pool.enabled=false
#使用发布/订阅模式时,下边配置需要设置成 true
spring.jms.pub-sub-domain=true
JMSConfiguration
package com.test.testmanagement.config;
import javax.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
@Configuration
public class JMSConfiguration {
@Value("${spring.activemq.broker-url}")
private String url;
@Value("${spring.activemq.user}")
private String user;
@Value("${spring.activemq.password}")
private String password;
//引入SpringBoot自己配置的连接工厂
@Autowired
ConnectionFactory connectionFactory;
// //真正可以产生Connection的ConnectionFactory,即ActiveMq创建的
// @Bean
// public ActiveMQConnectionFactory activeMQConnectionFactory1(){
// ActiveMQConnectionFactory activeMQConnectionFactory1 = new ActiveMQConnectionFactory();
// activeMQConnectionFactory1.setBrokerURL(url);
// return activeMQConnectionFactory1;
// }
//
// //配置Spring管理的ConnectionFactory
// @Bean
// public SingleConnectionFactory singleConnectionFactory(){
// SingleConnectionFactory singleConnectionFactory = new SingleConnectionFactory(activeMQConnectionFactory1());
// return singleConnectionFactory;
// }
//Spring提供的JMS模板类,用于消息发送、接收等
@Bean
public JmsTemplate jmsTemplate(){
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(connectionFactory);
return jmsTemplate;
}
//这个是queue目的地,点对点的
@Bean
public ActiveMQQueue queueDestination(){
System.out.println("走进new 队列的配置里");
ActiveMQQueue activeMQQueue = new ActiveMQQueue("queue1-test");
return activeMQQueue;
}
//这个是topic目的地,一对多的
@Bean
public ActiveMQTopic topicDestination(){
ActiveMQTopic activeMQTopic = new ActiveMQTopic("topic-1203-test");
return activeMQTopic;
}
@Bean
public DefaultJmsListenerContainerFactory topicFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
System.out.println("设置一个默认bean");
factory.setConnectionFactory(connectionFactory);
//PubSubDomain代表模式, true:发布/订阅模式,即topic , false:点对点模式,即queue
factory.setPubSubDomain(false);
return factory;
}
//接口自动化使用队列,用于存放用例执行状态
@Bean
public DefaultJmsListenerContainerFactory topicOfInterfaceAutoFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
System.out.println("设置一个默认bean 接口自动化");
factory.setConnectionFactory(connectionFactory);
//PubSubDomain代表模式, true:发布/订阅模式,即topic , false:点对点模式,即queue
factory.setPubSubDomain(true);
return factory;
}
}
完成上述两个文件的编写后启动工程,却发现报错啦,报错信息为SecurityException: User name [admin] or password is invalid
二、解决办法
各种百度无解后,我感觉可能是ActiveMQ自身配置影响的,因此详细了解了一下ActiveMQ安装配置过程,了解每个配置文件的作用,最终找到了问题产生的原因
2.1 ActiveMQ的credentials.properties
该文件的用户/密码是用于后台服务端连接的
activemq.username=system
activemq.password=123456
guest.password=123456
2.2 ActiveMQ的jetty-realm.properties
该文件的用户/密码是用于前台浏览器连接的
admin: admin, admin
user: 123, user
备注:
(1)第一个参数代表 用户名
(2)第二个参数代表 密码
(3)第三个参数代表 角色
综上,可以看出问题产生的原因是我把用户名/密码搞错啦,我应该使用 credentials.properties 文件中的用户名/密码
参考博客:activeMQ各种配置