문제
JNDI를 사용하여 ActiveMQ로 간단히 연결하려고합니다.
나는 가지고있다
'example.a'라는 대기열.
에 따라 ActiveMQ 문서화 jndi를 터치합니다, JNDI를 통해 ConectionFactories 및 대기열 (주제)을 사용하려면 ClassPath에 jndi.properties 파일을 배치해야합니다. 내가 이해했듯이 ActiveMQ ClassPath는 기본적으로 %activemq %/conf 디렉토리입니다. 나는 그것을 바꾸지 않았다. 그래서 나는이 대기열 에이 속성을 가지고 있습니다.
queue.myqueue = example.a
다음과 같이 JNDI를 사용하는 ActiveMQ 용 Java 클라이언트 클래스를 만들었습니다.
Properties jndiParameters = new Properties() ; jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); Context context = new InitialContext(jndiParameters); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); Queue queue = (Queue) context.lookup("MyQueue");
그러나 그것은 내 대기열을 찾을 수없고, 예외가 발생합니다 : javax.naming.namenotfoundexception : myqueue
내 실수는 어디에 있습니까?
해결책
문제는 속성을 명시 적으로 생성하고 초기 콘텐츠 생성자로 전달한다는 것입니다. 이것은 클래스 경로의 jndi.properties를 읽지 않음을 의미합니다.
코드는 다음과 같아야합니다.
Context context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("MyQueue");
다른 팁
정적 속성을 설정하고 파일에서 검색 할 수 있습니다.
InputStream is = getClass().getResourceAsStream("/my.jndi.properties");
Properties jndiParameters = new Properties();
jndiParameters.load(is);
jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616");
Context ctx = new InitialContext(jndiParameters);
...
이것은 자원을로드 한 후 정적 소품을 설정하는 한 작동합니다. 예를 들어 다른 곳에서 제공자 URL을로드하는 경우 도움이됩니다.
제휴하지 않습니다 StackOverflow