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를 만들 수 없습니다. 그러면 임시 대기열을 들으려면 어떻게해야합니까?
고마워요. 나는 그걸 시도해 보았지만 같은 예외가 여전히 발생했습니다. 특히 JMS2 또는 JMS1 파사드를 사용하는지 여부에 상관없이 클라이언트가 여전히 동일한 ActiveMARASession을 사용하고 있기 때문에 놀라지 않습니다. 나는 논리적 인 해결책이 없다고 상상할 수 없다. –
왜 임시 대기열이 필요합니까? 컨테이너가 배포 수명 동안 mdb 인스턴스를 제공 할 것으로 예상하면 대기열이 필요하며 그렇지 않은 경우 연결할 대상이 무엇입니까? –
@willt 클러스터의 각 노드에 고유 한 게시/구독 대기열이 있어야합니다. 대기열은 런타임의 수명 동안 살아야했습니다. 재시작을 지속 할 필요가 없습니다. 또한이 대기열을 수동으로 관리하고 싶지 않습니다. 따라서 임시 대기열에 대한 아이디어는 ... 그러나 대기열을 들으려는 방법이 없다면 임시 대기열의 목적은 무엇일까? –