2016-02-25 32 views
8

Tentativo di implementare un listener JMS non XML utilizzando Spring 4 e ActiveMQ. Il mio problema è che continuo a ricevere il seguente errore con il mio cliente:Autenticazione per @JmsListener utilizzando le annotazioni Spring 4.2 e ActiveMQ

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. 

Quindi la connessione alla destinazione è stato fatto con nome utente e password nulla. Penso che potrebbe non aver impostato correttamente destinationResolver ma sono bloccato a risolvere il problema. Qualcuno può aiutarmi a risolvere questo?

mio 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; 
} 

L'ascoltatore:

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

risposta

1

Se non si è modificato tutte le caratteristiche sul lato broker, provare il seguito

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

anche nel vostro jndi .properties è possibile aggiungere le proprietà userName = admin e password = admin invece

+0

Ciao Sundar. Grazie per il consiglio. Questi valori sono già stati impostati però. Penso che ci sia qualcosa di strano nel modo in cui la destinazione/sessione viene creata. – Dan