2011-08-16 5 views
2

Camel을 사용하여 JMS 대기열로 메시지를 보내려고합니다. 본문은 바이트 배열이며 카멜은 javax.jms.BytesMessage으로 변환하여 문제없이 전송할 것으로 기대하지만 다음과 같은 경고 메시지가 표시됩니다. Apache Camel - JMS 메시지 전송시 경고

[org.apache.camel.component.jms.JmsBinding] (Camel (camel) thread #0 - 
JmsConsumer[[email protected]_4001) 
Cannot determine specific JmsMessage type to use from body class. 
Will use generic JmsMessage. Body class: org.apache.camel.impl.DefaultMessage. 
If you want to send a POJO then your class might need to implement java.io.Serializable, 
or you can force a specific type by setting the jmsMessageType option on the JMS endpoint. 

내가 수동으로 (exchange.getIn().setHeader("CamelJmsMessageType", JmsMessageType.Bytes);를) 유형을 설정하려고하면

Warning

, 나는 NullPointerException이 얻을.

[org.apache.camel.processor.DefaultErrorHandler] (Camel (camel) thread #0 - JmsConsumer[[email protected]_4001) Failed delivery for exchangeId: ID-madansportapp02-5 
1560-1313509081079-0-1. Exhausted after delivery attempt: 1 caught: java.lang.NullPointerException 
java.lang.NullPointerException 
    at com.swiftmq.tools.util.DataByteArrayOutputStream.write(Unknown Source) 
    at com.swiftmq.jms.BytesMessageImpl.writeBytes(Unknown Source) 
    at org.apache.camel.component.jms.JmsBinding.createJmsMessageForType(JmsBinding.java:506) 
    at org.apache.camel.component.jms.JmsBinding.createJmsMessage(JmsBinding.java:443) 
    at org.apache.camel.component.jms.JmsBinding.makeJmsMessage(JmsBinding.java:267) 
    at org.apache.camel.component.jms.JmsProducer$2.createMessage(JmsProducer.java:225) 
    at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:198) 
    at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access$100(JmsConfiguration.java:141) 
    at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate$3.doInJms(JmsConfiguration.java:175) 
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:466) 
    at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:172) 
    at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:347) 
    at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:303) 
    at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:101) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:114) 
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:286) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:109) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89) 
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:99) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209) 
    at org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:305) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:116) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:79) 
    at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:102) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85) 
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:91) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560) 
... 
public class MessageTranslator implements Processor { 

@Override 
public void process(Exchange exchange) throws Exception { 
    RechargeType transaction = (RechargeType) exchange.getIn().getBody(); 
    exchange.getIn().setBody(createMessage(transaction)); 
} 

private Message createMessage(RechargeType transaction) throws DataException, IOException { 
    Message message = new DefaultMessage(); // camel message 
    Request request = new Request(transaction); // our request 

    final byte[] serializedPayload = RequestSerializationHelper.getSerializedPayload(request); // serialized request 
    message.setBody(serializedPayload); 

    return message; 
} 
} 

답변

1

Code

Exception

당신이해야 하지이 낙타 메시지로 몸을 설정하지만, 그냥 일반 바이트 []를 페이로드로 사용하려고합니다.

따라서 createMessage 메소드는 대신 바이트 []를 반환해야합니다.

+0

어떻게 명백한 :) 주셔서 감사합니다 – user219882

0

당신이 직렬화 객체 전송하려는 경우 또는 :

import org.apache.camel.ProducerTemplate; 

@Produce(uri = "activemq:queue:RechargeType") 
private ProducerTemplate producerTemplate; 

RechargeType rechargeType = new RechargeType(); 
producerTemplate.sendBody(rechargeType); 

및 프로세서 클래스에서받을

RechargeType request = (RechargeType) exchange.getIn().getBody(); 

하지만 RechargeType 모든 서브 클래스가 구현해야한다 직렬화