JMS 대기열에서 메시지를 읽는 경로를 Camel에 설정하려고합니다.Apache Camel JMS : "대기열에 연결할 때 대상을 만들 수 없습니다"
응용 프로그램에서 Tibco를 사용하고 여기에 데이터를 게시 할 수 없지만 팩터 리 및 대기열의 경로는/path/to/queueName : 형식 형식을 따르며 여기서 type은 qcf (대기열 연결 공장) 및 대기열. 나는 봄-DSL을 사용하고
는 XML은 다음과 같습니다 주목해야 할
12:41:19:385 - WARN - DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'path/to/queue:queue' - trying to recover. Cause: Not allowed to create destination
12:41:20:494 - INFO - DefaultMessageListenerContainer - Successfully refreshed JMS Connection
한 가지입니다 : 응용 프로그램이 실행되는
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">...</prop>
<prop key="java.naming.provider.url">...LDAP Server URL...</prop>
<prop key="java.naming.referral">follow</prop>
<prop key="java.naming.security.credentials">...</prop>
<prop key="java.naming.security.principal">uid=...,ou=...,dc=...,dc=...</prop>
</props>
</property>
</bean>
<bean id="jmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="/path/to/queueConnectionFactory:qcf"/>
</bean>
<bean id="authenticatedConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="jmsQueueConnectionFactory"/>
<property name="username" value="..."/>
<property name="password" value="..."/>
</bean>
<bean id="testjms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="authenticatedConnectionFactory"/>
</bean>
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
<route id="jmsRouteTest">
<from uri="testjms:queue:/path/to/queue:queue" />
<to uri="file:c:\inbox?fileName=jmsMessage.txt" />
</route>
</camelContext>
동안 로그에 다음 줄을 던지는 유지 대상에 대한 첫 번째 슬래시 "/"가 사라지지만 URI에서 "queue :"를 제거하면 동일한 오류가 발생하지만 대상은 '/ path/to/queue : queue'가됩니다.
나는이 오류 검색 및 유래에 여기에 질문을 찾을 수있다 : Does anyone know exactly what javax.jms.InvalidDestinationException: Not allowed to create destination means?
그냥 구성이 맞는지 확인하기 위해, 나는 봄 XML에서 동일한 설정을 복사 다음 클래스를 (만들었습니다 클래스) :
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.put("java.naming.provider.url", "...LDAP Server URL...");
properties.put("java.naming.factory.initial", "...");
properties.put("java.naming.referral", "follow");
properties.put("java.naming.security.principal", "uid=...,ou=...,dc=...,dc=...");
properties.put("java.naming.security.credentials", "...");
properties.put("JmsConnectionFactory", "/path/to/queueConnectionFactory:qcf");
properties.put("JmsDestinationName", "/path/to/queue:queue");
properties.put("JmsUserName", "...");
properties.put("JmsPassword", "...");
Context context = null;
QueueConnection connection = null;
QueueSession session = null;
QueueReceiver receiver = null;
context = new InitialContext(properties);
Queue queue = (Queue) context.lookup((String) properties.get("JmsDestinationName"));
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) context.lookup((String) properties.get("JmsConnectionFactory"));
connection = queueConnectionFactory.createQueueConnection((String) properties.getProperty("JmsUserName"),
properties.getProperty("JmsPassword"));
session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
receiver = session.createReceiver(queue);
while (true) {
TextMessage message = (TextMessage) receiver.receive();
System.out.println("Received: " + message.getText());
BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
String s = bufferRead.readLine();
if ("b".equals(s)) {
break;
}
}
connection.close();
}
}
이 클래스에서는 대기열에있는 메시지를 읽을 수 있습니다.
이전에이 문제가 발생 했습니까?
자세한 정보가 필요한 경우 알려 주시기 바랍니다.
감사합니다.
내가 테스트 한 Java 클래스가 작동한다는 것을 잊어 버렸습니다. 나는 그 질문을 편집 할 것이다. 고맙습니다. –