Camel Kafka序列化错误

时间:2017-02-07 23:06:35

标签: apache-camel apache-kafka

我是骆驼和卡夫卡的新手。 我使用Camel 2.18.2和Kafka 0.10.1.1

我收到此错误并且不明白为什么:

org.apache.kafka.common.errors.SerializationException:无法将class [B的值转换为value.serializer中指定的类org.apache.kafka.common.serialization.StringSerializer

我有以下路线:

from("direct://toEnrichEmail") 
.routeId(routeId).marshal().json(JsonLibrary.Jackson, Map.class) 
.log(LoggingLevel.INFO, "Sending to Kafka: ${body}") 
.to("kafka:localhost:9092?topic=enrich-email&requestRequiredAcks=-1"); 

实际发送到路线的代码:

ProducerTemplate template = kafkaProducerFactory.getProducerTemplate(); 
            logger.debug("Sending message type: {}, to uri: {}, route: {}", wimsConfiguration.getMessageType(), 
                            wimsConfiguration.getDirectUri(), wimsConfiguration.getRouteName()); 
            Map<String,Object>headers = new HashMap<>(); // added because the examples do 
            headers.put(KafkaConstants.PARTITION_KEY, 0); 
            headers.put(KafkaConstants.KEY, "1"); 
            template.sendBodyAndHeaders(wimsConfiguration.getDirectUri(), wimsConfiguration.getWimsMessage(), headers); 

路由中的日志消息显示消息是正确的JSON字符串,默认的序列化程序是字符串,那么为什么它抱怨它无法序列化?

我查看了驼峰卡夫卡组件测试用例,看起来它应该可以正常工作

以下是Camel / kafka日志的输出示例:

  

16:32:20,967 INFO [toEnrichEmail](默认任务-12)发送给Kafka:{&#34; messageType&#34;:&#34; orderCreate&#34;,&#34; regionCode&#34;: &#34; IN&#34;&#34; regionLanguage&#34;:[&#34;恩&#34],&#34; orderHeader&#34; {&#34;为了&#34;:&# 34; 3001357952&#34;&#34; salesOrg&#34;:&#34; 2123&#34;&#34; soldTo&#34;:&#34; 2035266752&#34;&#34;货币&#34 ;:&#34; INR&#34;&#34; documentType&#34;:&#34; TA&#34;&#34; validFrom&#34;:空,&#34; validTo&#34;:空,&#34; contactName&#34;:&#34; UI IN&#34;,&#34; contactPhone&#34;:&#34;&#34;,&#34; contactEmail&#34;:&#34 ; fu.bar@baz.com"}&#34; SHIPTO&#34; {&#34; customerNumber之&#34;:&#34; 2035266752&#34;&#34;的companyName&#34 ;: &#34;互联网价格&#34;,&#34; cityName&#34;:&#34;班加罗尔&#34;,&#34;区&#34;:&#34;&#34;,&# 34;邮编&#34;:&#34;&#34;&#34; streetName&#34;:&#34;&#34;&#34; houseNumber&#34;:&#34;&#34 ;,&#34;建筑&#34;:&#34;&#34;&#34;地板&#34;:&#34;&#34;&#34; roomNumber&#34;:&#34 ;&#34;&#34;国家名称&#34;:&#34;印度&#34;&#34; regionName&#34;:&#34 ; Karnataka&#34;},&#34; billTo&#34;:{&#34; customerNumber&#34;:&#34; 2035266752&#34;,&#34; companyName&#34;:&#34; INTERNET PRICE FOR EOU&#34;,&#34; cityName&#34;:&#34; Indi&#34;,&#34; district&#34;:&#34;&#34;,&#34; postalCode&#34; :&#34;&#34;&#34; streetName&#34;:&#34;&#34;&#34; houseNumber&#34;:&#34;&#34;&#34;建筑&#34;:&#34;&#34;&#34;地板&#34;:&#34;&#34;&#34; roomNumber&#34;:&#34;&#34 ;, &#34;国家名称&#34;:&#34;印度&#34;&#34; regionName&#34;:&#34;卡纳塔克邦&#34;}&#34; paymentInfo&#34; {&#34 ; PAYMENTMETHOD&#34;:&#34; PO&#34;&#34; purchaseOrder的&#34;:&#34; 1234567&#34;&#34; requisitionNumber&#34;:&#34;&#34; &#34; creditCardNumber&#34;:&#34;&#34;&#34; paymentterms&#34;:&#34;&#34;&#34;通则&#34;:&#34; &#34;}&#34; orderSummary&#34; {&#34; orderSubtotal&#34;:&#34; 6479.52&#34;&#34;折扣&#34;:&#34; 0&# 34;,&#34; shippingTransportation&#34;:&#34; 0&#34;&#34;销售税&#34;:&#34; 1187.92&#34;&#34; dutyTotal&#34;:& #34; 1712.56&#34;&#34;的OrderTotal&#34;:&#34; 9380&#34;}&#34;的OrderItems&#34;:[{&#34; quoteN棕土&#34;:空,&#34; quoteItemNumber&#34;:&#34; 000010&#34;&#34; totalReservedQunatity&#34;:空,&#34; remainingReservedQuantity&#34;:空,&#34 ; lineItemNo&#34;:&#34; 000010&#34;&#34; itemCategory&#34;:&#34; TAN&#34;&#34;数量&#34;:&#34; 1&#34; &#34;材料&#34;:&#34; T6066-1KG&#34;&#34;产品&#34;:&#34; T6066&#34;&#34; brandId&#34;:&# 34; SIGMA&#34;,&#34;描述&#34;:&#34; TRIZMA(R)BASE,BIOPERFORMANCE CERTIF&amp;&#34;,&#34; yourRef&#34;:&#34;&#34 ;,&#34; yourPrice&#34;:&#34; 8192.08&#34;&#34; listPrice&#34;:&#34; 8192.08&#34;}]}         16:32:21,008 ERROR [org.apache.camel.processor.DefaultErrorHandler](默认任务-12)ExchangeId上的(MessageId:ID-STLDEEPX06-sial-com-49604-1486506685312-1-1)传递失败:ID-STLDEEPX06 -sial-COM-49604-1486506685312-1-2)。交付尝试后用尽:1抓住:org.apache.kafka.common.errors.SerializationException:无法将类[B的值转换为value.serializer中指定的类org.apache.kafka.common.serialization.StringSerializer < / p>      

块引用

消息历史记录

RouteId ProcessorId处理器已用完(ms) [toEnrichEmail] [toEnrichEmail] [direct:// toEnrichEmail] [57] [toEnrichEmail] [marshal1] [marshal [org.apache.camel.model.dataformat.JsonDataFormat@142a2fec]] [10] [toEnrichEmail] [log4] [日志] [15] [toEnrichEmail] [to3] [kafka:localhost:9092?topic = enrich-email&amp; requestRequiredAcks = -1] [25]

堆栈跟踪 -------------------------------------------------- -------------------------------------------------- -----------------------------------:org.apache.kafka.common.errors.SerializationException:Can&# 39; t将class [B的值转换为value.serializer中指定的类org.apache.kafka.common.serialization.StringSerializer

16:32:21,011 INFO [stdout](默认任务-12)2017-02-07T16:32:21,010 INFO com.sial.notifications.common.rest.NotificationExceptionResponseMapper - 映射异常org.apache.camel.CamelExecutionException:在交易所执行期间发生异常:交易所[ID-STLDEEPX06-sial-com-49604-1486506685312-1-2] 16:32:21,021 INFO [stdout](默认任务-12)2017-02-07T16:32:21,014错误com.sial.notifications.common.rest.NotificationExceptionResponseMapper - 映射异常org.apache.camel.CamelExecutionException:发生异常在交易所执行:交易所[ID-STLDEEPX06-sial-com-49604-1486506685312-1-2] 16:32:21,021 INFO [stdout](默认任务-12)org.apache.camel.CamelExecutionException:在交换机上执行期间发生异常:Exchange [ID-STLDEEPX06-sial-com-49604-1486506685312-1-2] 16:32:21,021 INFO [stdout](默认任务-12)atg.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1779)〜[camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)atg.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:677)〜[camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)atg.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:515)~ [camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)atg.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:511)~ [camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)在org.apache.camel.impl.DefaultProducerTemplate.sendBodyAndHeaders(DefaultProducerTemplate.java:259)〜[camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)在org.apache.camel.impl.DefaultProducerTemplate.sendBodyAndHeaders(DefaultProducerTemplate.java:253)〜[camel-core-2.18.2.jar:2.18.2] 16:32:21,021 INFO [stdout](默认任务-12)at com.sial.notifications.messages.rest.NotificationMessageServiceImpl.submitMessageToRoute(NotificationMessageServiceImpl.java:66)〜[classes:?]

1 个答案:

答案 0 :(得分:1)

serializerClass=org.apache.kafka.common.serialization.ByteArraySerializer添加到生产者配置

按照你所说的

将对象封送到JSON之后添加.convertBodyTo(String.class)

我更喜欢前一个,因为它少了一个操作。