2017-11-28 17 views
0

Apache Camel 프레임 워크를 배우고 SOAP 끝점에서 메시지를 받고 JMS 큐 (ActiveMQ)에 저장되는 간단한 경로를 작성하려고합니다.Apache camel, SOAP에서 JMS로 메시지 이동하는 방법

나는 엔드 포인트를 호출 할 때, 메시지 큐를 읽고 다른 서비스는 다음과 같은 오류가 발생, 엔드 포인트 및 대기열과 같이 정의된다

<route id="cxfToJMSRoute"> 
    <from uri="cxf:bean:endpoint" /> 
    <log message="test" /> 
    <wireTap uri="direct:logInfo" /> 
    <to uri="activemq:queue:api" /> 
</route> 

그리고 다음과 같은 경로 그러나

<cxf:cxfEndpoint id="endpoint" address="http://localhost:1010/hello" 
     serviceClass="net.webservicex.GlobalWeatherSoap" wsdlURL="META-INF/globalweather.wsdl" /> 

<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
    <property name="brokerURL" value="tcp://127.0.0.1:61616"/> 
</bean> 

다음이

org.apache.camel.RuntimeCamelException: Failed to extract body due to: javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class org.apache.cxf.message.MessageContentsList! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.. Message: ActiveMQObjectMessage {commandId = 8, responseRequired = true, messageId = ID:IT-L-R90HKRNH-64004-1511880368329-1:1:2:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:IT-L-R90HKRNH-64004-1511880368329-1:1:2:1, destination = queue://api, transactionId = null, expiration = 1511880389430, timestamp = 1511880369430, arrival = 0, brokerInTime = 1511880369434, brokerOutTime = 1511880369495, correlationId = Camel-ID-IT-L-R90HKRNH-1511880338904-0-3, replyTo = temp-queue://ID:IT-L-R90HKRNH-64004-1511880368329-1:1:1, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = [email protected], marshalledProperties = [email protected], dataStructure = null, redeliveryCounter = 0, size = 1640, properties = {SOAPAction=http://www.webserviceX.NET/GetCitiesByCountry, CamelHttpCharacterEncoding=UTF-8, User_HYPHEN_Agent=Apache-HttpClient/4.1.1 (java 1.5), Host=127.0.0.1:1010, operationName=GetCitiesByCountry, operationNamespace=http://www.webserviceX.NET, breadcrumbId=ID-IT-L-R90HKRNH-1511880338904-0-1, Content_HYPHEN_Type=text/xml;charset=UTF-8, CamelHttpMethod=POST, accept_HYPHEN_encoding=gzip,deflate, connection=keep-alive, CamelHttpUri=/hello, CamelHttpPath=}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false} 
     at org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:160) ~[camel-jms-2.16.3.jar!/:2.16.3] 
     at org.apache.camel.component.jms.JmsMessage.createBody(JmsMessage.java:236) ~[camel-jms-2.16.3.jar!/:2.16.3] 
     at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:54) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.builder.ExpressionBuilder$35.evaluate(ExpressionBuilder.java:905) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.builder.ExpressionBuilder$76.evaluate(ExpressionBuilder.java:1836) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.LogProcessor.process(LogProcessor.java:64) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) ~[camel-core-2.20.1.jar!/:2.20.1] 
     at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:112) ~[camel-jms-2.16.3.jar!/:2.16.3] 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:719) ~[spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:679) ~[spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:649) ~[spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:317) [spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255) [spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1166) [spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1158) [spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1055) [spring-jms-4.3.12.RELEASE.jar!/:4.3.12.RELEASE] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_92] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_92] 
     at java.lang.Thread.run(Thread.java:745) [na:1.8.0_92] 
Caused by: javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class org.apache.cxf.message.MessageContentsList! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes. 
     at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) ~[activemq-client-5.14.5.jar!/:5.14.5] 
     at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:208) ~[activemq-client-5.14.5.jar!/:5.14.5] 
     at org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:135) ~[camel-jms-2.16.3.jar!/:2.16.3] 
     ... 25 common frames omitted 
Caused by: java.lang.ClassNotFoundException: Forbidden class org.apache.cxf.message.MessageContentsList! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes. 
     at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.checkSecurity(ClassLoadingAwareObjectInputStream.java:112) ~[activemq-client-5.14.5.jar!/:5.14.5] 
     at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:57) ~[activemq-client-5.14.5.jar!/:5.14.5] 
     at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) ~[na:1.8.0_92] 
     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) ~[na:1.8.0_92] 
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) ~[na:1.8.0_92] 
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[na:1.8.0_92] 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na:1.8.0_92] 
     at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206) ~[activemq-client-5.14.5.jar!/:5.14.5] 
     ... 26 common frames omitted 

그래서 메시지를 POJO 자신 befor로 변환해야합니까? JMS? 나는 완전히 Camel에 익숙하지 만 Camel이 자동으로 형식 변환을 처리해야한다는 인상을 받았습니다.

답변

1

당신은 자바가 JMS 브로커에 객체를 보낼 해달라고, 그래서 대신 당신은 JMS 브로커에 전송하기 전에

<convertBodyTo type="String"/> 
<to uri="activemq:queue:api" /> 

을 추가하여 메시지를 통해 기반으로 텍스트로 변환 할 수 있습니다.

Camel이 POJO 클래스를 XML로 텍스트로 자동 변환하도록 클래스 패스에 camel-jaxb를 추가해야 할 수도 있습니다. 또는 POJO 유형과 원시 XML을 사용하지 않도록 SOAP 끝점을 구성 할 수 있습니다. 그런 다음 Camel은 해당 원시 XML을 텍스트 기반 JMS로 직접 보낼 수 있습니다.

+0

그래서 암시 적으로 cxfEndpoint가 반환하는 POJO입니까? 다른 서비스에서 낙타를 사용하여 MQ를들을 때 POJO로 다시 변환해야합니까? –