Camel HazelCast组件抛出HazelcastSerializationException

时间:2013-12-11 05:54:19

标签: apache-camel hazelcast

我在Camel中有以下路线:

<route>
  <from uri="servlet:///user?matchOnUriPrefix=true"/>
   <setHeader headerName="cachename">
    <simple>${header.CamelHttpPath.split("/")[1]}</simple>
</setHeader>
<setHeader headerName="key1">
    <simple>${header.CamelHttpPath.split("/")[2]}</simple>
</setHeader>
  <to uri="direct:put"/>

</route>




<route>
    <from uri="direct:put" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="CamelHazelcastOperationType">
        <constant>put</constant>
    </setHeader>
    <setHeader headerName="CamelHazelcastObjectId">
        <simple>${header.key1}</simple>
    </setHeader>
    <process ref="requestTimeProc"/>
    <to uri="hazelcast:map:default" />
</route>

我正在尝试将一个字符串作为值放入缓存中。

我的HazelCast配置是:

<map name="default">

        <in-memory-format>OBJECT</in-memory-format>


        <backup-count>1</backup-count>

        <async-backup-count>0</async-backup-count>

        <time-to-live-seconds>0</time-to-live-seconds>

        <max-idle-seconds>0</max-idle-seconds>

        <eviction-policy>NONE</eviction-policy>

        <max-size policy="PER_NODE">0</max-size>

        <eviction-percentage>25</eviction-percentage>

        <merge-policy>com.hazelcast.map.merge.PassThroughMergePolicy</merge-policy>

    </map>
<serialization>
        <portable-version>0</portable-version>
    </serialization>

我得到以下例外:

2013-12-10 22:47:08,288 [tp-1763826860-0] ERROR DefaultErrorHandler            - Failed delivery for (MessageId: ID-DJD7W4R1-54721-1386740808850-0-1 on ExchangeId: ID-DJD7W4R1-54721-1386740808850-0-2). Exhausted after delivery attempt: 1 caught: com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable serializer for class org.apache.camel.converter.stream.InputStreamCache
com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable serializer for class org.apache.camel.converter.stream.InputStreamCache
    at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:172)[hazelcast-3.1.2.jar:3.1.2]
    at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:157)[hazelcast-3.1.2.jar:3.1.2]
    at com.hazelcast.map.MapService.toData(MapService.java:666)[hazelcast-3.1.2.jar:3.1.2]
    at com.hazelcast.map.proxy.MapProxyImpl.put(MapProxyImpl.java:72)[hazelcast-3.1.2.jar:3.1.2]
    at com.hazelcast.map.proxy.MapProxyImpl.put(MapProxyImpl.java:60)[hazelcast-3.1.2.jar:3.1.2]
    at org.apache.camel.component.hazelcast.map.HazelcastMapProducer.put(HazelcastMapProducer.java:136)[camel-hazelcast-2.11.2.jar:2.11.2]
    at org.apache.camel.component.hazelcast.map.HazelcastMapProducer.process(HazelcastMapProducer.java:71)[camel-hazelcast-2.11.2.jar:2.11.2]
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[camel-core-2.11.2.jar:2.11.2]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[camel-core-2.11.2.jar:2.11.2]
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:122)[camel-core-2.11.2.jar:2.11.2]

如果我在配置中缺少任何标志,请告诉我。我正在使用Hazelcast jar中提供的默认Hazelcast配置。任何帮助将受到高度赞赏

1 个答案:

答案 0 :(得分:3)

一些评论:

我不会更改'默认'地图。这意味着系统中没有显式配置的任何映射现在都将使用此配置。因此,找出使用哪个地图并明确配置该地图。

 <map name="explicitName">
    <in-memory-format>OBJECT</in-memory-format>
    ....
</map>

关于例外情况:

com.hazelcast.nio.serialization.HazelcastSerializationException:org.apache.camel.converter.stream.InputStreamCache类没有合适的序列化程序

这意味着InputStreamCache放在地图中,但Hazelcast不知道如何将其转换为字节流。您可以为此类插入序列化程序,请参阅以下博客文章:

http://blog.hazelcast.com/blog/2013/10/16/kryo-serializer/

对我来说最大的问题是:为什么要尝试将InputStreamCache放入地图中?我的直觉是,这个课程根本不是你想要放在分发的Hazelcast地图中的东西。