Spring Cloud Alibaba集成Kafka遇到的坑导致传递对象,消费者读消息内容为空的解决方案

集成Kafka时,发送消息成功但在消费者端收到空内容。通过调整配置参数如content-type和headerMode无效。解决方案是在feign调用中使用@RequestBody注解,确保以JSON方式传递对象。

出错说明

集成kafka为了获取支持多种方式处理日志,目前平台已支持直接入库的模式,现增加了Kafka的模式,后续会集成elk的模式。
在集成kafka的时候,发送消息成功,但接收消息时,获取到的对象内容为空。

排查过程

修改配置参数

spring:
  ##Kafka配置
  cloud:
    stream:
      bindings:
        log_input:
          destination: mate-log
#          producer:
#            headerMode: none
#          content-type: text/plain
        log_output:
          destination: mate-log
#          consumer:
#            headerMode: none
#          content-type: application/json
#      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092
          zk-nodes: localhost:2181
          auto-create-topics: true

调整过content-type和headerMode等参数,结果还是显示为空
样例如下:

[mate-log-producer:192.168.3.6:40001] 2020-09-04 23:00:25.905 INFO 38853 [] [KafkaConsumerDestination{consumerDestinationName='mate-log', partitions=1, dlqName='null'}.container-0-C-1] vip.mate.log.controller.LogProvider consume: CommonLog(type=null, traceId=null, title=null, operation=null, method=null, url=null, params=null, ip=null, executeTime=null, location=null, createBy=null, updateBy=null, createTime=null, updateTime=null, isDeleted=null, tenantId=null, exception=null),receive time:191505518080521

虽然可以读取到日志,但是内容全为空

排查结果

在feign调用的方法里传递CommonLog时加上@RequestBody,这样就以json的方式传递,否则导致传递数据内容为空。

package vip.mate.log.feign;

import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import vip.mate.core.common.api.Result;
import vip.mate.core.common.dto.CommonLog;
import vip.mate.core.kafka.channel.LogChannel;
import vip.mate.core.log.feign.ICommonLogProvider;

/**
 * 消息生产者调用
 * @author pangu
 */
@Slf4j
@RestController
@AllArgsConstructor
@Api(tags = "调用消息生产者")
public class CommonLogProvider implements ICommonLogProvider {

    private final LogChannel logChannel;

    @Override
    @PostMapping("/provider/common-log/send")
    @ApiOperation(value = "发送普通消息", notes = "发送普通消息")
    public Result<?> sendCommonLog(@RequestBody CommonLog commonLog) {
        boolean flag = logChannel.sendLogMessage().send(MessageBuilder.withPayload(commonLog).build());
        if (flag) {
            return Result.success("操作成功");
        }
        return Result.fail("操作失败");
    }
}

项目样例

https://github.com/matevip/matecloud

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值