2015-06-03 3 views
1

Я пытаюсь опубликовать текстовое сообщение на тему с помощью apache camel с activemq. Следующий код работает нормально, и моя клиентская программа способна конвертировать сообщение в текстовое сообщение.apache camel multicast преобразование текстового сообщения в байтовое сообщение

<route id="setText"> 
       <from uri="restlet:///test/{testId}?restletMethod=POST" /> 
       <setExchangePattern pattern="InOnly" /> 
       <setBody> 
        <simple>${header.testId}:${body}</simple> 
       </setBody> 
       <to uri="activemq:topic:TestTopic" /> 
      </route> 

Теперь я добавил многоадресную рассылку для выполнения нескольких операций. многоадресная рассылка способна хорошо работать и успешно отправлять сообщение в тему.

<route id="setText"> 
         <from uri="restlet:///test/{testId}?restletMethod=POST" /> 
         <setExchangePattern pattern="InOnly" /> 
        <multicast> 
         <pipeline> 
         <!-- some operation --> 
         </pipeline> 
         <setBody> 
          <simple>${header.testId}:${body}</simple> 
         </setBody> 
         <to uri="activemq:topic:TestTopic" /> 
        </multicast> 
</route> 

Но при отправке текстового сообщения в тему многоадресная рассылка преобразует сообщение в поток байтов. Моя программа-клиент не может преобразовать потребленную сообщение для Отпрака bcoz сообщение в формате до свидания и ниже информация отображается System.out.println (в моей программе клиента)

ActiveMQBytesMessage {commandId = 5, responseRequired = true, messageId = ID:R-014-49827-1433324560754-3:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:R-014-49827-1433324560754-3:1:1:1, destination = topic://TestTopic, transactionId = null, expiration = 0, timestamp = 1433324582980, arrival = 0, brokerInTime = 1433324582981, brokerOutTime = 1433324583731, correlationId = null, replyTo = null, 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 = 0, properties = {breadcrumbId=ID-R-014-49826-1433324557692-2-1, org_DOT_restlet_DOT_http_DOT_version=1.1, testId=3100026, org_DOT_restlet_DOT_startTime=1433324582521, CamelHttpMethod=PUT, CamelHttpUri=http://localhost:8080/service-bus/test/3100026}, readOnlyProperties = true, readOnlyBody = true, droppable = false} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null } 

Можете ли вы предложить почему многоадресная преобразование текстового сообщения в формат байта? А что делать, отправлять сообщение в текстовом формате? Заранее спасибо.

+0

Многоадресная рассылка, конечно, * не * конвертирование anthying. Вы ищете не то место. – EJP

+0

Да. Я понимаю. он просто передает входную информацию во все подсистемы. Но когда я тестировал вне многоадресной рассылки, моя клиентская программа может использовать это сообщение как TextMessage. Но это не происходит в случае многоадресной рассылки. –

ответ

0

Я не уверен, в какой версии верблюда вы находитесь, но я видел аналогичную проблему с jaxb dataformat, преобразующим сообщения в байты. Я бы рекомендовал открыть билет на джира. Тем временем работа, которую я использовал ранее, заключалась в том, чтобы принудительно вводить текст в конечную точку jms.

activemq:topic:TestTopic?jmsMessageType=Text 

Ссылка: http://camel.apache.org/jms.html

0

У меня та же проблема с многоадресного и JAXB немаршалинг. Без многоадресной рассылки unmarshal() работает нормально, и я получаю ожидаемый тип объекта как параметр к методу «Handler.received (Object)». Добавление unmarshal() за многоадресной рассылкой, а «Handler.received (Object)» вместо этого получает байт [].

// works - Handler.received(Object) receives correct object type: 
from("test-jms:queue:test.queue").unmarshal(jaxb).to("class:com.test.Handler?method=received"); 

// doesn't work - Handler.received(Object) receives a byte array: 
from("test-jms:queue:test.queue").multicast().unmarshal(jaxb).to("class:com.test.Handler?method=received"); 

Я полный новичок в Camel, и это привело меня в сумасшествие целый день. Решение, предложенное выше, для установки jmsMessageType в «Text» также не работает для меня. В этом случае класс Handler получает строку, содержащую XML, как если бы unmarshal() ничего не делал.

EDIT: Я посмотрел на следующий StackOverflow вопрос: Apache camel multicast FreeMarker

И изменил мой код, чтобы использовать «трубопроводы», как, например, от пользователя «Клауса Ибсена»:

from("test-jms:queue:test.queue").multicast() 
.pipeline().to("file://targetdir/received").end() 
.pipeline().unmarshal(jaxb).to("class:com.test.Handler?method=received").end() 
.end(); 

И теперь это работает так, как я ожидал. Полученный XML-файл копируется в «targetdir/received», а метод «Handler.received (Object)» получает правильный тип объекта в качестве параметра. Спасибо Клаус! :)

Смежные вопросы