发送json作为字节数组以使用Python发送到kafka

时间:2018-07-21 14:28:57

标签: java python json apache-kafka

我最近尝试使用python将消息发送到Kafka。使用简单字节消息时,它可以工作。但是现在,我有一个json数据,我需要将其发送到Kafka主题,然后由Java应用程序使用。

我试图找出如何将json转换为byteArray(这是Java应用程序期望的有效载荷)。因此,我想出了以下python脚本。但是它失败了,因为json中有一些布尔变量,并且由于Json true和Python True不同,我收到类型错误。我尝试将json括在单引号中,但再次出现错误“扫描字符串文字时出现EOL”。只有修复了此错误之后,我才能知道是否能够将此数据发送到Kafka,因此,到目前为止,我一直在努力处理转换部分。下面是我的代码和json。

Json:

{
"header": {
"activityId": "550",
"timeStamp": "1490093093000",
"sequencingId": 1
},
"queueId": "604",
"contextRef": "SLIP.UPDATE"
,
"state": {
"slips": [{
  "id": "550",
  "creationDate": "2017-01-30T14:14:14.000+0000",
  "accountRef": "1",
  "customerRef": "2",
  "source": {
    "channelRef": "K"
  },
  "receipt": "O/0000002/0000487",
  "isSettled": true,
  "isConfirmed": true,
  "lines": {
    "number": 1,
    "win": 1,
    "lose": 0,
    "voided": 0
  }
}]
}
}

Python脚本:

#!/usr/bin/python

from kafka import KafkaProducer

KAFKA_TOPIC = 'slips'
KAFKA_BROKERS = '172.17.0.1:9092'

producer = KafkaProducer(value_serializer=lambda v:json.dumps(v).encode('utf-8'),bootstrap_servers=KAFKA_BROKERS)

messages = '{
"header": {
"activityId": "550",
"timeStamp": "1490093093000",
"sequencingId": 1
},
"queueId": "604",
"contextRef": "SLIP.UPDATE"
},
"state": {
"slips": [{
"id": "550",
"creationDate": "2017-01-30T14:14:14.000+0000",
"accountRef": "1",
"customerRef": "2",
"source": {
"channelRef": "K"
},
"receipt": "O/0000002/0000487",
"isSettled": true,
"isConfirmed": true,
"lines": {
"number": 1,
"win": 1,
"lose": 0,
"voided": 0
 }
}]
}
}'

info_as_json = json.loads(messages)

producer.send(KAFKA_TOPIC, info_as_json)

在我发布像这样的消息之前,消费者一直在消费消息:

messages = [b'hello kafka', b'I am sending', b'3 test messages']

消费者:

#!/usr/bin/python

import sys
from kafka import KafkaConsumer

KAFKA_TOPIC = 'slips'
KAFKA_BROKERS = '172.17.0.1:9092'

consumer = KafkaConsumer(bootstrap_servers=KAFKA_BROKERS,auto_offset_reset='earliest')

consumer.subscribe([KAFKA_TOPIC])
try:
    for message in consumer:
        print(message.value)
except KeyboardInterrupt:
    sys.exit()

更新:

我在json字符串中添加了三引号,并且生产者代码现在没有给出任何错误。但是,消费者并没有消费消息。至少,它没有像我期望的那样打印它们。

1 个答案:

答案 0 :(得分:0)

最后,我能够使用邮件了。生产者似乎有问题。我在StackOverflow上浏览了一些帖子,然后在我的生产者代码中添加了以下两个更改,它才起作用。

1)初始化生产者时linger_ms = 10

producer = KafkaProducer(value_serializer=lambda v:json.dumps(v).encode('utf-8'),bootstrap_servers=KAFKA_BROKERS, linger_ms=10)

2)发送消息后刷新

producer.flush()

我还没有找到为什么我的生产者在没有这些更改的情况下对简单字节消息而不对json进行工作的原因。