def publish_avro_records(project_id, topic_id, avsc_file): """Pulbish a BINARY or JSON encoded message to a topic configured with an Avro schema.""" # [START pubsub_publish_avro_records] from avro.io import BinaryEncoder, DatumWriter import avro import io import json from google.api_core.exceptions import NotFound from google.cloud.pubsub import PublisherClient from google.pubsub_v1.types import Encoding # TODO(developer): Replace these variables before running the sample. # project_id = "your-project-id" # topic_id = "your-topic-id" # avsc_file = "path/to/an/avro/schema/file/(.avsc)/formatted/in/json" publisher_client = PublisherClient() topic_path = publisher_client.topic_path(project_id, topic_id) # Prepare to write Avro records to the binary output stream. avro_schema = avro.schema.parse(open(avsc_file, "rb").read()) writer = DatumWriter(avro_schema) bout = io.BytesIO() # Prepare some data using a Python dictionary that matches the Avro schema record = {"name": "Alaska", "post_abbr": "AK"} try: # Get the topic encoding type. topic = publisher_client.get_topic(request={"topic": topic_path}) encoding = topic.schema_settings.encoding # Encode the data according to the message serialization type. if encoding == Encoding.BINARY: encoder = BinaryEncoder(bout) writer.write(record, encoder) data = bout.getvalue() print(f"Preparing a binary-encoded message:\n{data}") elif encoding == Encoding.JSON: data = json.dumps(record).encode("utf-8") print(f"Preparing a JSON-encoded message:\n{data}") else: print(f"No encoding specified in {topic_path}. Abort.") exit(0) future = publisher_client.publish(topic_path, data) print(f"Published message ID: {future.result()}") except NotFound: print(f"{topic_id} not found.")
def publish_proto_messages(project_id, topic_id): """Publish a BINARY or JSON encoded message to a topic configured with a protobuf schema.""" # [START pubsub_publish_proto_messages] from google.api_core.exceptions import NotFound from google.cloud.pubsub import PublisherClient from google.protobuf.json_format import MessageToJson from google.pubsub_v1.types import Encoding from utilities import us_states_pb2 # TODO(developer): Replace these variables before running the sample. # project_id = "your-project-id" # topic_id = "your-topic-id" publisher_client = PublisherClient() topic_path = publisher_client.topic_path(project_id, topic_id) try: # Get the topic encoding type. topic = publisher_client.get_topic(request={"topic": topic_path}) encoding = topic.schema_settings.encoding # Instantiate a protoc-generated class defined in `us-states.proto`. state = us_states_pb2.StateProto() state.name = "Alaska" state.post_abbr = "AK" # Encode the data according to the message serialization type. if encoding == Encoding.BINARY: data = state.SerializeToString() print(f"Preparing a binary-encoded message:\n{data}") elif encoding == Encoding.JSON: json_object = MessageToJson(state) data = str(json_object).encode("utf-8") print(f"Preparing a JSON-encoded message:\n{data}") else: print(f"No encoding specified in {topic_path}. Abort.") exit(0) future = publisher_client.publish(topic_path, data) print(f"Published message ID: {future.result()}") except NotFound: print(f"{topic_id} not found.")