2016-02-25 37 views
8

Próba implementacji odbiornika JMS innego niż XML przy użyciu Spring 4 i ActiveMQ. Mój problem jest to, że wciąż otrzymuję następujący błąd z moim klientem:Uwierzytelnianie dla @JmsListener przy użyciu adnotacji Spring 4.2 i 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. 

więc połączenie do miejsca przeznaczenia jest wykonany z nazwą użytkownika i hasłem null. Myślę, że prawdopodobnie nie ustawiłem destinationResolver poprawnie, ale utknąłem pracy, jak rozwiązać ten problem. Czy ktoś może mi pomóc to naprawić?

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

Słuchacz:

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

Odpowiedz

1

Jeśli nie zmieniły żadnych możliwości na koniec brokera, spróbuj poniżej

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

także w JNDI .properties można dodać właściwości userName = admin i password = admin zamiast

+0

Cześć Sundar. Dzięki za radę. Te wartości są już ustawione. Myślę, że jest coś dziwnego w tworzeniu miejsca docelowego/sesji. – Dan