문제

JNDI를 사용하여 ActiveMQ로 간단히 연결하려고합니다.


나는 가지고있다

  1. 'example.a'라는 대기열.

  2. 에 따라 ActiveMQ 문서화 jndi를 터치합니다, JNDI를 통해 ConectionFactories 및 대기열 (주제)을 사용하려면 ClassPath에 jndi.properties 파일을 배치해야합니다. 내가 이해했듯이 ActiveMQ ClassPath는 기본적으로 %activemq %/conf 디렉토리입니다. 나는 그것을 바꾸지 않았다. 그래서 나는이 대기열 에이 속성을 가지고 있습니다.

    queue.myqueue = example.a

  3. 다음과 같이 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을로드하는 경우 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top