【问题标题】:Authentication for @JmsListener using Spring 4.2 annotations and ActiveMQ使用 Spring 4.2 注释和 ActiveMQ 对 @JmsListener 进行身份验证
【发布时间】:2020-05-13 06:13:50
【问题描述】:

尝试使用 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,但我一直在研究如何解决这个问题。谁能帮我解决这个问题?

我的应用配置:

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

【问题讨论】:

    标签: java spring jms activemq


    【解决方案1】:

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

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

    您也可以在 jndi.properties 中添加属性 userName=admin 和 password=admin

    【讨论】:

    • 你好桑达尔。感谢您的建议。不过,这些值已经设置好了。我认为目标/会话的创建方式有些奇怪。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2011-10-17
      • 2014-07-03
      • 2015-06-24
      • 2022-01-12
      • 2017-11-25
      • 2017-08-14
      • 2020-04-16
      • 2020-07-07
      相关资源
      最近更新 更多