在Cloud PubSub中发布非字符串消息

时间:2018-07-03 07:42:20

标签: google-cloud-platform google-cloud-pubsub

几乎所有通过Web提供的pub / sub示例都使用String消息。

如何将除Java文本,JSON或AVRO之类的文本消息以外的消息发布到主题,然后通过订阅使用它。

非常感谢Pari

4 个答案:

答案 0 :(得分:1)

您不能真正直接做到这一点,因为您可以看到herehere,发布的消息必须是字节串。相反,您可以做的是加载文件,将其编码为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。

希望能帮到你。