繁体   English   中英

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

[英]Authentication for @JmsListener using Spring 4.2 annotations and ActiveMQ

尝试使用 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.

所以到目的地的连接是用用户名和密码为空的。 我想我可能没有正确设置 destinationResolver,但我一直在研究如何解决这个问题。 谁能帮我解决这个问题?

我的 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();
    }
}

如果您没有更改代理端的任何功能,请尝试以下操作

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

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

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

@JmsListener注释似乎总是在不通过零参数方法传递凭据的情况下创建连接。

我使用 spring 的UserCredentialsConnectionFactoryAdapter来包装我的 ConnectionFactory 以与@JmsListener一起使用,以便它在创建连接时传递凭据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM