Тема публикации/подписки Apache Camel Hazelcast, как сериализовать строковое сообщение в подписчике

Я пытался следовать примеру кода на http://camel.apache.org/hazelcast-component.html#HazelcastComponent-topic для тестирования публикации/подписки через Hazelcast.

Ниже перечислены определения маршрутов издателя и подписчика.

<route>
    <from uri="direct:inbound" />
    <setHeader headerName="CamelHazelcastOperationType">
        <simple>${type:org.apache.camel.component.hazelcast.HazelcastConstants.PUBLISH_OPERATION}</simple>
    </setHeader>
    <to uri="hazelcast:topic:foo" />
</route>    

<route>
    <from uri="hazelcast:topic:foo" />
    <log message="from hazelcast topic:= ${body}" />
    <bean ref="inboundProcessor" method="processHazelcastMsg" />
</route>

Во время моего теста я отправил строку типа "{\"result\": \"InboundProcessor.processRequest success\"}" на маршрут издателя через прямую: входящую конечную точку. Маршрут подписчика смог получить сообщение из темы и передать компоненту процессора. Однако мне не удалось правильно вернуть строку...

Вот как я реализую метод bean

public void processHazelcastMsg(Exchange inEx) throws Exception{

    Map<String, Object> headers = inEx.getIn().getHeaders();

    System.out.println("Exchange > In msg > Body = " + inEx.getIn().getBody());
    System.out.println("Exchange > In msg > Body class = " + ObjectHelper.className(inEx.getIn().getBody()));
    DataAwareMessage msg = inEx.getIn().getBody(DataAwareMessage.class);

    byte[] b = serializeObject(msg.getMessageObject());
    String msgStr = new String(b, Charset.forName("utf-8"));

    System.out.println("Received msg string = " + msgStr);
}

private static byte[] serializeObject(Object object) throws IOException
{
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ObjectOutput out = new ObjectOutputStream(bos)) {
            out.writeObject(object);
            return bos.toByteArray();
        } 
}   

и вот вывод журнала:

[  hz._hzInstance_1_dev.event-5] route4                         INFO  from hazelcast topic:= com.hazelcast.topic.impl.DataAwareMessage[source=foo]
Exchange > In msg > Body = com.hazelcast.topic.impl.DataAwareMessage[source=foo]
Exchange > In msg > Body class = com.hazelcast.topic.impl.DataAwareMessage
Received msg string = ��

Я пытался скрыть строку, используя другую кодировку (например, UTF-8/UTF-16... и т. д.), но все равно не удалось. Интересно, должен ли быть другой способ вернуть правильную строку в подписчике?


person xlogger    schedule 13.11.2015    source источник


Ответы (1)