我是骆驼和卡夫卡的新手。 我使用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:?]
答案 0 :(得分:1)
将serializerClass=org.apache.kafka.common.serialization.ByteArraySerializer
添加到生产者配置
或
按照你所说的
将对象封送到JSON之后添加.convertBodyTo(String.class)
我更喜欢前一个,因为它少了一个操作。