2017-10-06 10 views
1

Wildfly 10에서 JMS 2.0을 사용하여 임시 JMS 대기열을 만들고 연결 팩토리를 삽입하려고합니다.JEE 서버 (JMS)의 JMS 임시 대기열에서 수신기를 만드는 방법은 무엇입니까?

@JMSConnectionFactory를 사용하여 ConnectionFactory를 주입하고 있습니다. 이것은 잘 작동합니다. 또한 임시 큐를 생성

@Inject @JMSConnectionFactory("java:/jms/RemoteConnectionFactory") JMSContext jmsContext 

잘 작동 :

Destination jmsQueue = jmsContext.createTemporaryQueue(); 

게시자 만들기 및 작동 괜찮뿐만 아니라 메시지를 게시 :

JMSProducer producer = jmsContext.createProducer(); 
TextMessage msg = jmsContext.createTextMessage(Long.toString(new Date().getTime())); 
producer.send(jmsQueue, msg); 

을하지만, 내가 어떻게 청취자를 만들려면 어떻게해야합니까 열? 임시 대기열이 미리 정의되지 않았으므로 MDB를 사용할 수 없습니다.

JMSConsumer consumer = jmsContext.createConsumer(jmsQueue); 
    consumer.setMessageListener(new MessageListener() { 
       ... 
       ... 
      }); 

오류 추적 : 나는 소비자를 만들고, 여기에 메시지 리스너를 할당하려고하면, 나는 다음과 같은 오류 메시지가

Caused by: javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec, e.g. J2EE1.4 Section 6.6 
     at org.apache.activemq.artemis.ra.ActiveMQRASession.checkStrict(ActiveMQRASession.java:1452) 
     at org.apache.activemq.artemis.ra.ActiveMQRAMessageConsumer.setMessageListener(ActiveMQRAMessageConsumer.java:123) 
     at org.apache.activemq.artemis.jms.client.ActiveMQJMSConsumer.setMessageListener(ActiveMQJMSConsumer.java:59) 

그래서 내가 명시 적으로 메시지를 설정할 수 없습니다 나타납니다 JEE 제어 연결 팩토리가있는 리스너. 하지만 그것은 임시 대기열이기 때문에 대상이 컴파일 타임에 알려지지 않았기 때문에 MDB를 만들 수 없습니다. 그러면 임시 대기열을 들으려면 어떻게해야합니까?

답변

1

JMS 1.0을 사용하여이 문제를 해결할 수있었습니다. 내가 좋아하는 코드 뭔가를했다 : listenerClassjavax.jms.MessageListener를 구현하는 클래스가

TopicConnectionFactory topicConnectionFactory; 
Topic topic; 
TopicConnection topicConnection; 

try { 
    InitialContext context = new InitialContext(); 
    topicConnectionFactory = (TopicConnectionFactory)jndi.lookup("jboss/DefaultJMSConnectionFactory"); 
    topic = (Topic)jndi.lookup("jms/myTopicName"); 

    topicConnection = topicConnectionFactory.createTopicConnection(); 

    TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

    TopicSubscriber topicSubscriber = topicSession.createSubscriber(projectTopic, null, false); 
    topicSubscriber.setMessageListener(listenerClass); 
    topicConnection.start(); 
} 
... 

.

이것은 Wildfly에 정의 된 사전 정의 된 JMS 연결 팩토리를 이용하여 명시 적으로 설정할 필요가 없도록 standalone-full.xml 내에 있습니다.

경고 - 마지막으로이 코드는 Wildfly 8에서 실행되었으므로 일부 변경 사항이있을 수 있습니다. 또한 원격 연결을 사용하지 않아 다시 차이가있을 수 있습니다.

+0

고마워요. 나는 그걸 시도해 보았지만 같은 예외가 여전히 발생했습니다. 특히 JMS2 또는 JMS1 파사드를 사용하는지 여부에 상관없이 클라이언트가 여전히 동일한 ActiveMARASession을 사용하고 있기 때문에 놀라지 않습니다. 나는 논리적 인 해결책이 없다고 상상할 수 없다. –

+0

왜 임시 대기열이 필요합니까? 컨테이너가 배포 수명 동안 mdb 인스턴스를 제공 할 것으로 예상하면 대기열이 필요하며 그렇지 않은 경우 연결할 대상이 무엇입니까? –

+0

@willt 클러스터의 각 노드에 고유 한 게시/구독 대기열이 있어야합니다. 대기열은 런타임의 수명 동안 살아야했습니다. 재시작을 지속 할 필요가 없습니다. 또한이 대기열을 수동으로 관리하고 싶지 않습니다. 따라서 임시 대기열에 대한 아이디어는 ... 그러나 대기열을 들으려는 방법이 없다면 임시 대기열의 목적은 무엇일까? –