使用Spring 4.2注解和ActiveMQ进行@JmsListener身份验证

10

我正在尝试使用Spring 4和ActiveMQ实现一个非XML JMS监听器。 我的问题是我的客户端一直报以下错误:

Setup of JMS message listener invoker failed for destination 'topic.FromJndiProperties' [...] 
Cause: The JMS connection has failed: Force close due to SecurityException on connect.
Cause: User name [null] or password is invalid.

所以连接目的地时使用了用户名和密码空值。我认为可能没有正确设置目的地解析器,但我卡在了如何解决这个问题上。有人能帮我解决吗?

我的AppConfig:

@Autowired
private Environment env;

@Autowired
private BeanFactory springContextBeanFactory;  

@Bean
public DefaultJmsListenerContainerFactory myListenerContainerFactory() throws NamingException {

    Properties props = new Properties();
    props.setProperty(Context.INITIAL_CONTEXT_FACTORY, env.getProperty("java.naming.factory.initial"));
    props.setProperty(Context.PROVIDER_URL, env.getProperty("java.naming.provider.url"));
    props.setProperty(Context.SECURITY_PRINCIPAL, env.getProperty("java.naming.security.principal"));
    props.setProperty(Context.SECURITY_CREDENTIALS, env.getProperty("java.naming.security.credentials"));

    Context jndiContext = new InitialContext(props);;
    ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");

    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setDestinationResolver(new BeanFactoryDestinationResolver(springContextBeanFactory));
    factory.setPubSubDomain(true);
    factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);

    return factory;
}

听众:

@JmsListener(containerFactory = "myListenerContainerFactory", destination = "topic.FromJndiProperties")
public void receiveMessage(String message) {
    try {
        System.out.println("Received <" + message + ">");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
2个回答

2

ConnectionFactoryTopicConnectionFactoryQueueConnectionFactory都有两种创建连接的方式(例如:ConnectionFactory.createConnection()ConnectionFactory.createConnection(username, password))。

看起来@JmsListener注释总是通过零参数方法创建连接而没有传递凭据。

我使用Spring的UserCredentialsConnectionFactoryAdapter对我的ConnectionFactory进行了包装,以便使用@JmsListener时在创建连接时传递凭据。


1

如果您没有在经纪人端更改任何功能,请尝试以下方法

props.setProperty(Context.SECURITY_PRINCIPAL,"admin"
props.setProperty(Context.SECURITY_CREDENTIALS, "admin");

同时,在您的jndi.properties文件中,您可以添加属性userName=admin和password=admin。


嗨 Sundar。感谢你的建议。这些值已经被设置了。我认为目标/会话的创建方式有些奇怪。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接