出错说明
集成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("操作失败");
}
}
集成Kafka时,发送消息成功但在消费者端收到空内容。通过调整配置参数如content-type和headerMode无效。解决方案是在feign调用中使用@RequestBody注解,确保以JSON方式传递对象。


被折叠的 条评论
为什么被折叠?



