几乎所有通过Web提供的pub / sub示例都使用String消息。
如何将除Java文本,JSON或AVRO之类的文本消息以外的消息发布到主题,然后通过订阅使用它。
非常感谢Pari
答案 0 :(得分:1)
您不能真正直接做到这一点,因为您可以看到here和here,发布的消息必须是字节串。相反,您可以做的是加载文件,将其编码为utf-8
,然后发布。之后,在提取时,可以将消息数据转储到文件中。例如,对于json使用python,您需要像这样发布:
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project, topic_name)
with open(json_path) as f:
data = str(json.load(f))
data = data.encode('utf-8')
publisher.publish(topic_path, data=data)
然后您可以像这样拉动和抛弃:
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(
project, subscription_name)
def callback(message):
with open('received_message.json', 'w') as outfile:
json.dump(message.data, outfile)
subscriber.subscribe(subscription_path, callback=callback)
答案 1 :(得分:1)
使用Node-publishMessage发布JSON:
const {PubSub} = require('@google-cloud/pubsub')
const pubsub = new PubSub()
const json = {
foo: 'bar'
}
await pubsub.topic('my-topic').publishMessage({json})
答案 2 :(得分:0)
撰写本文时
node.js @ google-cloud / pubsub库only accepts buffer objects,您需要进行字符串化。
https://github.com/googleapis/nodejs-pubsub/blob/master/samples/topics.js
async function publishMessage(topicName, data) {
// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');
// Creates a client
const pubsub = new PubSub();
// Publishes the message as a string, e.g. "Hello, world!" or JSON.stringify(someObject)
const dataBuffer = Buffer.from(data);
const messageId = await pubsub
.topic(topicName)
.publisher()
.publish(dataBuffer);
console.log(`Message ${messageId} published.`);
}
这可能很快就会改变!
请遵循以下要求/问题: https://github.com/googleapis/nodejs-pubsub/issues/121
该库可能很快会被修改为接受非缓冲对象并为您缓冲它们。
答案 3 :(得分:0)
以下代码可让您使用 JSON 在 Pub/Sub 中发布消息:
topic_path = 'your-topic-id'
publisher = pubsub_v1.PublisherClient()
record = {
'Key1': 'Value1',
'Key2': 'Value2',
'Key3': 'Value3',
'Key4': 'Value4'
}
data = json.dumps(record).encode("utf-8")
future = publisher.publish(topic_path, data)
print(f'published message id {future.result()}')
但是,您必须将 JSON 编码为 UTF-8。
希望能帮到你。