Java 以bytearray的形式发送json,并使用Python发送到kafka
我最近尝试使用python向卡夫卡发送消息。当使用简单字节消息时,它可以工作。但现在,我有一个json数据,我需要将它发送到Kafka主题,然后Java应用程序将使用它 我试图找出如何将json转换为byteArray(这是Java应用程序所期望的负载)。因此,我提出了下面的python脚本。但它失败了,因为json中有一些布尔变量,我得到了一个类型错误,因为json true和Python true在case中是不同的。我试图用单引号将json括起来,但还是出现了错误“EOL while scanning string literal”。只有在我修复了这个错误之后,我才能知道我是否能够将这些数据发送到卡夫卡,所以到目前为止,我正在努力处理转换部分。下面是我的代码和json Json: Python脚本:Java 以bytearray的形式发送json,并使用Python发送到kafka,java,python,json,apache-kafka,Java,Python,Json,Apache Kafka,我最近尝试使用python向卡夫卡发送消息。当使用简单字节消息时,它可以工作。但现在,我有一个json数据,我需要将它发送到Kafka主题,然后Java应用程序将使用它 我试图找出如何将json转换为byteArray(这是Java应用程序所期望的负载)。因此,我提出了下面的python脚本。但它失败了,因为json中有一些布尔变量,我得到了一个类型错误,因为json true和Python true在case中是不同的。我试图用单引号将json括起来,但还是出现了错误“EOL while sc
#!/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字符串中添加了三个引号,现在生产者代码没有给出任何错误。但消费者并不消费这些信息。至少,它没有像我期望的那样打印它们。最后,我能够使用消息。似乎制片人有问题。我浏览了一些关于StackOverflow的帖子,然后在我的制作人代码中添加了以下两个更改,结果很好 1) 初始化生产者时,玲珑_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进行更改 可能重复的请尝试替换脚本中的此部分,在前后添加三个双引号,例如:messages=“”{“header”:{“activityId”:“550”、#等“lose”:0,“void”:0}}}]}“}”,谢谢,这很有帮助。但我的消费者并没有意识到这一点。您发现我的生产商代码有任何问题吗?显示您是如何使用数据的我已编辑了消费者代码的问题。您发现为什么需要这些更改了吗?
producer.flush()