You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2022/04/10 15:40:47 UTC
[pulsar] branch master updated: Generate python doc for 2.10.0 (#15096)
This is an automated email from the ASF dual-hosted git repository.
mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new ee9e2cb2b1c Generate python doc for 2.10.0 (#15096)
ee9e2cb2b1c is described below
commit ee9e2cb2b1c49169b62a244977ddae6286b0f560
Author: lipenghui <pe...@apache.org>
AuthorDate: Sun Apr 10 23:40:41 2022 +0800
Generate python doc for 2.10.0 (#15096)
---
site2/website/static/api/python/2.10.0/index.html | 7 +
site2/website/static/api/python/2.10.0/pulsar.html | 6237 ++++++++++++++++++++
.../api/python/2.10.0/pulsar/exceptions.html | 260 +
.../static/api/python/2.10.0/pulsar/functions.html | 259 +
.../python/2.10.0/pulsar/functions/context.html | 1384 +++++
.../python/2.10.0/pulsar/functions/function.html | 376 ++
.../api/python/2.10.0/pulsar/functions/serde.html | 665 +++
.../static/api/python/2.10.0/pulsar/schema.html | 262 +
.../python/2.10.0/pulsar/schema/definition.html | 3274 ++++++++++
.../api/python/2.10.0/pulsar/schema/schema.html | 841 +++
.../python/2.10.0/pulsar/schema/schema_avro.html | 527 ++
site2/website/static/api/python/2.10.0/search.js | 46 +
12 files changed, 14138 insertions(+)
diff --git a/site2/website/static/api/python/2.10.0/index.html b/site2/website/static/api/python/2.10.0/index.html
new file mode 100644
index 00000000000..c13d629ab48
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/index.html
@@ -0,0 +1,7 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="refresh" content="0; url=./pulsar.html"/>
+</head>
+</html>
diff --git a/site2/website/static/api/python/2.10.0/pulsar.html b/site2/website/static/api/python/2.10.0/pulsar.html
new file mode 100644
index 00000000000..b8213c9b0f8
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar.html
@@ -0,0 +1,6237 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div>
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+ <h2>Contents</h2>
+ <ul>
+ <li><a href="#install-from-pypi">Install from PyPI</a></li>
+ <li><a href="#install-from-sources">Install from sources</a></li>
+ <li><a href="#examples">Examples</a></li>
+</ul>
+
+
+ <h2>Submodules</h2>
+ <ul>
+ <li><a href="pulsar/exceptions.html">pulsar.exceptions</a></li>
+ <li><a href="pulsar/functions.html">pulsar.functions</a></li>
+ <li><a href="pulsar/schema.html">pulsar.schema</a></li>
+ </ul>
+
+ <h2>API Documentation</h2>
+ <ul class="memberlist">
+ <li>
+ <a class="class" href="#MessageId">MessageId</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#MessageId.__init__">MessageId</a>
+ </li>
+ <li>
+ <a class="variable" href="#MessageId.earliest">earliest</a>
+ </li>
+ <li>
+ <a class="variable" href="#MessageId.latest">latest</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.ledger_id">ledger_id</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.entry_id">entry_id</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.batch_index">batch_index</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.partition">partition</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.serialize">serialize</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageId.deserialize">deserialize</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Message">Message</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Message.__init__">Message</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.data">data</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.value">value</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.properties">properties</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.partition_key">partition_key</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.publish_timestamp">publish_timestamp</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.event_timestamp">event_timestamp</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.message_id">message_id</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.topic_name">topic_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.redelivery_count">redelivery_count</a>
+ </li>
+ <li>
+ <a class="function" href="#Message.schema_version">schema_version</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#MessageBatch">MessageBatch</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#MessageBatch.__init__">MessageBatch</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageBatch.with_message_id">with_message_id</a>
+ </li>
+ <li>
+ <a class="function" href="#MessageBatch.parse_from">parse_from</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Authentication">Authentication</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Authentication.__init__">Authentication</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#AuthenticationTLS">AuthenticationTLS</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#AuthenticationTLS.__init__">AuthenticationTLS</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#AuthenticationToken">AuthenticationToken</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#AuthenticationToken.__init__">AuthenticationToken</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#AuthenticationAthenz">AuthenticationAthenz</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#AuthenticationAthenz.__init__">AuthenticationAthenz</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#AuthenticationOauth2">AuthenticationOauth2</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#AuthenticationOauth2.__init__">AuthenticationOauth2</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Client">Client</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Client.__init__">Client</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.create_producer">create_producer</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.subscribe">subscribe</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.create_reader">create_reader</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.get_topic_partitions">get_topic_partitions</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.shutdown">shutdown</a>
+ </li>
+ <li>
+ <a class="function" href="#Client.close">close</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Producer">Producer</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Producer.__init__">Producer</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.topic">topic</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.producer_name">producer_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.last_sequence_id">last_sequence_id</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.send">send</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.send_async">send_async</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.flush">flush</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.close">close</a>
+ </li>
+ <li>
+ <a class="function" href="#Producer.is_connected">is_connected</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Consumer">Consumer</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Consumer.__init__">Consumer</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.topic">topic</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.subscription_name">subscription_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.unsubscribe">unsubscribe</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.receive">receive</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.acknowledge">acknowledge</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.acknowledge_cumulative">acknowledge_cumulative</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.negative_acknowledge">negative_acknowledge</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.pause_message_listener">pause_message_listener</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.resume_message_listener">resume_message_listener</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.redeliver_unacknowledged_messages">redeliver_unacknowledged_messages</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.seek">seek</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.close">close</a>
+ </li>
+ <li>
+ <a class="function" href="#Consumer.is_connected">is_connected</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Reader">Reader</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Reader.__init__">Reader</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.topic">topic</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.read_next">read_next</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.has_message_available">has_message_available</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.seek">seek</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.close">close</a>
+ </li>
+ <li>
+ <a class="function" href="#Reader.is_connected">is_connected</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#CryptoKeyReader">CryptoKeyReader</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#CryptoKeyReader.__init__">CryptoKeyReader</a>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+pulsar </h1>
+
+ <div class="docstring"><p>The Pulsar Python client library is based on the existing C++ client library.
+All the same features are exposed through the Python interface.</p>
+
+<p>Currently, the supported Python versions are 2.7, 3.5, 3.6, 3.7 and 3.8.</p>
+
+<h2 id="install-from-pypi">Install from PyPI</h2>
+
+<p>Download Python wheel binary files for MacOS and Linux
+directly from the PyPI archive.</p>
+
+<pre><code>#!shell
+$ sudo pip install pulsar-client
+</code></pre>
+
+<h2 id="install-from-sources">Install from sources</h2>
+
+<p>Follow the instructions to compile the Pulsar C++ client library. This method
+will also build the Python binding for the library.</p>
+
+<p>To install the Python bindings:</p>
+
+<pre><code>#!shell
+$ cd pulsar-client-cpp/python
+$ sudo python setup.py install
+</code></pre>
+
+<h2 id="examples">Examples</h2>
+
+<h3 id="producerpulsarproducer-example"><a href="#<a href="#Producer">pulsar.Producer</a>">Producer</a> example</h3>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+
+producer = client.create_producer('my-topic')
+
+for i in range(10):
+ producer.send(('Hello-%d' % i).encode('utf-8'))
+
+client.close()
+</code></pre>
+
+<h4 id="consumerpulsarconsumer-example"><a href="#<a href="#Consumer">pulsar.Consumer</a>">Consumer</a> Example</h4>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+consumer = client.subscribe('my-topic', 'my-subscription')
+
+while True:
+ msg = consumer.receive()
+ try:
+ print("Received message '%s' id='%s'", msg.data().decode('utf-8'), msg.message_id())
+ consumer.acknowledge(msg)
+ except:
+ consumer.negative_acknowledge(msg)
+
+client.close()
+</code></pre>
+
+<h3 id="async-producerpulsarproducersend_async-example"><a href="#<a href="#Producer.send_async">pulsar.Producer.send_async</a>">Async producer</a> example</h3>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+
+producer = client.create_producer(
+ 'my-topic',
+ block_if_queue_full=True,
+ batching_enabled=True,
+ batching_max_publish_delay_ms=10
+ )
+
+def send_callback(res, msg_id):
+ print('Message published res=%s', res)
+
+while True:
+ producer.send_async(('Hello-%d' % i).encode('utf-8'), send_callback)
+
+client.close()
+</code></pre>
+</div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="sd">"""</span>
+<span class="sd">The Pulsar Python client library is based on the existing C++ client library.</span>
+<span class="sd">All the same features are exposed through the Python interface.</span>
+
+<span class="sd">Currently, the supported Python versions are 2.7, 3.5, 3.6, 3.7 and 3.8.</span>
+
+<span class="sd">## Install from PyPI</span>
+
+<span class="sd">Download Python wheel binary files for MacOS and Linux</span>
+<span class="sd">directly from the PyPI archive.</span>
+
+<span class="sd"> #!shell</span>
+<span class="sd"> $ sudo pip install pulsar-client</span>
+
+<span class="sd">## Install from sources</span>
+
+<span class="sd">Follow the instructions to compile the Pulsar C++ client library. This method</span>
+<span class="sd">will also build the Python binding for the library.</span>
+
+<span class="sd">To install the Python bindings:</span>
+
+<span class="sd"> #!shell</span>
+<span class="sd"> $ cd pulsar-client-cpp/python</span>
+<span class="sd"> $ sudo python setup.py install</span>
+
+<span class="sd">## Examples</span>
+
+<span class="sd">### [Producer](#pulsar.Producer) example</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> import pulsar</span>
+
+<span class="sd"> client = pulsar.Client('pulsar://localhost:6650')</span>
+
+<span class="sd"> producer = client.create_producer('my-topic')</span>
+
+<span class="sd"> for i in range(10):</span>
+<span class="sd"> producer.send(('Hello-%d' % i).encode('utf-8'))</span>
+
+<span class="sd"> client.close()</span>
+
+<span class="sd">#### [Consumer](#pulsar.Consumer) Example</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> import pulsar</span>
+
+<span class="sd"> client = pulsar.Client('pulsar://localhost:6650')</span>
+<span class="sd"> consumer = client.subscribe('my-topic', 'my-subscription')</span>
+
+<span class="sd"> while True:</span>
+<span class="sd"> msg = consumer.receive()</span>
+<span class="sd"> try:</span>
+<span class="sd"> print("Received message '%s' id='%s'", msg.data().decode('utf-8'), msg.message_id())</span>
+<span class="sd"> consumer.acknowledge(msg)</span>
+<span class="sd"> except:</span>
+<span class="sd"> consumer.negative_acknowledge(msg)</span>
+
+<span class="sd"> client.close()</span>
+
+<span class="sd">### [Async producer](#pulsar.Producer.send_async) example</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> import pulsar</span>
+
+<span class="sd"> client = pulsar.Client('pulsar://localhost:6650')</span>
+
+<span class="sd"> producer = client.create_producer(</span>
+<span class="sd"> 'my-topic',</span>
+<span class="sd"> block_if_queue_full=True,</span>
+<span class="sd"> batching_enabled=True,</span>
+<span class="sd"> batching_max_publish_delay_ms=10</span>
+<span class="sd"> )</span>
+
+<span class="sd"> def send_callback(res, msg_id):</span>
+<span class="sd"> print('Message published res=%s', res)</span>
+
+<span class="sd"> while True:</span>
+<span class="sd"> producer.send_async(('Hello-%d' % i).encode('utf-8'), send_callback)</span>
+
+<span class="sd"> client.close()</span>
+<span class="sd">"""</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">_pulsar</span>
+
+<span class="kn">from</span> <span class="nn">_pulsar</span> <span class="kn">import</span> <span class="n">Result</span><span class="p">,</span> <span class="n">CompressionType</span><span class="p">,</span> <span class="n">ConsumerType</span><span class="p">,</span> <span class="n">InitialPosition</span><span class="p">,</span> <span class="n">PartitionsRoutingMode</span><span class="p">,</span> <span class="n">BatchingType</span> <span class="c1"># noqa: F401</span>
+
+<span class="kn">from</span> <span class="nn">pulsar.exceptions</span> <span class="kn">import</span> <span class="o">*</span>
+
+<span class="kn">from</span> <span class="nn">pulsar.functions.function</span> <span class="kn">import</span> <span class="n">Function</span>
+<span class="kn">from</span> <span class="nn">pulsar.functions.context</span> <span class="kn">import</span> <span class="n">Context</span>
+<span class="kn">from</span> <span class="nn">pulsar.functions.serde</span> <span class="kn">import</span> <span class="n">SerDe</span><span class="p">,</span> <span class="n">IdentitySerDe</span><span class="p">,</span> <span class="n">PickleSerDe</span>
+<span class="kn">from</span> <span class="nn">pulsar</span> <span class="kn">import</span> <span class="n">schema</span>
+<span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="n">_retype</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">'x'</span><span class="p">))</span>
+
+<span class="kn">import</span> <span class="nn">certifi</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
+
+
+<span class="k">class</span> <span class="nc">MessageId</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Represents a message id</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">batch_index</spa [...]
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+
+ <span class="s1">'Represents the earliest message stored in a topic'</span>
+ <span class="n">earliest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">earliest</span>
+
+ <span class="s1">'Represents the latest message published on a topic'</span>
+ <span class="n">latest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">latest</span>
+
+ <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a bytes representation of the message id.</span>
+<span class="sd"> This bytes sequence can be stored and later deserialized.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Deserialize a message id object from a previously</span>
+<span class="sd"> serialized bytes sequence.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">Message</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Message objects are returned by a consumer, either by calling `receive` or</span>
+<span class="sd"> through a listener.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object typed bytes with the payload of the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object with the de-serialized version of the message content</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the properties attached to the message. Properties are</span>
+<span class="sd"> application-defined key/value pairs that will be attached to the</span>
+<span class="sd"> message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the partitioning key for the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The message ID that can be used to refere to this particular message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the topic Name from which this message originated from</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the redelivery count for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the schema version for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">_wrap</span><span class="p">(</span><span class="n">_message</span><span class="p">):</span>
+ <span class="bp">self</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">_message</span>
+ <span class="k">return</span> <span class="bp">self</span>
+
+
+<span class="k">class</span> <span class="nc">MessageBatch</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+ <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"unknown message id type"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+
+
+<span class="k">class</span> <span class="nc">Authentication</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Authentication provider object. Used to load authentication from an external</span>
+<span class="sd"> shared library.</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd"> (such as `tls.so`)</span>
+<span class="sd"> * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd"> configuration params</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">'dynamicLibPath'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">'authParamsString'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationTLS</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> TLS Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the TLS authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `certificatePath`: Path to the public certificate</span>
+<span class="sd"> * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">'certificate_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationToken</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Token based authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the token authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd"> string with the token</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument token is expected to be of type 'str' or a function returning 'str'"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationAthenz</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Athenz Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Athenz authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">AuthenticationOauth2</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Oauth2 Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Client</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The Pulsar client. A single client instance can be used to create producers</span>
+<span class="sd"> and consumers on multiple topics.</span>
+
+<span class="sd"> The client will share the same connection pool and threads across all</span>
+<span class="sd"> producers and consumers.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+ <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+ <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new Pulsar client instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `authentication`:</span>
+<span class="sd"> Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd"> `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd"> * `operation_timeout_seconds`:</span>
+<span class="sd"> Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd"> unsubscribe).</span>
+<span class="sd"> * `io_threads`:</span>
+<span class="sd"> Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd"> * `message_listener_threads`:</span>
+<span class="sd"> Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd"> delivering messages through message listener. The default is 1 thread</span>
+<span class="sd"> per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd"> `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd"> single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd"> * `concurrent_lookup_requests`:</span>
+<span class="sd"> Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd"> to prevent overload on the broker.</span>
+<span class="sd"> * `log_conf_file_path`:</span>
+<span class="sd"> Initialize log4cxx from a configuration file.</span>
+<span class="sd"> * `use_tls`:</span>
+<span class="sd"> Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd"> is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd"> set to `pulsar+ssl://` or `https://`</span>
+<span class="sd"> * `tls_trust_certs_file_path`:</span>
+<span class="sd"> Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd"> certifi.</span>
+<span class="sd"> * `tls_allow_insecure_connection`:</span>
+<span class="sd"> Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd"> from the broker.</span>
+<span class="sd"> * `tls_validate_hostname`:</span>
+<span class="sd"> Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd"> endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd"> the endpoint.</span>
+<span class="sd"> * `logger`:</span>
+<span class="sd"> Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd"> * `connection_timeout_ms`:</span>
+<span class="sd"> Set timeout in milliseconds on TCP connections.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">'service_url'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">'authentication'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">'operation_timeout_seconds'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">'connection_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">'io_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">'message_listener_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">'concurrent_lookup_requests'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">'log_conf_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">'use_tls'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">'tls_trust_certs_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">'tls_allow_insecure_connection'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">'tls_validate_hostname'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">'logger'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'pulsar+ssl://'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'https://'</span><span class="p">):</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+ <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+ <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+ <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+ <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+ <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+ <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new producer on a given topic.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`:</span>
+<span class="sd"> The topic name</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `producer_name`:</span>
+<span class="sd"> Specify a name for the producer. If not assigned,</span>
+<span class="sd"> the system will generate a globally unique name which can be accessed</span>
+<span class="sd"> with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd"> the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd"> across all Pulsar's clusters.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be published by this producer.</span>
+<span class="sd"> The schema will be used for two purposes:</span>
+<span class="sd"> - Validate the data format against the topic defined schema</span>
+<span class="sd"> - Perform serialization/deserialization between data and objects</span>
+<span class="sd"> An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd"> * `initial_sequence_id`:</span>
+<span class="sd"> Set the baseline for the sequence ids for messages</span>
+<span class="sd"> published by the producer. First message will be using</span>
+<span class="sd"> `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd"> be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd"> * `send_timeout_millis`:</span>
+<span class="sd"> If a message is not acknowledged by the server before the</span>
+<span class="sd"> `send_timeout` expires, an error will be reported.</span>
+<span class="sd"> * `compression_type`:</span>
+<span class="sd"> Set the compression type for the producer. By default, message</span>
+<span class="sd"> payloads are not compressed. Supported compression types are</span>
+<span class="sd"> `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd"> ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd"> SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd"> * `max_pending_messages`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment from the broker.</span>
+<span class="sd"> * `max_pending_messages_across_partitions`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment across partitions from the broker.</span>
+<span class="sd"> * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd"> block when the outgoing message queue is full.</span>
+<span class="sd"> * `message_routing_mode`:</span>
+<span class="sd"> Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd"> other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd"> * `lazy_start_partitioned_producers`:</span>
+<span class="sd"> This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd"> producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd"> or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd"> started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd"> any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd"> message.</span>
+<span class="sd"> Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd"> partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd"> Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd"> for the first messages of a given partition.</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd"> can be used for identify a producer at broker side.</span>
+<span class="sd"> * `batching_type`:</span>
+<span class="sd"> Sets the batching type for the producer.</span>
+<span class="sd"> There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd"> - Default batching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd"> - KeyBasedBatching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd"> * encryption_key:</span>
+<span class="sd"> The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">'producer_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">'initial_sequence_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">'send_timeout_millis'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">'compression_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">'max_pending_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">'max_pending_messages_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">'block_if_queue_full'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">'batching_enabled'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">'batching_max_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">'batching_max_allowed_size_in_bytes'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">'batching_max_publish_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">'batching_type'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">'encryption_key'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">'lazy_start_partitioned_producers'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+ <span class="k">return</span> <span class="n">p</span>
+
+ <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+ <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+ <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd"> This method will accept these forms:</span>
+<span class="sd"> - `topic='my-topic'`</span>
+<span class="sd"> - `topic=['topic-1', 'topic-2', 'topic-3']`</span>
+<span class="sd"> - `topic=re.compile('persistent://public/default/topic-*')`</span>
+<span class="sd"> * `subscription`: The name of the subscription.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `consumer_type`:</span>
+<span class="sd"> Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this consumer.</span>
+<span class="sd"> * `message_listener`:</span>
+<span class="sd"> Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (consumer, message), for example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def my_listener(consumer, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> consumer.acknowledge(message)</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd"> before the application calls `receive()`. Using a higher value could</span>
+<span class="sd"> potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd"> memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd"> the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd"> This approach improves the message distribution on shared subscription</span>
+<span class="sd"> by pushing messages only to those consumers that are ready to process</span>
+<span class="sd"> them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd"> if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd"> should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd"> default value is 1000 messages and should work well for most use</span>
+<span class="sd"> cases.</span>
+<span class="sd"> * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd"> Set the max total receiver queue size across partitions.</span>
+<span class="sd"> This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd"> * `consumer_name`:</span>
+<span class="sd"> Sets the consumer name.</span>
+<span class="sd"> * `unacked_messages_timeout_ms`:</span>
+<span class="sd"> Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd"> timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd"> the given value is less than 10 seconds. If a successful</span>
+<span class="sd"> acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd"> messages are redelivered.</span>
+<span class="sd"> * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd"> The delay after which to redeliver the messages that failed to be</span>
+<span class="sd"> processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd"> * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd"> Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd"> be cached in the client.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd"> can be used for identify a consumer at broker side.</span>
+<span class="sd"> * `pattern_auto_discovery_period`:</span>
+<span class="sd"> Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd"> * `initial_position`:</span>
+<span class="sd"> Set the initial position of a consumer when subscribing to the topic.</span>
+<span class="sd"> It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd"> Default: `Latest`.</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> * replicate_subscription_state_enabled:</span>
+<span class="sd"> Set whether the subscription status should be replicated.</span>
+<span class="sd"> Default: `False`.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">'subscription_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">'consumer_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+ <span class="s1">'max_total_receiver_queue_size_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">'consumer_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">'unacked_messages_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">'broker_consumer_stats_cache_time_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">'negative_ack_redelivery_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">'pattern_auto_discovery_period'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">'initial_position'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1"># Single topic</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="c1"># List of topics</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+ <span class="c1"># Regex pattern</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument 'topic' is expected to be of a type between (str, list, re.pattern)"</span><span class="p">)</span>
+
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+
+ <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a reader on a particular topic</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic.</span>
+<span class="sd"> * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd"> The options are:</span>
+<span class="sd"> * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd"> * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd"> after the reader was created</span>
+<span class="sd"> * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd"> that specific position. The first message to be read will be the message next to the</span>
+<span class="sd"> specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd"> back into a `MessageId` object:</span>
+
+<span class="sd"> # Serialize to string</span>
+<span class="sd"> s = msg.message_id().serialize()</span>
+
+<span class="sd"> # Deserialize from string</span>
+<span class="sd"> msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this reader.</span>
+<span class="sd"> * `reader_listener`:</span>
+<span class="sd"> Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (reader, message), for example:</span>
+
+<span class="sd"> def my_listener(reader, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> pass</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the reader</span>
+<span class="sd"> before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd"> potentially increase the reader throughput at the expense of higher</span>
+<span class="sd"> memory utilization.</span>
+<span class="sd"> * `reader_name`:</span>
+<span class="sd"> Sets the reader name.</span>
+<span class="sd"> * `subscription_role_prefix`:</span>
+<span class="sd"> Sets the subscription role prefix.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">'start_message_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">'reader_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">'subscription_role_prefix'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+
+ <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the list of partitions for a given topic.</span>
+
+<span class="sd"> If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd"> partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd"> This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd"> instances directly on a particular partition.</span>
+<span class="sd"> :param topic: the topic name to lookup</span>
+<span class="sd"> :return: a list of partition name</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd"> Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd"> for ongoing operations to complete.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the client and all the associated producers and consumers</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">Producer</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The Pulsar message producer, used to publish messages on a topic.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic which producer is publishing to</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the producer name which could have been assigned by the</span>
+<span class="sd"> system or specified by the client</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the last sequence id that was published by this producer.</span>
+
+<span class="sd"> This represent either the automatically assigned or custom sequence id</span>
+<span class="sd"> (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd"> After recreating a producer with the same producer name, this will return the</span>
+<span class="sd"> last message that was published in the previous producer session, or -1 if</span>
+<span class="sd"> there no message was ever published.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd"> Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd"> to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`:</span>
+<span class="sd"> Override namespace replication clusters. Note that it is the caller's</span>
+<span class="sd"> responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd"> have been previously configured as topics. Given an empty list,</span>
+<span class="sd"> the message will replicate according to the namespace configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Send a message asynchronously.</span>
+
+<span class="sd"> The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd"> by the broker.</span>
+
+<span class="sd"> Example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def callback(res, msg_id):</span>
+<span class="sd"> print('Message published: %s' % res)</span>
+
+<span class="sd"> producer.send_async(msg, callback)</span>
+
+<span class="sd"> When the producer queue is full, by default the message will be rejected</span>
+<span class="sd"> and the callback invoked with an error code.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application0-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd"> used to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd"> that it is the caller's responsibility to provide valid cluster names</span>
+<span class="sd"> and that all clusters have been previously configured as topics.</span>
+<span class="sd"> Given an empty list, the message will replicate per the namespace</span>
+<span class="sd"> configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+
+ <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd"> successfully persisted</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the producer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_build_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="s1">'partition_key'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span> <span class="s1">'sequence_id'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">replication_clusters</span><span class="p">,</span> <span class="s1">'replication_clusters'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="s1">'disable_replication'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span> <span class="s1">'event_timestamp'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">deliver_at</span><span class="p">,</span> <span class="s1">'deliver_at'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">timedelta</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">,</span> <span class="s1">'deliver_after'</span><span class="p">)</span>
+
+ <span class="n">mb</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBuilder</span><span class="p">()</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">content</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">partition_key</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">partition_key</span><span class="p">(</span><span class="n">partition_key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">sequence_id</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">sequence_id</span><span class="p">(</span><span class="n">sequence_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">replication_clusters</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">replication_clusters</span><span class="p">(</span><span class="n">replication_clusters</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">disable_replication</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">disable_replication</span><span class="p">(</span><span class="n">disable_replication</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">event_timestamp</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">(</span><span class="n">event_timestamp</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">deliver_at</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">deliver_at</span><span class="p">(</span><span class="n">deliver_at</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">deliver_after</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">deliver_after</span><span class="p">(</span><span class="n">deliver_after</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">mb</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the producer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">Consumer</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pulsar consumer.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this consumer is subscribed to.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the subscription name.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd"> This method will block until the operation is completed. Once the</span>
+<span class="sd"> consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd"> subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd"> This consumer object cannot be reused.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Receive a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+
+ <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of a single message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd"> including) the provided message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the failure to process a single message.</span>
+
+<span class="sd"> When a message is "negatively acked" it will be marked for redelivery after</span>
+<span class="sd"> some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd"> with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd"> This call is not blocking.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pause receiving messages via the `message_listener` until</span>
+<span class="sd"> `resume_message_listener()` is called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Resume receiving the messages via the message listener.</span>
+<span class="sd"> Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd"> `pause_message_listener()` was called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd"> request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd"> shared mode, the consumer's messages to be redelivered are distributed</span>
+<span class="sd"> across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd"> doesn't throw an exception. In case the connection breaks, the messages</span>
+<span class="sd"> are redelivered after reconnect.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the consumer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the consumer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+
+<span class="k">class</span> <span class="nc">Reader</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pulsar topic reader.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this reader is reading from.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Read a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+
+ <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if there is any message available to read from the current position.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+
+ <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the reader.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the reader is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">CryptoKeyReader</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Default crypto key reader implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create crypto key reader.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `public_key_path`: Path to the public key</span>
+<span class="sd"> * `private_key_path`: Path to private key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">'public_key_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_check_type</span><span class="p">(</span><span class="n">var_type</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="n">var_type</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument </span><span class="si">%s</span><span class="s2"> is expected to be of type '</span><span class="si">%s</span><span class="s2">' and not '</span><span class="si">%s</span><span class="s2">'"</span>
+ <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">var_type</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
+
+
+<span class="k">def</span> <span class="nf">_check_type_or_none</span><span class="p">(</span><span class="n">var_type</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">var</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="n">var_type</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument </span><span class="si">%s</span><span class="s2"> is expected to be either None or of type '</span><span class="si">%s</span><span class="s2">'"</span>
+ <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">var_type</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
+
+
+<span class="k">def</span> <span class="nf">_listener_wrapper</span><span class="p">(</span><span class="n">listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">consumer</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="n">consumer</span>
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="n">listener</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">wrapper</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ <section id="MessageId">
+ <div class="attr class">
+ <a class="headerlink" href="#MessageId">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">MessageId</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">MessageId</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Represents a message id</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">batch_index</spa [...]
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+
+ <span class="s1">'Represents the earliest message stored in a topic'</span>
+ <span class="n">earliest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">earliest</span>
+
+ <span class="s1">'Represents the latest message published on a topic'</span>
+ <span class="n">latest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">latest</span>
+
+ <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a bytes representation of the message id.</span>
+<span class="sd"> This bytes sequence can be stored and later deserialized.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Deserialize a message id object from a previously</span>
+<span class="sd"> serialized bytes sequence.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Represents a message id</p>
+</div>
+
+
+ <div id="MessageId.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.__init__">#  </a>
+
+
+ <span class="name">MessageId</span><span class="signature">(partition=-1, ledger_id=-1, entry_id=-1, batch_index=-1)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1 [...]
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageId.earliest" class="classattr">
+ <div class="attr variable"><a class="headerlink" href="#MessageId.earliest">#  </a>
+
+ <span class="name">earliest</span><span class="default_value"> = <_pulsar.MessageId object></span>
+ </div>
+
+
+ <div class="docstring"><p>Represents the latest message published on a topic</p>
+</div>
+
+
+ </div>
+ <div id="MessageId.latest" class="classattr">
+ <div class="attr variable"><a class="headerlink" href="#MessageId.latest">#  </a>
+
+ <span class="name">latest</span><span class="default_value"> = <_pulsar.MessageId object></span>
+ </div>
+
+
+
+
+ </div>
+ <div id="MessageId.ledger_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.ledger_id">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">ledger_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageId.entry_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.entry_id">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">entry_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageId.batch_index" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.batch_index">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">batch_index</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageId.partition" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.partition">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">partition</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageId.serialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.serialize">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">serialize</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns a bytes representation of the message id.</span>
+<span class="sd"> This bytes sequence can be stored and later deserialized.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns a bytes representation of the message id.
+This bytes sequence can be stored and later deserialized.</p>
+</div>
+
+
+ </div>
+ <div id="MessageId.deserialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageId.deserialize">#  </a>
+
+ <div class="decorator">@staticmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">deserialize</span><span class="signature">(message_id_bytes)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Deserialize a message id object from a previously</span>
+<span class="sd"> serialized bytes sequence.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Deserialize a message id object from a previously
+serialized bytes sequence.</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="Message">
+ <div class="attr class">
+ <a class="headerlink" href="#Message">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Message</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Message</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Message objects are returned by a consumer, either by calling `receive` or</span>
+<span class="sd"> through a listener.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object typed bytes with the payload of the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object with the de-serialized version of the message content</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the properties attached to the message. Properties are</span>
+<span class="sd"> application-defined key/value pairs that will be attached to the</span>
+<span class="sd"> message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the partitioning key for the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The message ID that can be used to refere to this particular message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the topic Name from which this message originated from</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the redelivery count for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the schema version for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">_wrap</span><span class="p">(</span><span class="n">_message</span><span class="p">):</span>
+ <span class="bp">self</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">_message</span>
+ <span class="k">return</span> <span class="bp">self</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Message objects are returned by a consumer, either by calling <code>receive</code> or
+through a listener.</p>
+</div>
+
+
+ <div id="Message.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.__init__">#  </a>
+
+
+ <span class="name">Message</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Message.data" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.data">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">data</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object typed bytes with the payload of the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns object typed bytes with the payload of the message.</p>
+</div>
+
+
+ </div>
+ <div id="Message.value" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.value">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">value</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Returns object with the de-serialized version of the message content</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns object with the de-serialized version of the message content</p>
+</div>
+
+
+ </div>
+ <div id="Message.properties" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.properties">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">properties</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the properties attached to the message. Properties are</span>
+<span class="sd"> application-defined key/value pairs that will be attached to the</span>
+<span class="sd"> message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the properties attached to the message. Properties are
+application-defined key/value pairs that will be attached to the
+message.</p>
+</div>
+
+
+ </div>
+ <div id="Message.partition_key" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.partition_key">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">partition_key</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the partitioning key for the message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the partitioning key for the message.</p>
+</div>
+
+
+ </div>
+ <div id="Message.publish_timestamp" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.publish_timestamp">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">publish_timestamp</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the timestamp in milliseconds with the message publish time.</p>
+</div>
+
+
+ </div>
+ <div id="Message.event_timestamp" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.event_timestamp">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">event_timestamp</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the timestamp in milliseconds with the message event time.</p>
+</div>
+
+
+ </div>
+ <div id="Message.message_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.message_id">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">message_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> The message ID that can be used to refere to this particular message.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>The message ID that can be used to refere to this particular message.</p>
+</div>
+
+
+ </div>
+ <div id="Message.topic_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.topic_name">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">topic_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the topic Name from which this message originated from</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the topic Name from which this message originated from</p>
+</div>
+
+
+ </div>
+ <div id="Message.redelivery_count" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.redelivery_count">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">redelivery_count</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the redelivery count for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the redelivery count for this message</p>
+</div>
+
+
+ </div>
+ <div id="Message.schema_version" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Message.schema_version">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">schema_version</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the schema version for this message</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the schema version for this message</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="MessageBatch">
+ <div class="attr class">
+ <a class="headerlink" href="#MessageBatch">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">MessageBatch</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">MessageBatch</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+ <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"unknown message id type"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+</pre></div>
+
+ </details>
+
+
+
+ <div id="MessageBatch.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageBatch.__init__">#  </a>
+
+
+ <span class="name">MessageBatch</span><span class="signature">()</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageBatch.with_message_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageBatch.with_message_id">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">with_message_id</span><span class="signature">(self, msg_id)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+ <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"unknown message id type"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="MessageBatch.parse_from" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#MessageBatch.parse_from">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">parse_from</span><span class="signature">(self, data, size)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ </section>
+ <section id="Authentication">
+ <div class="attr class">
+ <a class="headerlink" href="#Authentication">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Authentication</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Authentication</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Authentication provider object. Used to load authentication from an external</span>
+<span class="sd"> shared library.</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd"> (such as `tls.so`)</span>
+<span class="sd"> * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd"> configuration params</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">'dynamicLibPath'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">'authParamsString'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Authentication provider object. Used to load authentication from an external
+shared library.</p>
+</div>
+
+
+ <div id="Authentication.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Authentication.__init__">#  </a>
+
+
+ <span class="name">Authentication</span><span class="signature">(dynamicLibPath, authParamsString)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd"> (such as `tls.so`)</span>
+<span class="sd"> * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd"> configuration params</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">'dynamicLibPath'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">'authParamsString'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create the authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>dynamicLibPath</code>: Path to the authentication provider shared library
+(such as <code>tls.so</code>)</li>
+<li><code>authParamsString</code>: Comma-separated list of provider-specific
+configuration params</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ <section id="AuthenticationTLS">
+ <div class="attr class">
+ <a class="headerlink" href="#AuthenticationTLS">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">AuthenticationTLS</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationTLS</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> TLS Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the TLS authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `certificatePath`: Path to the public certificate</span>
+<span class="sd"> * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">'certificate_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>TLS Authentication implementation</p>
+</div>
+
+
+ <div id="AuthenticationTLS.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#AuthenticationTLS.__init__">#  </a>
+
+
+ <span class="name">AuthenticationTLS</span><span class="signature">(certificate_path, private_key_path)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the TLS authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `certificatePath`: Path to the public certificate</span>
+<span class="sd"> * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">'certificate_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create the TLS authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>certificatePath</code>: Path to the public certificate</li>
+<li><code>privateKeyPath</code>: Path to private TLS key</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ <section id="AuthenticationToken">
+ <div class="attr class">
+ <a class="headerlink" href="#AuthenticationToken">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">AuthenticationToken</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationToken</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Token based authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the token authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd"> string with the token</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument token is expected to be of type 'str' or a function returning 'str'"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Token based authentication implementation</p>
+</div>
+
+
+ <div id="AuthenticationToken.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#AuthenticationToken.__init__">#  </a>
+
+
+ <span class="name">AuthenticationToken</span><span class="signature">(token)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the token authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd"> string with the token</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument token is expected to be of type 'str' or a function returning 'str'"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create the token authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>token</code>: A string containing the token or a functions that provides a
+ string with the token</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ <section id="AuthenticationAthenz">
+ <div class="attr class">
+ <a class="headerlink" href="#AuthenticationAthenz">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">AuthenticationAthenz</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationAthenz</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Athenz Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Athenz authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Athenz Authentication implementation</p>
+</div>
+
+
+ <div id="AuthenticationAthenz.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#AuthenticationAthenz.__init__">#  </a>
+
+
+ <span class="name">AuthenticationAthenz</span><span class="signature">(auth_params_string)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Athenz authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create the Athenz authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>auth_params_string</code>: JSON encoded configuration for Athenz client</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ <section id="AuthenticationOauth2">
+ <div class="attr class">
+ <a class="headerlink" href="#AuthenticationOauth2">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">AuthenticationOauth2</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationOauth2</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Oauth2 Authentication implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Oauth2 Authentication implementation</p>
+</div>
+
+
+ <div id="AuthenticationOauth2.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#AuthenticationOauth2.__init__">#  </a>
+
+
+ <span class="name">AuthenticationOauth2</span><span class="signature">(auth_params_string)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">'auth_params_string'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create the Oauth2 authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>auth_params_string</code>: JSON encoded configuration for Oauth2 client</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ <section id="Client">
+ <div class="attr class">
+ <a class="headerlink" href="#Client">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Client</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Client</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The Pulsar client. A single client instance can be used to create producers</span>
+<span class="sd"> and consumers on multiple topics.</span>
+
+<span class="sd"> The client will share the same connection pool and threads across all</span>
+<span class="sd"> producers and consumers.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+ <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+ <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new Pulsar client instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `authentication`:</span>
+<span class="sd"> Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd"> `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd"> * `operation_timeout_seconds`:</span>
+<span class="sd"> Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd"> unsubscribe).</span>
+<span class="sd"> * `io_threads`:</span>
+<span class="sd"> Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd"> * `message_listener_threads`:</span>
+<span class="sd"> Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd"> delivering messages through message listener. The default is 1 thread</span>
+<span class="sd"> per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd"> `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd"> single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd"> * `concurrent_lookup_requests`:</span>
+<span class="sd"> Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd"> to prevent overload on the broker.</span>
+<span class="sd"> * `log_conf_file_path`:</span>
+<span class="sd"> Initialize log4cxx from a configuration file.</span>
+<span class="sd"> * `use_tls`:</span>
+<span class="sd"> Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd"> is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd"> set to `pulsar+ssl://` or `https://`</span>
+<span class="sd"> * `tls_trust_certs_file_path`:</span>
+<span class="sd"> Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd"> certifi.</span>
+<span class="sd"> * `tls_allow_insecure_connection`:</span>
+<span class="sd"> Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd"> from the broker.</span>
+<span class="sd"> * `tls_validate_hostname`:</span>
+<span class="sd"> Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd"> endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd"> the endpoint.</span>
+<span class="sd"> * `logger`:</span>
+<span class="sd"> Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd"> * `connection_timeout_ms`:</span>
+<span class="sd"> Set timeout in milliseconds on TCP connections.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">'service_url'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">'authentication'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">'operation_timeout_seconds'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">'connection_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">'io_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">'message_listener_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">'concurrent_lookup_requests'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">'log_conf_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">'use_tls'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">'tls_trust_certs_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">'tls_allow_insecure_connection'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">'tls_validate_hostname'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">'logger'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'pulsar+ssl://'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'https://'</span><span class="p">):</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+ <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+ <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+ <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+ <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+ <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+ <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new producer on a given topic.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`:</span>
+<span class="sd"> The topic name</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `producer_name`:</span>
+<span class="sd"> Specify a name for the producer. If not assigned,</span>
+<span class="sd"> the system will generate a globally unique name which can be accessed</span>
+<span class="sd"> with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd"> the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd"> across all Pulsar's clusters.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be published by this producer.</span>
+<span class="sd"> The schema will be used for two purposes:</span>
+<span class="sd"> - Validate the data format against the topic defined schema</span>
+<span class="sd"> - Perform serialization/deserialization between data and objects</span>
+<span class="sd"> An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd"> * `initial_sequence_id`:</span>
+<span class="sd"> Set the baseline for the sequence ids for messages</span>
+<span class="sd"> published by the producer. First message will be using</span>
+<span class="sd"> `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd"> be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd"> * `send_timeout_millis`:</span>
+<span class="sd"> If a message is not acknowledged by the server before the</span>
+<span class="sd"> `send_timeout` expires, an error will be reported.</span>
+<span class="sd"> * `compression_type`:</span>
+<span class="sd"> Set the compression type for the producer. By default, message</span>
+<span class="sd"> payloads are not compressed. Supported compression types are</span>
+<span class="sd"> `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd"> ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd"> SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd"> * `max_pending_messages`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment from the broker.</span>
+<span class="sd"> * `max_pending_messages_across_partitions`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment across partitions from the broker.</span>
+<span class="sd"> * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd"> block when the outgoing message queue is full.</span>
+<span class="sd"> * `message_routing_mode`:</span>
+<span class="sd"> Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd"> other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd"> * `lazy_start_partitioned_producers`:</span>
+<span class="sd"> This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd"> producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd"> or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd"> started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd"> any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd"> message.</span>
+<span class="sd"> Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd"> partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd"> Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd"> for the first messages of a given partition.</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd"> can be used for identify a producer at broker side.</span>
+<span class="sd"> * `batching_type`:</span>
+<span class="sd"> Sets the batching type for the producer.</span>
+<span class="sd"> There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd"> - Default batching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd"> - KeyBasedBatching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd"> * encryption_key:</span>
+<span class="sd"> The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">'producer_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">'initial_sequence_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">'send_timeout_millis'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">'compression_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">'max_pending_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">'max_pending_messages_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">'block_if_queue_full'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">'batching_enabled'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">'batching_max_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">'batching_max_allowed_size_in_bytes'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">'batching_max_publish_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">'batching_type'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">'encryption_key'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">'lazy_start_partitioned_producers'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+ <span class="k">return</span> <span class="n">p</span>
+
+ <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+ <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+ <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd"> This method will accept these forms:</span>
+<span class="sd"> - `topic='my-topic'`</span>
+<span class="sd"> - `topic=['topic-1', 'topic-2', 'topic-3']`</span>
+<span class="sd"> - `topic=re.compile('persistent://public/default/topic-*')`</span>
+<span class="sd"> * `subscription`: The name of the subscription.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `consumer_type`:</span>
+<span class="sd"> Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this consumer.</span>
+<span class="sd"> * `message_listener`:</span>
+<span class="sd"> Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (consumer, message), for example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def my_listener(consumer, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> consumer.acknowledge(message)</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd"> before the application calls `receive()`. Using a higher value could</span>
+<span class="sd"> potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd"> memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd"> the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd"> This approach improves the message distribution on shared subscription</span>
+<span class="sd"> by pushing messages only to those consumers that are ready to process</span>
+<span class="sd"> them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd"> if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd"> should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd"> default value is 1000 messages and should work well for most use</span>
+<span class="sd"> cases.</span>
+<span class="sd"> * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd"> Set the max total receiver queue size across partitions.</span>
+<span class="sd"> This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd"> * `consumer_name`:</span>
+<span class="sd"> Sets the consumer name.</span>
+<span class="sd"> * `unacked_messages_timeout_ms`:</span>
+<span class="sd"> Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd"> timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd"> the given value is less than 10 seconds. If a successful</span>
+<span class="sd"> acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd"> messages are redelivered.</span>
+<span class="sd"> * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd"> The delay after which to redeliver the messages that failed to be</span>
+<span class="sd"> processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd"> * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd"> Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd"> be cached in the client.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd"> can be used for identify a consumer at broker side.</span>
+<span class="sd"> * `pattern_auto_discovery_period`:</span>
+<span class="sd"> Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd"> * `initial_position`:</span>
+<span class="sd"> Set the initial position of a consumer when subscribing to the topic.</span>
+<span class="sd"> It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd"> Default: `Latest`.</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> * replicate_subscription_state_enabled:</span>
+<span class="sd"> Set whether the subscription status should be replicated.</span>
+<span class="sd"> Default: `False`.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">'subscription_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">'consumer_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+ <span class="s1">'max_total_receiver_queue_size_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">'consumer_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">'unacked_messages_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">'broker_consumer_stats_cache_time_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">'negative_ack_redelivery_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">'pattern_auto_discovery_period'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">'initial_position'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1"># Single topic</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="c1"># List of topics</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+ <span class="c1"># Regex pattern</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument 'topic' is expected to be of a type between (str, list, re.pattern)"</span><span class="p">)</span>
+
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+
+ <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a reader on a particular topic</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic.</span>
+<span class="sd"> * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd"> The options are:</span>
+<span class="sd"> * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd"> * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd"> after the reader was created</span>
+<span class="sd"> * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd"> that specific position. The first message to be read will be the message next to the</span>
+<span class="sd"> specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd"> back into a `MessageId` object:</span>
+
+<span class="sd"> # Serialize to string</span>
+<span class="sd"> s = msg.message_id().serialize()</span>
+
+<span class="sd"> # Deserialize from string</span>
+<span class="sd"> msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this reader.</span>
+<span class="sd"> * `reader_listener`:</span>
+<span class="sd"> Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (reader, message), for example:</span>
+
+<span class="sd"> def my_listener(reader, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> pass</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the reader</span>
+<span class="sd"> before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd"> potentially increase the reader throughput at the expense of higher</span>
+<span class="sd"> memory utilization.</span>
+<span class="sd"> * `reader_name`:</span>
+<span class="sd"> Sets the reader name.</span>
+<span class="sd"> * `subscription_role_prefix`:</span>
+<span class="sd"> Sets the subscription role prefix.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">'start_message_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">'reader_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">'subscription_role_prefix'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+
+ <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the list of partitions for a given topic.</span>
+
+<span class="sd"> If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd"> partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd"> This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd"> instances directly on a particular partition.</span>
+<span class="sd"> :param topic: the topic name to lookup</span>
+<span class="sd"> :return: a list of partition name</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd"> Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd"> for ongoing operations to complete.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the client and all the associated producers and consumers</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>The Pulsar client. A single client instance can be used to create producers
+and consumers on multiple topics.</p>
+
+<p>The client will share the same connection pool and threads across all
+producers and consumers.</p>
+</div>
+
+
+ <div id="Client.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.__init__">#  </a>
+
+
+ <span class="name">Client</span><span class="signature">(
+ service_url,
+ authentication=None,
+ operation_timeout_seconds=30,
+ io_threads=1,
+ message_listener_threads=1,
+ concurrent_lookup_requests=50000,
+ log_conf_file_path=None,
+ use_tls=False,
+ tls_trust_certs_file_path=None,
+ tls_allow_insecure_connection=False,
+ tls_validate_hostname=False,
+ logger=None,
+ connection_timeout_ms=10000
+)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+ <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+ <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new Pulsar client instance.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `authentication`:</span>
+<span class="sd"> Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd"> `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd"> * `operation_timeout_seconds`:</span>
+<span class="sd"> Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd"> unsubscribe).</span>
+<span class="sd"> * `io_threads`:</span>
+<span class="sd"> Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd"> * `message_listener_threads`:</span>
+<span class="sd"> Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd"> delivering messages through message listener. The default is 1 thread</span>
+<span class="sd"> per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd"> `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd"> single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd"> * `concurrent_lookup_requests`:</span>
+<span class="sd"> Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd"> to prevent overload on the broker.</span>
+<span class="sd"> * `log_conf_file_path`:</span>
+<span class="sd"> Initialize log4cxx from a configuration file.</span>
+<span class="sd"> * `use_tls`:</span>
+<span class="sd"> Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd"> is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd"> set to `pulsar+ssl://` or `https://`</span>
+<span class="sd"> * `tls_trust_certs_file_path`:</span>
+<span class="sd"> Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd"> certifi.</span>
+<span class="sd"> * `tls_allow_insecure_connection`:</span>
+<span class="sd"> Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd"> from the broker.</span>
+<span class="sd"> * `tls_validate_hostname`:</span>
+<span class="sd"> Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd"> endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd"> the endpoint.</span>
+<span class="sd"> * `logger`:</span>
+<span class="sd"> Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd"> * `connection_timeout_ms`:</span>
+<span class="sd"> Set timeout in milliseconds on TCP connections.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">'service_url'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">'authentication'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">'operation_timeout_seconds'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">'connection_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">'io_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">'message_listener_threads'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">'concurrent_lookup_requests'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">'log_conf_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">'use_tls'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">'tls_trust_certs_file_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">'tls_allow_insecure_connection'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">'tls_validate_hostname'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">'logger'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'pulsar+ssl://'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'https://'</span><span class="p">):</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create a new Pulsar client instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>service_url</code>: The Pulsar service url eg: pulsar://my-broker.com:6650/</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>authentication</code>:
+Set the authentication provider to be used with the broker. For example:
+<code>AuthenticationTls</code>, AuthenticaionToken, <code><a href="#AuthenticationAthenz">AuthenticationAthenz</a></code>or <code><a href="#AuthenticationOauth2">AuthenticationOauth2</a></code></li>
+<li><code>operation_timeout_seconds</code>:
+Set timeout on client operations (subscribe, create producer, close,
+unsubscribe).</li>
+<li><code>io_threads</code>:
+Set the number of IO threads to be used by the Pulsar client.</li>
+<li><code>message_listener_threads</code>:
+Set the number of threads to be used by the Pulsar client when
+delivering messages through message listener. The default is 1 thread
+per Pulsar client. If using more than 1 thread, messages for distinct
+<code>message_listener</code>s will be delivered in different threads, however a
+single <code>MessageListener</code> will always be assigned to the same thread.</li>
+<li><code>concurrent_lookup_requests</code>:
+Number of concurrent lookup-requests allowed on each broker connection
+to prevent overload on the broker.</li>
+<li><code>log_conf_file_path</code>:
+Initialize log4cxx from a configuration file.</li>
+<li><code>use_tls</code>:
+Configure whether to use TLS encryption on the connection. This setting
+is deprecated. TLS will be automatically enabled if the <code>serviceUrl</code> is
+set to <code>pulsar+ssl://</code> or <code>https://</code></li>
+<li><code>tls_trust_certs_file_path</code>:
+Set the path to the trusted TLS certificate file. If empty defaults to
+certifi.</li>
+<li><code>tls_allow_insecure_connection</code>:
+Configure whether the Pulsar client accepts untrusted TLS certificates
+from the broker.</li>
+<li><code>tls_validate_hostname</code>:
+Configure whether the Pulsar client validates that the hostname of the
+endpoint, matches the common name on the TLS certificate presented by
+the endpoint.</li>
+<li><code>logger</code>:
+Set a Python logger for this Pulsar client. Should be an instance of <code>logging.Logger</code>.</li>
+<li><code>connection_timeout_ms</code>:
+Set timeout in milliseconds on TCP connections.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Client.create_producer" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.create_producer">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">create_producer</span><span class="signature">(
+ self,
+ topic,
+ producer_name=None,
+ schema=<<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object>,
+ initial_sequence_id=None,
+ send_timeout_millis=30000,
+ compression_type=_pulsar.CompressionType.NONE,
+ max_pending_messages=1000,
+ max_pending_messages_across_partitions=50000,
+ block_if_queue_full=False,
+ batching_enabled=False,
+ batching_max_messages=1000,
+ batching_max_allowed_size_in_bytes=131072,
+ batching_max_publish_delay_ms=10,
+ message_routing_mode=_pulsar.PartitionsRoutingMode.RoundRobinDistribution,
+ lazy_start_partitioned_producers=False,
+ properties=None,
+ batching_type=_pulsar.BatchingType.Default,
+ encryption_key=None,
+ crypto_key_reader=None
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+ <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+ <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+ <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+ <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+ <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+ <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a new producer on a given topic.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`:</span>
+<span class="sd"> The topic name</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `producer_name`:</span>
+<span class="sd"> Specify a name for the producer. If not assigned,</span>
+<span class="sd"> the system will generate a globally unique name which can be accessed</span>
+<span class="sd"> with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd"> the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd"> across all Pulsar's clusters.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be published by this producer.</span>
+<span class="sd"> The schema will be used for two purposes:</span>
+<span class="sd"> - Validate the data format against the topic defined schema</span>
+<span class="sd"> - Perform serialization/deserialization between data and objects</span>
+<span class="sd"> An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd"> * `initial_sequence_id`:</span>
+<span class="sd"> Set the baseline for the sequence ids for messages</span>
+<span class="sd"> published by the producer. First message will be using</span>
+<span class="sd"> `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd"> be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd"> * `send_timeout_millis`:</span>
+<span class="sd"> If a message is not acknowledged by the server before the</span>
+<span class="sd"> `send_timeout` expires, an error will be reported.</span>
+<span class="sd"> * `compression_type`:</span>
+<span class="sd"> Set the compression type for the producer. By default, message</span>
+<span class="sd"> payloads are not compressed. Supported compression types are</span>
+<span class="sd"> `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd"> ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd"> SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd"> release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd"> * `max_pending_messages`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment from the broker.</span>
+<span class="sd"> * `max_pending_messages_across_partitions`:</span>
+<span class="sd"> Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd"> an acknowledgment across partitions from the broker.</span>
+<span class="sd"> * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd"> block when the outgoing message queue is full.</span>
+<span class="sd"> * `message_routing_mode`:</span>
+<span class="sd"> Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd"> other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd"> * `lazy_start_partitioned_producers`:</span>
+<span class="sd"> This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd"> producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd"> or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd"> started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd"> any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd"> message.</span>
+<span class="sd"> Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd"> partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd"> Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd"> for the first messages of a given partition.</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd"> can be used for identify a producer at broker side.</span>
+<span class="sd"> * `batching_type`:</span>
+<span class="sd"> Sets the batching type for the producer.</span>
+<span class="sd"> There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd"> - Default batching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd"> - KeyBasedBatching</span>
+<span class="sd"> incoming single messages:</span>
+<span class="sd"> (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd"> batched into single batch message:</span>
+<span class="sd"> [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd"> * encryption_key:</span>
+<span class="sd"> The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">'producer_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">'initial_sequence_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">'send_timeout_millis'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">'compression_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">'max_pending_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">'max_pending_messages_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">'block_if_queue_full'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">'batching_enabled'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">'batching_max_messages'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">'batching_max_allowed_size_in_bytes'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">'batching_max_publish_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">'batching_type'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">'encryption_key'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">'lazy_start_partitioned_producers'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+ <span class="k">return</span> <span class="n">p</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create a new producer on a given topic.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>:
+The topic name</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>producer_name</code>:
+Specify a name for the producer. If not assigned,
+the system will generate a globally unique name which can be accessed
+with <code><a href="#Producer.producer_name">Producer.producer_name()</a></code>. When specifying a name, it is app to
+the user to ensure that, for a given topic, the producer name is unique
+across all Pulsar's clusters.</li>
+<li><code>schema</code>:
+Define the schema of the data that will be published by this producer.
+The schema will be used for two purposes:
+<ul>
+<li>Validate the data format against the topic defined schema</li>
+<li>Perform serialization/deserialization between data and objects
+An example for this parameter would be to pass <code>schema=JsonSchema(MyRecordClass)</code>.</li>
+</ul></li>
+<li><code>initial_sequence_id</code>:
+Set the baseline for the sequence ids for messages
+published by the producer. First message will be using
+`(initialSequenceId + 1)`` as its sequence id and subsequent messages will
+be assigned incremental sequence ids, if not otherwise specified.</li>
+<li><code>send_timeout_millis</code>:
+If a message is not acknowledged by the server before the
+<code>send_timeout</code> expires, an error will be reported.</li>
+<li><code>compression_type</code>:
+Set the compression type for the producer. By default, message
+payloads are not compressed. Supported compression types are
+<code>CompressionType.LZ4</code>, <code>CompressionType.ZLib</code>, <code>CompressionType.ZSTD</code> and <code>CompressionType.SNAPPY</code>.
+ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that
+release in order to be able to receive messages compressed with ZSTD.
+SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that
+release in order to be able to receive messages compressed with SNAPPY.</li>
+<li><code>max_pending_messages</code>:
+Set the max size of the queue holding the messages pending to receive
+an acknowledgment from the broker.</li>
+<li><code>max_pending_messages_across_partitions</code>:
+Set the max size of the queue holding the messages pending to receive
+an acknowledgment across partitions from the broker.</li>
+<li><code>block_if_queue_full</code>: Set whether <code>send_async</code> operations should
+block when the outgoing message queue is full.</li>
+<li><code>message_routing_mode</code>:
+Set the message routing mode for the partitioned producer. Default is <code>PartitionsRoutingMode.RoundRobinDistribution</code>,
+other option is <code>PartitionsRoutingMode.UseSinglePartition</code></li>
+<li><code>lazy_start_partitioned_producers</code>:
+This config affects producers of partitioned topics only. It controls whether
+producers register and connect immediately to the owner broker of each partition
+or start lazily on demand. The internal producer of one partition is always
+started eagerly, chosen by the routing policy, but the internal producers of
+any additional partitions are started on demand, upon receiving their first
+message.
+Using this mode can reduce the strain on brokers for topics with large numbers of
+partitions and when the SinglePartition routing policy is used without keyed messages.
+Because producer connection can be on demand, this can produce extra send latency
+for the first messages of a given partition.</li>
+<li><code>properties</code>:
+Sets the properties for the producer. The properties associated with a producer
+can be used for identify a producer at broker side.</li>
+<li><p><code>batching_type</code>:
+Sets the batching type for the producer.
+There are two batching type: DefaultBatching and KeyBasedBatching.</p>
+
+<ul>
+<li><p>Default batching
+incoming single messages:
+(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)
+batched into single batch message:
+[(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</p></li>
+<li><p>KeyBasedBatching
+incoming single messages:
+(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)
+batched into single batch message:
+[(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</p></li>
+</ul></li>
+<li>encryption_key:
+The key used for symmetric encryption, configured on the producer side</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Client.subscribe" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.subscribe">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">subscribe</span><span class="signature">(
+ self,
+ topic,
+ subscription_name,
+ consumer_type=_pulsar.ConsumerType.Exclusive,
+ schema=<<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object>,
+ message_listener=None,
+ receiver_queue_size=1000,
+ max_total_receiver_queue_size_across_partitions=50000,
+ consumer_name=None,
+ unacked_messages_timeout_ms=None,
+ broker_consumer_stats_cache_time_ms=30000,
+ negative_ack_redelivery_delay_ms=60000,
+ is_read_compacted=False,
+ properties=None,
+ pattern_auto_discovery_period=60,
+ initial_position=_pulsar.InitialPosition.Latest,
+ crypto_key_reader=None,
+ replicate_subscription_state_enabled=False
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+ <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+ <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+ <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+ <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd"> This method will accept these forms:</span>
+<span class="sd"> - `topic='my-topic'`</span>
+<span class="sd"> - `topic=['topic-1', 'topic-2', 'topic-3']`</span>
+<span class="sd"> - `topic=re.compile('persistent://public/default/topic-*')`</span>
+<span class="sd"> * `subscription`: The name of the subscription.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `consumer_type`:</span>
+<span class="sd"> Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this consumer.</span>
+<span class="sd"> * `message_listener`:</span>
+<span class="sd"> Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (consumer, message), for example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def my_listener(consumer, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> consumer.acknowledge(message)</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd"> before the application calls `receive()`. Using a higher value could</span>
+<span class="sd"> potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd"> memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd"> the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd"> This approach improves the message distribution on shared subscription</span>
+<span class="sd"> by pushing messages only to those consumers that are ready to process</span>
+<span class="sd"> them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd"> if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd"> should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd"> default value is 1000 messages and should work well for most use</span>
+<span class="sd"> cases.</span>
+<span class="sd"> * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd"> Set the max total receiver queue size across partitions.</span>
+<span class="sd"> This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd"> * `consumer_name`:</span>
+<span class="sd"> Sets the consumer name.</span>
+<span class="sd"> * `unacked_messages_timeout_ms`:</span>
+<span class="sd"> Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd"> timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd"> the given value is less than 10 seconds. If a successful</span>
+<span class="sd"> acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd"> messages are redelivered.</span>
+<span class="sd"> * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd"> The delay after which to redeliver the messages that failed to be</span>
+<span class="sd"> processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd"> * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd"> Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd"> be cached in the client.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * `properties`:</span>
+<span class="sd"> Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd"> can be used for identify a consumer at broker side.</span>
+<span class="sd"> * `pattern_auto_discovery_period`:</span>
+<span class="sd"> Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd"> * `initial_position`:</span>
+<span class="sd"> Set the initial position of a consumer when subscribing to the topic.</span>
+<span class="sd"> It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd"> Default: `Latest`.</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> * replicate_subscription_state_enabled:</span>
+<span class="sd"> Set whether the subscription status should be replicated.</span>
+<span class="sd"> Default: `False`.</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">'subscription_name'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">'consumer_type'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+ <span class="s1">'max_total_receiver_queue_size_across_partitions'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">'consumer_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">'unacked_messages_timeout_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">'broker_consumer_stats_cache_time_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">'negative_ack_redelivery_delay_ms'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">'pattern_auto_discovery_period'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">'initial_position'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="c1"># Single topic</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="c1"># List of topics</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+ <span class="c1"># Regex pattern</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Argument 'topic' is expected to be of a type between (str, list, re.pattern)"</span><span class="p">)</span>
+
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Subscribe to the given topic and subscription combination.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>: The name of the topic, list of topics or regex pattern.
+ This method will accept these forms:
+ - <code>topic='my-topic'</code>
+ - <code>topic=['topic-1', 'topic-2', 'topic-3']</code>
+ - <code>topic=re.compile('persistent://public/default/topic-*')</code></li>
+<li><code>subscription</code>: The name of the subscription.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>consumer_type</code>:
+Select the subscription type to be used when subscribing to the topic.</li>
+<li><code>schema</code>:
+Define the schema of the data that will be received by this consumer.</li>
+<li><p><code>message_listener</code>:
+Sets a message listener for the consumer. When the listener is set,
+the application will receive messages through it. Calls to
+<code>consumer.receive()</code> will not be allowed. The listener function needs
+to accept (consumer, message), for example:</p>
+
+<pre><code>#!python
+def my_listener(consumer, message):
+ # process message
+ consumer.acknowledge(message)
+</code></pre></li>
+<li><p><code>receiver_queue_size</code>:
+Sets the size of the consumer receive queue. The consumer receive
+queue controls how many messages can be accumulated by the consumer
+before the application calls <code>receive()</code>. Using a higher value could
+potentially increase the consumer throughput at the expense of higher
+memory utilization. Setting the consumer queue size to zero decreases
+the throughput of the consumer by disabling pre-fetching of messages.
+This approach improves the message distribution on shared subscription
+by pushing messages only to those consumers that are ready to process
+them. Neither receive with timeout nor partitioned topics can be used
+if the consumer queue size is zero. The <code>receive()</code> function call
+should not be interrupted when the consumer queue size is zero. The
+default value is 1000 messages and should work well for most use
+cases.</p></li>
+<li><code>max_total_receiver_queue_size_across_partitions</code>
+Set the max total receiver queue size across partitions.
+This setting will be used to reduce the receiver queue size for individual partitions</li>
+<li><code>consumer_name</code>:
+Sets the consumer name.</li>
+<li><code>unacked_messages_timeout_ms</code>:
+Sets the timeout in milliseconds for unacknowledged messages. The
+timeout needs to be greater than 10 seconds. An exception is thrown if
+the given value is less than 10 seconds. If a successful
+acknowledgement is not sent within the timeout, all the unacknowledged
+messages are redelivered.</li>
+<li><code>negative_ack_redelivery_delay_ms</code>:
+The delay after which to redeliver the messages that failed to be
+processed (with the <code>consumer.negative_acknowledge()</code>)</li>
+<li><code>broker_consumer_stats_cache_time_ms</code>:
+Sets the time duration for which the broker-side consumer stats will
+be cached in the client.</li>
+<li><code>is_read_compacted</code>:
+Selects whether to read the compacted version of the topic</li>
+<li><code>properties</code>:
+Sets the properties for the consumer. The properties associated with a consumer
+can be used for identify a consumer at broker side.</li>
+<li><code>pattern_auto_discovery_period</code>:
+Periods of seconds for consumer to auto discover match topics.</li>
+<li><code>initial_position</code>:
+Set the initial position of a consumer when subscribing to the topic.
+It could be either: <code>InitialPosition.Earliest</code> or <code>InitialPosition.Latest</code>.
+Default: <code>Latest</code>.</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+<li>replicate_subscription_state_enabled:
+Set whether the subscription status should be replicated.
+Default: <code>False</code>.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Client.create_reader" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.create_reader">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">create_reader</span><span class="signature">(
+ self,
+ topic,
+ start_message_id,
+ schema=<<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object>,
+ reader_listener=None,
+ receiver_queue_size=1000,
+ reader_name=None,
+ subscription_role_prefix=None,
+ is_read_compacted=False,
+ crypto_key_reader=None
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+ <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+ <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+ <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create a reader on a particular topic</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `topic`: The name of the topic.</span>
+<span class="sd"> * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd"> The options are:</span>
+<span class="sd"> * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd"> * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd"> after the reader was created</span>
+<span class="sd"> * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd"> that specific position. The first message to be read will be the message next to the</span>
+<span class="sd"> specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd"> back into a `MessageId` object:</span>
+
+<span class="sd"> # Serialize to string</span>
+<span class="sd"> s = msg.message_id().serialize()</span>
+
+<span class="sd"> # Deserialize from string</span>
+<span class="sd"> msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `schema`:</span>
+<span class="sd"> Define the schema of the data that will be received by this reader.</span>
+<span class="sd"> * `reader_listener`:</span>
+<span class="sd"> Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd"> the application will receive messages through it. Calls to</span>
+<span class="sd"> `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd"> to accept (reader, message), for example:</span>
+
+<span class="sd"> def my_listener(reader, message):</span>
+<span class="sd"> # process message</span>
+<span class="sd"> pass</span>
+
+<span class="sd"> * `receiver_queue_size`:</span>
+<span class="sd"> Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd"> queue controls how many messages can be accumulated by the reader</span>
+<span class="sd"> before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd"> potentially increase the reader throughput at the expense of higher</span>
+<span class="sd"> memory utilization.</span>
+<span class="sd"> * `reader_name`:</span>
+<span class="sd"> Sets the reader name.</span>
+<span class="sd"> * `subscription_role_prefix`:</span>
+<span class="sd"> Sets the subscription role prefix.</span>
+<span class="sd"> * `is_read_compacted`:</span>
+<span class="sd"> Selects whether to read the compacted version of the topic</span>
+<span class="sd"> * crypto_key_reader:</span>
+<span class="sd"> Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd"> and private key decryption messages for the consumer</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">'start_message_id'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">'schema'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">'receiver_queue_size'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">'reader_name'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">'subscription_role_prefix'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">'is_read_compacted'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">'crypto_key_reader'</span><span class="p">)</span>
+
+ <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+ <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+ <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">c</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create a reader on a particular topic</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>: The name of the topic.</li>
+<li><p><code>start_message_id</code>: The initial reader positioning is done by specifying a message id.
+The options are:</p>
+
+<ul>
+<li><code><a href="#MessageId.earliest">MessageId.earliest</a></code>: Start reading from the earliest message available in the topic</li>
+<li><code><a href="#MessageId.latest">MessageId.latest</a></code>: Start reading from the end topic, only getting messages published
+after the reader was created</li>
+<li><p><code><a href="#MessageId">MessageId</a></code>: When passing a particular message id, the reader will position itself on
+that specific position. The first message to be read will be the message next to the
+specified messageId. Message id can be serialized into a string and deserialized
+back into a <code><a href="#MessageId">MessageId</a></code> object:</p>
+
+<p># Serialize to string
+ s = msg.message_id().serialize()</p>
+
+<p># Deserialize from string
+ msg_id = <a href="#MessageId.deserialize">MessageId.deserialize</a>(s)</p></li>
+</ul></li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>schema</code>:
+Define the schema of the data that will be received by this reader.</li>
+<li><p><code>reader_listener</code>:
+Sets a message listener for the reader. When the listener is set,
+the application will receive messages through it. Calls to
+<code>reader.read_next()</code> will not be allowed. The listener function needs
+to accept (reader, message), for example:</p>
+
+<pre><code>def my_listener(reader, message):
+ # process message
+ pass
+</code></pre></li>
+<li><p><code>receiver_queue_size</code>:
+Sets the size of the reader receive queue. The reader receive
+queue controls how many messages can be accumulated by the reader
+before the application calls <code>read_next()</code>. Using a higher value could
+potentially increase the reader throughput at the expense of higher
+memory utilization.</p></li>
+<li><code>reader_name</code>:
+Sets the reader name.</li>
+<li><code>subscription_role_prefix</code>:
+Sets the subscription role prefix.</li>
+<li><code>is_read_compacted</code>:
+Selects whether to read the compacted version of the topic</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Client.get_topic_partitions" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.get_topic_partitions">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">get_topic_partitions</span><span class="signature">(self, topic)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the list of partitions for a given topic.</span>
+
+<span class="sd"> If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd"> partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd"> This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd"> instances directly on a particular partition.</span>
+<span class="sd"> :param topic: the topic name to lookup</span>
+<span class="sd"> :return: a list of partition name</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">'topic'</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the list of partitions for a given topic.</p>
+
+<p>If the topic is partitioned, this will return a list of partition names. If the topic is not
+partitioned, the returned list will contain the topic name itself.</p>
+
+<p>This can be used to discover the partitions and create Reader, Consumer or Producer
+instances directly on a particular partition.</p>
+
+<h6 id="parameters">Parameters</h6>
+
+<ul>
+<li><strong>topic</strong>: the topic name to lookup</li>
+</ul>
+
+<h6 id="returns">Returns</h6>
+
+<blockquote>
+ <p>a list of partition name</p>
+</blockquote>
+</div>
+
+
+ </div>
+ <div id="Client.shutdown" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.shutdown">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">shutdown</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd"> Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd"> for ongoing operations to complete.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Perform immediate shutdown of Pulsar client.</p>
+
+<p>Release all resources and close all producer, consumer, and readers without waiting
+for ongoing operations to complete.</p>
+</div>
+
+
+ </div>
+ <div id="Client.close" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Client.close">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">close</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the client and all the associated producers and consumers</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Close the client and all the associated producers and consumers</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="Producer">
+ <div class="attr class">
+ <a class="headerlink" href="#Producer">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Producer</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Producer</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> The Pulsar message producer, used to publish messages on a topic.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic which producer is publishing to</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the producer name which could have been assigned by the</span>
+<span class="sd"> system or specified by the client</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the last sequence id that was published by this producer.</span>
+
+<span class="sd"> This represent either the automatically assigned or custom sequence id</span>
+<span class="sd"> (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd"> After recreating a producer with the same producer name, this will return the</span>
+<span class="sd"> last message that was published in the previous producer session, or -1 if</span>
+<span class="sd"> there no message was ever published.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd"> Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd"> to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`:</span>
+<span class="sd"> Override namespace replication clusters. Note that it is the caller's</span>
+<span class="sd"> responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd"> have been previously configured as topics. Given an empty list,</span>
+<span class="sd"> the message will replicate according to the namespace configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Send a message asynchronously.</span>
+
+<span class="sd"> The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd"> by the broker.</span>
+
+<span class="sd"> Example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def callback(res, msg_id):</span>
+<span class="sd"> print('Message published: %s' % res)</span>
+
+<span class="sd"> producer.send_async(msg, callback)</span>
+
+<span class="sd"> When the producer queue is full, by default the message will be rejected</span>
+<span class="sd"> and the callback invoked with an error code.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application0-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd"> used to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd"> that it is the caller's responsibility to provide valid cluster names</span>
+<span class="sd"> and that all clusters have been previously configured as topics.</span>
+<span class="sd"> Given an empty list, the message will replicate per the namespace</span>
+<span class="sd"> configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+
+ <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd"> successfully persisted</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the producer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_build_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">'properties'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="s1">'partition_key'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span> <span class="s1">'sequence_id'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">replication_clusters</span><span class="p">,</span> <span class="s1">'replication_clusters'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="s1">'disable_replication'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span> <span class="s1">'event_timestamp'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">deliver_at</span><span class="p">,</span> <span class="s1">'deliver_at'</span><span class="p">)</span>
+ <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">timedelta</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">,</span> <span class="s1">'deliver_after'</span><span class="p">)</span>
+
+ <span class="n">mb</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBuilder</span><span class="p">()</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">content</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">partition_key</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">partition_key</span><span class="p">(</span><span class="n">partition_key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">sequence_id</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">sequence_id</span><span class="p">(</span><span class="n">sequence_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">replication_clusters</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">replication_clusters</span><span class="p">(</span><span class="n">replication_clusters</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">disable_replication</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">disable_replication</span><span class="p">(</span><span class="n">disable_replication</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">event_timestamp</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">(</span><span class="n">event_timestamp</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">deliver_at</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">deliver_at</span><span class="p">(</span><span class="n">deliver_at</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">deliver_after</span><span class="p">:</span>
+ <span class="n">mb</span><span class="o">.</span><span class="n">deliver_after</span><span class="p">(</span><span class="n">deliver_after</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">mb</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the producer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>The Pulsar message producer, used to publish messages on a topic.</p>
+</div>
+
+
+ <div id="Producer.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.__init__">#  </a>
+
+
+ <span class="name">Producer</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Producer.topic" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.topic">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">topic</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic which producer is publishing to</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the topic which producer is publishing to</p>
+</div>
+
+
+ </div>
+ <div id="Producer.producer_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.producer_name">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">producer_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the producer name which could have been assigned by the</span>
+<span class="sd"> system or specified by the client</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the producer name which could have been assigned by the
+system or specified by the client</p>
+</div>
+
+
+ </div>
+ <div id="Producer.last_sequence_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.last_sequence_id">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">last_sequence_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Get the last sequence id that was published by this producer.</span>
+
+<span class="sd"> This represent either the automatically assigned or custom sequence id</span>
+<span class="sd"> (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd"> After recreating a producer with the same producer name, this will return the</span>
+<span class="sd"> last message that was published in the previous producer session, or -1 if</span>
+<span class="sd"> there no message was ever published.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Get the last sequence id that was published by this producer.</p>
+
+<p>This represent either the automatically assigned or custom sequence id
+(set on the <code>MessageBuilder</code>) that was published and acknowledged by the broker.</p>
+
+<p>After recreating a producer with the same producer name, this will return the
+last message that was published in the previous producer session, or -1 if
+there no message was ever published.</p>
+</div>
+
+
+ </div>
+ <div id="Producer.send" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.send">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">send</span><span class="signature">(
+ self,
+ content,
+ properties=None,
+ partition_key=None,
+ sequence_id=None,
+ replication_clusters=None,
+ disable_replication=False,
+ event_timestamp=None,
+ deliver_at=None,
+ deliver_after=None
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd"> Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd"> to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`:</span>
+<span class="sd"> Override namespace replication clusters. Note that it is the caller's</span>
+<span class="sd"> responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd"> have been previously configured as topics. Given an empty list,</span>
+<span class="sd"> the message will replicate according to the namespace configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Publish a message on the topic. Blocks until the message is acknowledged</p>
+
+<p>Returns a <code><a href="#MessageId">MessageId</a></code> object that represents where the message is persisted.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>content</code>:
+A <code>bytes</code> object with the message payload.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>properties</code>:
+A dict of application-defined string properties.</li>
+<li><code>partition_key</code>:
+Sets the partition key for message routing. A hash of this key is used
+to determine the message's topic partition.</li>
+<li><code>sequence_id</code>:
+Specify a custom sequence id for the message being published.</li>
+<li><code>replication_clusters</code>:
+Override namespace replication clusters. Note that it is the caller's
+responsibility to provide valid cluster names and that all clusters
+have been previously configured as topics. Given an empty list,
+the message will replicate according to the namespace configuration.</li>
+<li><code>disable_replication</code>:
+Do not replicate this message.</li>
+<li><code>event_timestamp</code>:
+Timestamp in millis of the timestamp of event creation</li>
+<li><code>deliver_at</code>:
+Specify the this message should not be delivered earlier than the
+specified timestamp.
+The timestamp is milliseconds and based on UTC</li>
+<li><code>deliver_after</code>:
+Specify a delay in timedelta for the delivery of the messages.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Producer.send_async" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.send_async">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">send_async</span><span class="signature">(
+ self,
+ content,
+ callback,
+ properties=None,
+ partition_key=None,
+ sequence_id=None,
+ replication_clusters=None,
+ disable_replication=False,
+ event_timestamp=None,
+ deliver_at=None,
+ deliver_after=None
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+ <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Send a message asynchronously.</span>
+
+<span class="sd"> The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd"> by the broker.</span>
+
+<span class="sd"> Example:</span>
+
+<span class="sd"> #!python</span>
+<span class="sd"> def callback(res, msg_id):</span>
+<span class="sd"> print('Message published: %s' % res)</span>
+
+<span class="sd"> producer.send_async(msg, callback)</span>
+
+<span class="sd"> When the producer queue is full, by default the message will be rejected</span>
+<span class="sd"> and the callback invoked with an error code.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `content`:</span>
+<span class="sd"> A `bytes` object with the message payload.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `properties`:</span>
+<span class="sd"> A dict of application0-defined string properties.</span>
+<span class="sd"> * `partition_key`:</span>
+<span class="sd"> Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd"> used to determine the message's topic partition.</span>
+<span class="sd"> * `sequence_id`:</span>
+<span class="sd"> Specify a custom sequence id for the message being published.</span>
+<span class="sd"> * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd"> that it is the caller's responsibility to provide valid cluster names</span>
+<span class="sd"> and that all clusters have been previously configured as topics.</span>
+<span class="sd"> Given an empty list, the message will replicate per the namespace</span>
+<span class="sd"> configuration.</span>
+<span class="sd"> * `disable_replication`:</span>
+<span class="sd"> Do not replicate this message.</span>
+<span class="sd"> * `event_timestamp`:</span>
+<span class="sd"> Timestamp in millis of the timestamp of event creation</span>
+<span class="sd"> * `deliver_at`:</span>
+<span class="sd"> Specify the this message should not be delivered earlier than the</span>
+<span class="sd"> specified timestamp.</span>
+<span class="sd"> The timestamp is milliseconds and based on UTC</span>
+<span class="sd"> * `deliver_after`:</span>
+<span class="sd"> Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd"> """</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+ <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+ <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Send a message asynchronously.</p>
+
+<p>The <code>callback</code> will be invoked once the message has been acknowledged
+by the broker.</p>
+
+<p>Example:</p>
+
+<pre><code>#!python
+def callback(res, msg_id):
+ print('Message published: %s' % res)
+
+producer.send_async(msg, callback)
+</code></pre>
+
+<p>When the producer queue is full, by default the message will be rejected
+and the callback invoked with an error code.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>content</code>:
+A <code>bytes</code> object with the message payload.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>properties</code>:
+A dict of application0-defined string properties.</li>
+<li><code>partition_key</code>:
+Sets the partition key for the message routing. A hash of this key is
+used to determine the message's topic partition.</li>
+<li><code>sequence_id</code>:
+Specify a custom sequence id for the message being published.</li>
+<li><code>replication_clusters</code>: Override namespace replication clusters. Note
+that it is the caller's responsibility to provide valid cluster names
+and that all clusters have been previously configured as topics.
+Given an empty list, the message will replicate per the namespace
+configuration.</li>
+<li><code>disable_replication</code>:
+Do not replicate this message.</li>
+<li><code>event_timestamp</code>:
+Timestamp in millis of the timestamp of event creation</li>
+<li><code>deliver_at</code>:
+Specify the this message should not be delivered earlier than the
+specified timestamp.
+The timestamp is milliseconds and based on UTC</li>
+<li><code>deliver_after</code>:
+Specify a delay in timedelta for the delivery of the messages.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Producer.flush" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.flush">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">flush</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd"> successfully persisted</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Flush all the messages buffered in the client and wait until all messages have been
+successfully persisted</p>
+</div>
+
+
+ </div>
+ <div id="Producer.close" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.close">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">close</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the producer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Close the producer.</p>
+</div>
+
+
+ </div>
+ <div id="Producer.is_connected" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Producer.is_connected">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">is_connected</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the producer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Check if the producer is connected or not.</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="Consumer">
+ <div class="attr class">
+ <a class="headerlink" href="#Consumer">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Consumer</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Consumer</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pulsar consumer.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this consumer is subscribed to.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the subscription name.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd"> This method will block until the operation is completed. Once the</span>
+<span class="sd"> consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd"> subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd"> This consumer object cannot be reused.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Receive a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+
+ <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of a single message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd"> including) the provided message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the failure to process a single message.</span>
+
+<span class="sd"> When a message is "negatively acked" it will be marked for redelivery after</span>
+<span class="sd"> some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd"> with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd"> This call is not blocking.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pause receiving messages via the `message_listener` until</span>
+<span class="sd"> `resume_message_listener()` is called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Resume receiving the messages via the message listener.</span>
+<span class="sd"> Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd"> `pause_message_listener()` was called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd"> request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd"> shared mode, the consumer's messages to be redelivered are distributed</span>
+<span class="sd"> across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd"> doesn't throw an exception. In case the connection breaks, the messages</span>
+<span class="sd"> are redelivered after reconnect.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the consumer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the consumer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Pulsar consumer.</p>
+</div>
+
+
+ <div id="Consumer.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.__init__">#  </a>
+
+
+ <span class="name">Consumer</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Consumer.topic" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.topic">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">topic</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this consumer is subscribed to.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the topic this consumer is subscribed to.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.subscription_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.subscription_name">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">subscription_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the subscription name.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the subscription name.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.unsubscribe" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.unsubscribe">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">unsubscribe</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd"> This method will block until the operation is completed. Once the</span>
+<span class="sd"> consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd"> subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd"> This consumer object cannot be reused.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Unsubscribe the current consumer from the topic.</p>
+
+<p>This method will block until the operation is completed. Once the
+consumer is unsubscribed, no more messages will be received and
+subsequent new messages will not be retained for this consumer.</p>
+
+<p>This consumer object cannot be reused.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.receive" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.receive">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">receive</span><span class="signature">(self, timeout_millis=None)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Receive a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Receive a single message.</p>
+
+<p>If a message is not immediately available, this method will block until
+a new message is available.</p>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>timeout_millis</code>:
+If specified, the receive will raise an exception if a message is not
+available within the timeout.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Consumer.acknowledge" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.acknowledge">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">acknowledge</span><span class="signature">(self, message)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of a single message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Acknowledge the reception of a single message.</p>
+
+<p>This method will block until an acknowledgement is sent to the broker.
+After that, the message will not be re-delivered to this consumer.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Consumer.acknowledge_cumulative" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.acknowledge_cumulative">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">acknowledge_cumulative</span><span class="signature">(self, message)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd"> including) the provided message.</span>
+
+<span class="sd"> This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd"> After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Acknowledge the reception of all the messages in the stream up to (and
+including) the provided message.</p>
+
+<p>This method will block until an acknowledgement is sent to the broker.
+After that, the messages will not be re-delivered to this consumer.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Consumer.negative_acknowledge" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.negative_acknowledge">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">negative_acknowledge</span><span class="signature">(self, message)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Acknowledge the failure to process a single message.</span>
+
+<span class="sd"> When a message is "negatively acked" it will be marked for redelivery after</span>
+<span class="sd"> some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd"> with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd"> This call is not blocking.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The received message or message id.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Acknowledge the failure to process a single message.</p>
+
+<p>When a message is "negatively acked" it will be marked for redelivery after
+some fixed delay. The delay is configurable when constructing the consumer
+with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</p>
+
+<p>This call is not blocking.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Consumer.pause_message_listener" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.pause_message_listener">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">pause_message_listener</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pause receiving messages via the `message_listener` until</span>
+<span class="sd"> `resume_message_listener()` is called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Pause receiving messages via the <code>message_listener</code> until
+<code><a href="#Consumer.resume_message_listener">resume_message_listener()</a></code> is called.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.resume_message_listener" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.resume_message_listener">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">resume_message_listener</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Resume receiving the messages via the message listener.</span>
+<span class="sd"> Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd"> `pause_message_listener()` was called.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Resume receiving the messages via the message listener.
+Asynchronously receive all the messages enqueued from the time
+<code><a href="#Consumer.pause_message_listener">pause_message_listener()</a></code> was called.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.redeliver_unacknowledged_messages" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.redeliver_unacknowledged_messages">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">redeliver_unacknowledged_messages</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd"> request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd"> shared mode, the consumer's messages to be redelivered are distributed</span>
+<span class="sd"> across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd"> doesn't throw an exception. In case the connection breaks, the messages</span>
+<span class="sd"> are redelivered after reconnect.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Redelivers all the unacknowledged messages. In failover mode, the
+request is ignored if the consumer is not active for the given topic. In
+shared mode, the consumer's messages to be redelivered are distributed
+across all the connected consumers. This is a non-blocking call and
+doesn't throw an exception. In case the connection breaks, the messages
+are redelivered after reconnect.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.seek" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.seek">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">seek</span><span class="signature">(self, messageid)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Reset the subscription associated with this consumer to a specific message id or publish timestamp.
+The message id can either be a specific message or represent the first or last messages in the topic.
+Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the
+seek() on the individual partitions.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The message id for seek, OR an integer event time to seek to</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Consumer.close" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.close">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">close</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the consumer.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Close the consumer.</p>
+</div>
+
+
+ </div>
+ <div id="Consumer.is_connected" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Consumer.is_connected">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">is_connected</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the consumer is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Check if the consumer is connected or not.</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="Reader">
+ <div class="attr class">
+ <a class="headerlink" href="#Reader">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Reader</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Reader</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Pulsar topic reader.</span>
+<span class="sd"> """</span>
+
+ <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this reader is reading from.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Read a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+
+ <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if there is any message available to read from the current position.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+
+ <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the reader.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the reader is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Pulsar topic reader.</p>
+</div>
+
+
+ <div id="Reader.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.__init__">#  </a>
+
+
+ <span class="name">Reader</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Reader.topic" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.topic">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">topic</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Return the topic this reader is reading from.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the topic this reader is reading from.</p>
+</div>
+
+
+ </div>
+ <div id="Reader.read_next" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.read_next">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">read_next</span><span class="signature">(self, timeout_millis=None)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Read a single message.</span>
+
+<span class="sd"> If a message is not immediately available, this method will block until</span>
+<span class="sd"> a new message is available.</span>
+
+<span class="sd"> **Options**</span>
+
+<span class="sd"> * `timeout_millis`:</span>
+<span class="sd"> If specified, the receive will raise an exception if a message is not</span>
+<span class="sd"> available within the timeout.</span>
+<span class="sd"> """</span>
+ <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">'timeout_millis'</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+ <span class="k">return</span> <span class="n">m</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Read a single message.</p>
+
+<p>If a message is not immediately available, this method will block until
+a new message is available.</p>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>timeout_millis</code>:
+If specified, the receive will raise an exception if a message is not
+available within the timeout.</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Reader.has_message_available" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.has_message_available">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">has_message_available</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if there is any message available to read from the current position.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Check if there is any message available to read from the current position.</p>
+</div>
+
+
+ </div>
+ <div id="Reader.seek" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.seek">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">seek</span><span class="signature">(self, messageid)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd"> The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd"> Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd"> seek() on the individual partitions.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `message`:</span>
+<span class="sd"> The message id for seek, OR an integer event time to seek to</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Reset this reader to a specific message id or publish timestamp.
+The message id can either be a specific message or represent the first or last messages in the topic.
+Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the
+seek() on the individual partitions.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The message id for seek, OR an integer event time to seek to</li>
+</ul>
+</div>
+
+
+ </div>
+ <div id="Reader.close" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.close">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">close</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Close the reader.</span>
+<span class="sd"> """</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Close the reader.</p>
+</div>
+
+
+ </div>
+ <div id="Reader.is_connected" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Reader.is_connected">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">is_connected</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Check if the reader is connected or not.</span>
+<span class="sd"> """</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Check if the reader is connected or not.</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="CryptoKeyReader">
+ <div class="attr class">
+ <a class="headerlink" href="#CryptoKeyReader">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">CryptoKeyReader</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">CryptoKeyReader</span><span class="p">:</span>
+ <span class="sd">"""</span>
+<span class="sd"> Default crypto key reader implementation</span>
+<span class="sd"> """</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create crypto key reader.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `public_key_path`: Path to the public key</span>
+<span class="sd"> * `private_key_path`: Path to private key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">'public_key_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Default crypto key reader implementation</p>
+</div>
+
+
+ <div id="CryptoKeyReader.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#CryptoKeyReader.__init__">#  </a>
+
+
+ <span class="name">CryptoKeyReader</span><span class="signature">(public_key_path, private_key_path)</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+ <span class="sd">"""</span>
+<span class="sd"> Create crypto key reader.</span>
+
+<span class="sd"> **Args**</span>
+
+<span class="sd"> * `public_key_path`: Path to the public key</span>
+<span class="sd"> * `private_key_path`: Path to private key</span>
+<span class="sd"> """</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">'public_key_path'</span><span class="p">)</span>
+ <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">'private_key_path'</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Create crypto key reader.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>public_key_path</code>: Path to the public key</li>
+<li><code>private_key_path</code>: Path to private key</li>
+</ul>
+</div>
+
+
+ </div>
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/exceptions.html b/site2/website/static/api/python/2.10.0/pulsar/exceptions.html
new file mode 100644
index 00000000000..08beb4feb8a
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/exceptions.html
@@ -0,0 +1,260 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.exceptions API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.exceptions </h1>
+
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">from</span> <span class="nn">_pulsar</span> <span class="kn">import</span> <span class="n">PulsarException</span><span class="p">,</span> <span class="n">UnknownError</span><span class="p">,</span> <span class="n">InvalidConfiguration</span><span class="p">,</span> <span class="n">Timeout</span><span class="p">,</span> <span class="ne">LookupError</span><span class="p">,</span> <span class="n">ConnectError</span><span class="p">,</span> \
+ <span class="n">ReadError</span><span class="p">,</span> <span class="n">AuthenticationError</span><span class="p">,</span> <span class="n">AuthorizationError</span><span class="p">,</span> <span class="n">ErrorGettingAuthenticationData</span><span class="p">,</span> <span class="n">BrokerMetadataError</span><span class="p">,</span> \
+ <span class="n">BrokerPersistenceError</span><span class="p">,</span> <span class="n">ChecksumError</span><span class="p">,</span> <span class="n">ConsumerBusy</span><span class="p">,</span> <span class="n">NotConnected</span><span class="p">,</span> <span class="n">AlreadyClosed</span><span class="p">,</span> <span class="n">InvalidMessage</span><span class="p">,</span> \
+ <span class="n">ConsumerNotInitialized</span><span class="p">,</span> <span class="n">ProducerNotInitialized</span><span class="p">,</span> <span class="n">ProducerBusy</span><span class="p">,</span> <span class="n">TooManyLookupRequestException</span><span class="p">,</span> <span class="n">InvalidTopicName</span><span class="p">,</span> \
+ <span class="n">InvalidUrl</span><span class="p">,</span> <span class="n">ServiceUnitNotReady</span><span class="p">,</span> <span class="n">OperationNotSupported</span><span class="p">,</span> <span class="n">ProducerBlockedQuotaExceededError</span><span class="p">,</span> \
+ <span class="n">ProducerBlockedQuotaExceededException</span><span class="p">,</span> <span class="n">ProducerQueueIsFull</span><span class="p">,</span> <span class="n">MessageTooBig</span><span class="p">,</span> <span class="n">TopicNotFound</span><span class="p">,</span> <span class="n">SubscriptionNotFound</span><span class="p">,</span> \
+ <span class="n">ConsumerNotFound</span><span class="p">,</span> <span class="n">UnsupportedVersionError</span><span class="p">,</span> <span class="n">TopicTerminated</span><span class="p">,</span> <span class="n">CryptoError</span><span class="p">,</span> <span class="n">IncompatibleSchema</span><span class="p">,</span> <span class="n">ConsumerAssignError</span><span class="p">,</span> \
+ <span class="n">CumulativeAcknowledgementNotAllowedError</span><span class="p">,</span> <span class="n">TransactionCoordinatorNotFoundError</span><span class="p">,</span> <span class="n">InvalidTxnStatusError</span><span class="p">,</span> \
+ <span class="n">NotAllowedError</span><span class="p">,</span> <span class="n">TransactionConflict</span><span class="p">,</span> <span class="n">TransactionNotFound</span><span class="p">,</span> <span class="n">ProducerFenced</span><span class="p">,</span> <span class="n">MemoryBufferIsFull</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions.html b/site2/website/static/api/python/2.10.0/pulsar/functions.html
new file mode 100644
index 00000000000..31443a58706
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions.html
@@ -0,0 +1,259 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.functions API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+
+ <h2>Submodules</h2>
+ <ul>
+ <li><a href="functions/context.html">pulsar.functions.context</a></li>
+ <li><a href="functions/function.html">pulsar.functions.function</a></li>
+ <li><a href="functions/serde.html">pulsar.functions.serde</a></li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.functions </h1>
+
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/context.html b/site2/website/static/api/python/2.10.0/pulsar/functions/context.html
new file mode 100644
index 00000000000..f7bad2d3b8e
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/context.html
@@ -0,0 +1,1384 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.functions.context API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar.functions</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+ <h2>Contents</h2>
+ <ul>
+ <li><a href="#processing-of-a-request">processing of a request.</a></li>
+</ul>
+
+
+
+ <h2>API Documentation</h2>
+ <ul class="memberlist">
+ <li>
+ <a class="class" href="#Context">Context</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Context.__init__">Context</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_message_id">get_message_id</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_message_key">get_message_key</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_message_eventtime">get_message_eventtime</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_message_properties">get_message_properties</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_current_message_topic_name">get_current_message_topic_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_function_tenant">get_function_tenant</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_function_namespace">get_function_namespace</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_function_name">get_function_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_function_id">get_function_id</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_instance_id">get_instance_id</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_function_version">get_function_version</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_logger">get_logger</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_user_config_value">get_user_config_value</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_user_config_map">get_user_config_map</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_secret">get_secret</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_partition_key">get_partition_key</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.record_metric">record_metric</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.publish">publish</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_input_topics">get_input_topics</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_output_topic">get_output_topic</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_output_serde_class_name">get_output_serde_class_name</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.ack">ack</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.incr_counter">incr_counter</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_counter">get_counter</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.del_counter">del_counter</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.put_state">put_state</a>
+ </li>
+ <li>
+ <a class="function" href="#Context.get_state">get_state</a>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.context </h1>
+
+ <div class="docstring"><p>context.py: Context defines context information available during</p>
+
+<h1 id="processing-of-a-request">processing of a request.</h1>
+</div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">"""context.py: Context defines context information available during</span>
+<span class="sd"># processing of a request.</span>
+<span class="sd">"""</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="k">class</span> <span class="nc">Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface defining information available at process time"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the messageid of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the key of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the event time of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the message properties kv map of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the topic name of the message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the tenant of the message that's being processed"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the namespace of the message that's being processed"""</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function name that we are a part of"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function id that we are a part of"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the instance id that is executing the function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the version of function that we are executing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the logger object that can be used to do logging"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""Returns the value of the user-defined config. If the key doesn't exist, None is returned"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+ <span class="sd">"""Returns the secret value associated with the name. None if nothing was found"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns partition key of the input message is one exists"""</span>
+ <span class="k">pass</span>
+
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+ <span class="sd">"""Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">"serde.IdentitySerDe"</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+ <span class="sd">"""Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd"> The message will have properties specified if any</span>
+
+<span class="sd"> The available options for message_conf:</span>
+
+<span class="sd"> properties,</span>
+<span class="sd"> partition_key,</span>
+<span class="sd"> sequence_id,</span>
+<span class="sd"> replication_clusters,</span>
+<span class="sd"> disable_replication,</span>
+<span class="sd"> event_timestamp</span>
+
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the input topics of function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the output topic of function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""return output Serde class"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""ack this message id"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+ <span class="sd">"""incr the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""delete the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""update the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ <section id="Context">
+ <div class="attr class">
+ <a class="headerlink" href="#Context">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Context</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface defining information available at process time"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the messageid of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the key of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the event time of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the message properties kv map of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the topic name of the message that we are processing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the tenant of the message that's being processed"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the namespace of the message that's being processed"""</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function name that we are a part of"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function id that we are a part of"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the instance id that is executing the function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the version of function that we are executing"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the logger object that can be used to do logging"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""Returns the value of the user-defined config. If the key doesn't exist, None is returned"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+ <span class="sd">"""Returns the secret value associated with the name. None if nothing was found"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns partition key of the input message is one exists"""</span>
+ <span class="k">pass</span>
+
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+ <span class="sd">"""Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">"serde.IdentitySerDe"</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+ <span class="sd">"""Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd"> The message will have properties specified if any</span>
+
+<span class="sd"> The available options for message_conf:</span>
+
+<span class="sd"> properties,</span>
+<span class="sd"> partition_key,</span>
+<span class="sd"> sequence_id,</span>
+<span class="sd"> replication_clusters,</span>
+<span class="sd"> disable_replication,</span>
+<span class="sd"> event_timestamp</span>
+
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the input topics of function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the output topic of function"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""return output Serde class"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""ack this message id"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+ <span class="sd">"""incr the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""delete the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""update the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Interface defining information available at process time</p>
+</div>
+
+
+ <div id="Context.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.__init__">#  </a>
+
+
+ <span class="name">Context</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Context.get_message_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_message_id">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_message_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the messageid of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the messageid of the current message that we are processing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_message_key" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_message_key">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_message_key</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the key of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the key of the current message that we are processing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_message_eventtime" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_message_eventtime">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_message_eventtime</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the event time of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the event time of the current message that we are processing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_message_properties" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_message_properties">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_message_properties</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Return the message properties kv map of the current message that we are processing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Return the message properties kv map of the current message that we are processing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_current_message_topic_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_current_message_topic_name">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_current_message_topic_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the topic name of the message that we are processing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the topic name of the message that we are processing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_function_tenant" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_function_tenant">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_function_tenant</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the tenant of the message that's being processed"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the tenant of the message that's being processed</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_function_namespace" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_function_namespace">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_function_namespace</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the namespace of the message that's being processed"""</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the namespace of the message that's being processed</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_function_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_function_name">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_function_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function name that we are a part of"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the function name that we are a part of</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_function_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_function_id">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_function_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the function id that we are a part of"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the function id that we are a part of</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_instance_id" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_instance_id">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_instance_id</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the instance id that is executing the function"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the instance id that is executing the function</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_function_version" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_function_version">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_function_version</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the version of function that we are executing"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the version of function that we are executing</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_logger" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_logger">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_logger</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the logger object that can be used to do logging"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the logger object that can be used to do logging</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_user_config_value" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_user_config_value">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_user_config_value</span><span class="signature">(self, key)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""Returns the value of the user-defined config. If the key doesn't exist, None is returned"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the value of the user-defined config. If the key doesn't exist, None is returned</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_user_config_map" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_user_config_map">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_user_config_map</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_secret" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_secret">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_secret</span><span class="signature">(self, secret_name)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+ <span class="sd">"""Returns the secret value associated with the name. None if nothing was found"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the secret value associated with the name. None if nothing was found</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_partition_key" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_partition_key">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_partition_key</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns partition key of the input message is one exists"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns partition key of the input message is one exists</p>
+</div>
+
+
+ </div>
+ <div id="Context.record_metric" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.record_metric">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">record_metric</span><span class="signature">(self, metric_name, metric_value)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+ <span class="sd">"""Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)</p>
+</div>
+
+
+ </div>
+ <div id="Context.publish" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.publish">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">publish</span><span class="signature">(
+ self,
+ topic_name,
+ message,
+ serde_class_name='serde.IdentitySerDe',
+ properties=None,
+ compression_type=None,
+ callback=None,
+ message_conf=None
+)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">"serde.IdentitySerDe"</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+ <span class="sd">"""Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd"> The message will have properties specified if any</span>
+
+<span class="sd"> The available options for message_conf:</span>
+
+<span class="sd"> properties,</span>
+<span class="sd"> partition_key,</span>
+<span class="sd"> sequence_id,</span>
+<span class="sd"> replication_clusters,</span>
+<span class="sd"> disable_replication,</span>
+<span class="sd"> event_timestamp</span>
+
+<span class="sd"> """</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Publishes message to topic_name by first serializing the message using serde_class_name serde
+The message will have properties specified if any</p>
+
+<p>The available options for message_conf:</p>
+
+<p>properties,
+ partition_key,
+ sequence_id,
+ replication_clusters,
+ disable_replication,
+ event_timestamp</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_input_topics" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_input_topics">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_input_topics</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the input topics of function"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the input topics of function</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_output_topic" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_output_topic">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_output_topic</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""Returns the output topic of function"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Returns the output topic of function</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_output_serde_class_name" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_output_serde_class_name">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_output_serde_class_name</span><span class="signature">(self)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">"""return output Serde class"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>return output Serde class</p>
+</div>
+
+
+ </div>
+ <div id="Context.ack" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.ack">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">ack</span><span class="signature">(self, msgid, topic)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+ <span class="sd">"""ack this message id"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>ack this message id</p>
+</div>
+
+
+ </div>
+ <div id="Context.incr_counter" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.incr_counter">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">incr_counter</span><span class="signature">(self, key, amount)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+ <span class="sd">"""incr the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>incr the counter of a given key in the managed state</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_counter" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_counter">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_counter</span><span class="signature">(self, key)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>get the counter of a given key in the managed state</p>
+</div>
+
+
+ </div>
+ <div id="Context.del_counter" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.del_counter">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">del_counter</span><span class="signature">(self, key)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""delete the counter of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>delete the counter of a given key in the managed state</p>
+</div>
+
+
+ </div>
+ <div id="Context.put_state" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.put_state">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">put_state</span><span class="signature">(self, key, value)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="sd">"""update the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>update the value of a given key in the managed state</p>
+</div>
+
+
+ </div>
+ <div id="Context.get_state" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Context.get_state">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">get_state</span><span class="signature">(self, key)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="sd">"""get the value of a given key in the managed state"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>get the value of a given key in the managed state</p>
+</div>
+
+
+ </div>
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/function.html b/site2/website/static/api/python/2.10.0/pulsar/functions/function.html
new file mode 100644
index 00000000000..8d0f8aae48e
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/function.html
@@ -0,0 +1,376 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.functions.function API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar.functions</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+ <h2>Contents</h2>
+ <ul>
+ <li><a href="#the-process-method-is-called-for-every-message-of-the-input-topic-of-the">The process method is called for every message of the input topic of the</a></li>
+ <li><a href="#function-the-incoming-input-bytes-are-deserialized-using-the-serde">function. The incoming input bytes are deserialized using the serde.</a></li>
+ <li><a href="#the-process-function-can-optionally-emit-an-output">The process function can optionally emit an output</a></li>
+</ul>
+
+
+
+ <h2>API Documentation</h2>
+ <ul class="memberlist">
+ <li>
+ <a class="class" href="#Function">Function</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Function.__init__">Function</a>
+ </li>
+ <li>
+ <a class="function" href="#Function.process">process</a>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.function </h1>
+
+ <div class="docstring"><p>function.py: This is the core interface of the function api.</p>
+
+<h1 id="the-process-method-is-called-for-every-message-of-the-input-topic-of-the">The process method is called for every message of the input topic of the</h1>
+
+<h1 id="function-the-incoming-input-bytes-are-deserialized-using-the-serde">function. The incoming input bytes are deserialized using the serde.</h1>
+
+<h1 id="the-process-function-can-optionally-emit-an-output">The process function can optionally emit an output</h1>
+</div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">"""function.py: This is the core interface of the function api.</span>
+<span class="sd"># The process method is called for every message of the input topic of the</span>
+<span class="sd"># function. The incoming input bytes are deserialized using the serde.</span>
+<span class="sd"># The process function can optionally emit an output</span>
+<span class="sd">"""</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface for Pulsar Function"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+ <span class="sd">"""Process input message"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ <section id="Function">
+ <div class="attr class">
+ <a class="headerlink" href="#Function">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">Function</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface for Pulsar Function"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+ <span class="sd">"""Process input message"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Interface for Pulsar Function</p>
+</div>
+
+
+ <div id="Function.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Function.__init__">#  </a>
+
+
+ <span class="name">Function</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="Function.process" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#Function.process">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">process</span><span class="signature">(self, input, context)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+ <span class="sd">"""Process input message"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Process input message</p>
+</div>
+
+
+ </div>
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html b/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html
new file mode 100644
index 00000000000..e27884001c3
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html
@@ -0,0 +1,665 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.functions.serde API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar.functions</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+ <h2>Contents</h2>
+ <ul>
+ <li><a href="#everytime-a-message-is-read-from-pulsar-topic-the-serde-is-invoked-to">Everytime a message is read from pulsar topic, the serde is invoked to</a></li>
+ <li><a href="#serialize-the-bytes-into-an-object-before-invoking-the-process-method">serialize the bytes into an object before invoking the process method.</a></li>
+ <li><a href="#anytime-a-python-object-needs-to-be-written-back-to-pulsar-it-is">Anytime a python object needs to be written back to pulsar, it is</a></li>
+ <li><a href="#serialized-into-bytes-before-writing">serialized into bytes before writing.</a></li>
+</ul>
+
+
+
+ <h2>API Documentation</h2>
+ <ul class="memberlist">
+ <li>
+ <a class="class" href="#SerDe">SerDe</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#SerDe.__init__">SerDe</a>
+ </li>
+ <li>
+ <a class="function" href="#SerDe.serialize">serialize</a>
+ </li>
+ <li>
+ <a class="function" href="#SerDe.deserialize">deserialize</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#PickleSerDe">PickleSerDe</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#PickleSerDe.__init__">PickleSerDe</a>
+ </li>
+ <li>
+ <a class="function" href="#PickleSerDe.serialize">serialize</a>
+ </li>
+ <li>
+ <a class="function" href="#PickleSerDe.deserialize">deserialize</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#IdentitySerDe">IdentitySerDe</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#IdentitySerDe.__init__">IdentitySerDe</a>
+ </li>
+ <li>
+ <a class="function" href="#IdentitySerDe.serialize">serialize</a>
+ </li>
+ <li>
+ <a class="function" href="#IdentitySerDe.deserialize">deserialize</a>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.serde </h1>
+
+ <div class="docstring"><p>serde.py: SerDe defines the interface for serialization/deserialization.</p>
+
+<h1 id="everytime-a-message-is-read-from-pulsar-topic-the-serde-is-invoked-to">Everytime a message is read from pulsar topic, the serde is invoked to</h1>
+
+<h1 id="serialize-the-bytes-into-an-object-before-invoking-the-process-method">serialize the bytes into an object before invoking the process method.</h1>
+
+<h1 id="anytime-a-python-object-needs-to-be-written-back-to-pulsar-it-is">Anytime a python object needs to be written back to pulsar, it is</h1>
+
+<h1 id="serialized-into-bytes-before-writing">serialized into bytes before writing.</h1>
+</div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">"""serde.py: SerDe defines the interface for serialization/deserialization.</span>
+<span class="sd"># Everytime a message is read from pulsar topic, the serde is invoked to</span>
+<span class="sd"># serialize the bytes into an object before invoking the process method.</span>
+<span class="sd"># Anytime a python object needs to be written back to pulsar, it is</span>
+<span class="sd"># serialized into bytes before writing.</span>
+<span class="sd">"""</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="kn">import</span> <span class="nn">pickle</span>
+
+<span class="k">class</span> <span class="nc">SerDe</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface for Serialization/Deserialization"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="sd">"""Serialize input message into bytes"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="sd">"""Serialize input_bytes into an object"""</span>
+ <span class="k">pass</span>
+
+<span class="k">class</span> <span class="nc">PickleSerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+ <span class="sd">"""Pickle based serializer"""</span>
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">IdentitySerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+ <span class="sd">"""Simple Serde that just conversion to string and back"""</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">input</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">))</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ <section id="SerDe">
+ <div class="attr class">
+ <a class="headerlink" href="#SerDe">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">SerDe</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SerDe</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">"""Interface for Serialization/Deserialization"""</span>
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="sd">"""Serialize input message into bytes"""</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="sd">"""Serialize input_bytes into an object"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Interface for Serialization/Deserialization</p>
+</div>
+
+
+ <div id="SerDe.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#SerDe.__init__">#  </a>
+
+
+ <span class="name">SerDe</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="SerDe.serialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#SerDe.serialize">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">serialize</span><span class="signature">(self, input)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="sd">"""Serialize input message into bytes"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+ </div>
+ <div id="SerDe.deserialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#SerDe.deserialize">#  </a>
+
+ <div class="decorator">@abstractmethod</div>
+
+ <span class="def">def</span>
+ <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="sd">"""Serialize input_bytes into an object"""</span>
+ <span class="k">pass</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="PickleSerDe">
+ <div class="attr class">
+ <a class="headerlink" href="#PickleSerDe">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">PickleSerDe</span><wbr>(<span class="base"><a href="#SerDe">SerDe</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PickleSerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+ <span class="sd">"""Pickle based serializer"""</span>
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Pickle based serializer</p>
+</div>
+
+
+ <div id="PickleSerDe.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#PickleSerDe.__init__">#  </a>
+
+
+ <span class="name">PickleSerDe</span><span class="signature">()</span>
+ </div>
+
+
+
+
+ </div>
+ <div id="PickleSerDe.serialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#PickleSerDe.serialize">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">serialize</span><span class="signature">(self, input)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+ </div>
+ <div id="PickleSerDe.deserialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#PickleSerDe.deserialize">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+ </div>
+ </section>
+ <section id="IdentitySerDe">
+ <div class="attr class">
+ <a class="headerlink" href="#IdentitySerDe">#  </a>
+
+
+ <span class="def">class</span>
+ <span class="name">IdentitySerDe</span><wbr>(<span class="base"><a href="#SerDe">SerDe</a></span>):
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">IdentitySerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+ <span class="sd">"""Simple Serde that just conversion to string and back"""</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">input</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">))</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Simple Serde that just conversion to string and back</p>
+</div>
+
+
+ <div id="IdentitySerDe.__init__" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#IdentitySerDe.__init__">#  </a>
+
+
+ <span class="name">IdentitySerDe</span><span class="signature">()</span>
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+</pre></div>
+
+ </details>
+
+
+
+ </div>
+ <div id="IdentitySerDe.serialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#IdentitySerDe.serialize">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">serialize</span><span class="signature">(self, input)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">input</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+ </div>
+ <div id="IdentitySerDe.deserialize" class="classattr">
+ <div class="attr function"><a class="headerlink" href="#IdentitySerDe.deserialize">#  </a>
+
+
+ <span class="def">def</span>
+ <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+ </div>
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">))</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+ </details>
+
+ <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+ </div>
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/schema.html b/site2/website/static/api/python/2.10.0/pulsar/schema.html
new file mode 100644
index 00000000000..3b52c59587f
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/schema.html
@@ -0,0 +1,262 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.schema API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+
+ <h2>Submodules</h2>
+ <ul>
+ <li><a href="schema/definition.html">pulsar.schema.definition</a></li>
+ <li><a href="schema/schema.html">pulsar.schema.schema</a></li>
+ <li><a href="schema/schema_avro.html">pulsar.schema.schema_avro</a></li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.schema </h1>
+
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">from</span> <span class="nn">.definition</span> <span class="kn">import</span> <span class="n">Record</span><span class="p">,</span> <span class="n">Field</span><span class="p">,</span> <span class="n">Null</span><span class="p">,</span> <span class="n">Boolean</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">Long</span><span class="p">,</span> \
+ <span class="n">Float</span><span class="p">,</span> <span class="n">Double</span><span class="p">,</span> <span class="n">Bytes</span><span class="p">,</span> <span class="n">String</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Map</span><span class="p">,</span> <span class="n">CustomEnum</span>
+
+<span class="kn">from</span> <span class="nn">.schema</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">BytesSchema</span><span class="p">,</span> <span class="n">StringSchema</span><span class="p">,</span> <span class="n">JsonSchema</span>
+<span class="kn">from</span> <span class="nn">.schema_avro</span> <span class="kn">import</span> <span class="n">AvroSchema</span>
+</pre></div>
+
+ </details>
+
+ </section>
+ </main>
+<script>
+ function escapeHTML(html) {
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+ }
+
+ const originalContent = document.querySelector("main.pdoc");
+ let currentContent = originalContent;
+
+ function setContent(innerHTML) {
+ let elem;
+ if (innerHTML) {
+ elem = document.createElement("main");
+ elem.classList.add("pdoc");
+ elem.innerHTML = innerHTML;
+ } else {
+ elem = originalContent;
+ }
+ if (currentContent !== elem) {
+ currentContent.replaceWith(elem);
+ currentContent = elem;
+ }
+ }
+
+ function getSearchTerm() {
+ return (new URL(window.location)).searchParams.get("search");
+ }
+
+ const searchBox = document.querySelector(".pdoc input[type=search]");
+ searchBox.addEventListener("input", function () {
+ let url = new URL(window.location);
+ if (searchBox.value.trim()) {
+ url.hash = "";
+ url.searchParams.set("search", searchBox.value);
+ } else {
+ url.searchParams.delete("search");
+ }
+ history.replaceState("", "", url.toString());
+ onInput();
+ });
+ window.addEventListener("popstate", onInput);
+
+
+ let search, searchErr;
+
+ async function initialize() {
+ try {
+ search = await new Promise((resolve, reject) => {
+ const script = document.createElement("script");
+ script.type = "text/javascript";
+ script.async = true;
+ script.onload = () => resolve(window.pdocSearch);
+ script.onerror = (e) => reject(e);
+ script.src = "../search.js";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ });
+ } catch (e) {
+ console.error("Cannot fetch pdoc search index");
+ searchErr = "Cannot fetch search index.";
+ }
+ onInput();
+
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
+ if (e.target.hash) {
+ searchBox.value = "";
+ searchBox.dispatchEvent(new Event("input"));
+ }
+ });
+ }
+
+ function onInput() {
+ setContent((() => {
+ const term = getSearchTerm();
+ if (!term) {
+ return null
+ }
+ if (searchErr) {
+ return `<h3>Error: ${searchErr}</h3>`
+ }
+ if (!search) {
+ return "<h3>Searching...</h3>"
+ }
+
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+ const results = search(term);
+
+ let html;
+ if (results.length === 0) {
+ html = `No search results for '${escapeHTML(term)}'.`
+ } else {
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+ }
+ for (let result of results.slice(0, 10)) {
+ let doc = result.doc;
+ let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+ if (doc.qualname) {
+ url += `#${doc.qualname}`;
+ }
+
+ let heading;
+ switch (result.doc.type) {
+ case "function":
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+ break;
+ case "class":
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+ if (doc.bases)
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+ heading += `:`;
+ break;
+ case "variable":
+ heading = `<span class="name">${doc.fullname}</span>`;
+ if (doc.annotation)
+ heading += `<span class="annotation">${doc.annotation}</span>`;
+ if (doc.default_value)
+ heading += `<span class="default_value">${doc.default_value}</span>`;
+ break;
+ default:
+ heading = `<span class="name">${doc.fullname}</span>`;
+ break;
+ }
+ html += `
+ <section class="search-result">
+ <a href="${url}" class="attr ${doc.type}">${heading}</a>
+ <div class="docstring">${doc.doc}</div>
+ </section>
+ `;
+
+ }
+ return html;
+ })());
+ }
+
+ if (getSearchTerm()) {
+ initialize();
+ searchBox.value = getSearchTerm();
+ onInput();
+ } else {
+ searchBox.addEventListener("focus", initialize, {once: true});
+ }
+
+ searchBox.addEventListener("keydown", e => {
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+ let focused = currentContent.querySelector(".search-result.focused");
+ if (!focused) {
+ currentContent.querySelector(".search-result").classList.add("focused");
+ } else if (
+ e.key === "ArrowDown"
+ && focused.nextElementSibling
+ && focused.nextElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.nextElementSibling.classList.add("focused");
+ focused.nextElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "ArrowUp"
+ && focused.previousElementSibling
+ && focused.previousElementSibling.classList.contains("search-result")
+ ) {
+ focused.classList.remove("focused");
+ focused.previousElementSibling.classList.add("focused");
+ focused.previousElementSibling.scrollIntoView({
+ behavior: "smooth",
+ block: "nearest",
+ inline: "nearest"
+ });
+ } else if (
+ e.key === "Enter"
+ ) {
+ focused.querySelector("a").click();
+ }
+ }
+ });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html b/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html
new file mode 100644
index 00000000000..33b2b168539
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html
@@ -0,0 +1,3274 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="generator" content="pdoc 11.0.0"/>
+ <title>pulsar.schema.definition API documentation</title>
+
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+ <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+ <style>/*! custom.css */</style></head>
+<body>
+ <nav class="pdoc">
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+ <div> <a class="pdoc-button module-list-button" href="../schema.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg> pulsar.schema</a>
+
+
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+ pattern=".+" required>
+
+
+
+ <h2>API Documentation</h2>
+ <ul class="memberlist">
+ <li>
+ <a class="class" href="#RecordMeta">RecordMeta</a>
+ <ul class="memberlist">
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Record">Record</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Record.__init__">Record</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.schema">schema</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.schema_info">schema_info</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.default">default</a>
+ </li>
+ <li>
+ <a class="function" href="#Record.required_default">required_default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Field">Field</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Field.__init__">Field</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.schema">schema</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.schema_info">schema_info</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.default">default</a>
+ </li>
+ <li>
+ <a class="function" href="#Field.required_default">required_default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Null">Null</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Null.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Null.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Null.validate_type">validate_type</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Boolean">Boolean</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Boolean.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Boolean.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Boolean.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Integer">Integer</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Integer.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Integer.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Integer.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Long">Long</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Long.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Long.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Long.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Float">Float</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Float.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Float.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Float.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Double">Double</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Double.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Double.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Double.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Bytes">Bytes</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Bytes.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Bytes.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Bytes.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#String">String</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#String.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#String.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#String.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#String.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#CustomEnum">CustomEnum</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#CustomEnum.__init__">CustomEnum</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.schema">schema</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.schema_info">schema_info</a>
+ </li>
+ <li>
+ <a class="function" href="#CustomEnum.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Array">Array</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Array.__init__">Array</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.schema">schema</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.schema_info">schema_info</a>
+ </li>
+ <li>
+ <a class="function" href="#Array.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="class" href="#Map">Map</a>
+ <ul class="memberlist">
+ <li>
+ <a class="function" href="#Map.__init__">Map</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.type">type</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.python_type">python_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.validate_type">validate_type</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.schema">schema</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.schema_info">schema_info</a>
+ </li>
+ <li>
+ <a class="function" href="#Map.default">default</a>
+ </li>
+ </ul>
+
+ </li>
+ <li>
+ <a class="function" href="#is_unicode">is_unicode</a>
+ </li>
+ </ul>
+
+
+
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+ built with <span class="visually-hidden">pdoc</span><img
+ alt="pdoc logo"
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+ </a>
+</div>
+ </nav>
+ <main class="pdoc">
+ <section>
+ <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../schema.html">schema</a><wbr>.definition </h1>
+
+
+ <details>
+ <summary>View Source</summary>
+ <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">import</span> <span class="nn">copy</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span>
+<span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">EnumMeta</span>
+<span class="kn">from</span> <span class="nn">six</span> <span class="kn">import</span> <span class="n">with_metaclass</span>
+
+
+<span class="k">def</span> <span class="nf">_check_record_or_field</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">type</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">Record</span><span class="p">))</span> \
+ <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">'Argument '</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s1">' is not a Record or a Field'</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">RecordMeta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+ <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="n">metacls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parents</span><span class="p">,</span> <span class="n">dct</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="o">!=</span> <span class="s1">'Record'</span><span class="p">:</span>
+ <span class="c1"># Do not apply this logic to the base class itself</span>
+ <span class="n">dct</span><span class="p">[</span><span class="s1">'_fields'</span><span class="p">]</span> <span class="o">=</span> <span class="n">RecordMeta</span><span class="o">.</span><span class="n">_get_fields</span><span class="p">(</span><span class="n">dct</span><span class="p">)</span>
+ <span class="n">dct</span><span class="p">[</span><span class="s1">'_required'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">return</span> <span class="nb">type</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">metacls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parents</span><span class="p">,</span> <span class="n">dct</span><span class="p">)</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">_get_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">dct</span><span class="p">):</span>
+ <span class="c1"># Build a set of valid fields for this record</span>
+ <span class="n">fields</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">dct</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">EnumMeta</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">CustomEnum</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="n">RecordMeta</span><span class="p">:</span>
+ <span class="c1"># We expect an instance of a record rather than the class itself</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
+ <span class="n">fields</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">return</span> <span class="n">fields</span>
+
+
+<span class="k">class</span> <span class="nc">Record</span><span class="p">(</span><span class="n">with_metaclass</span><span class="p">(</span><span class="n">RecordMeta</span><span class="p">,</span> <span class="nb">object</span><span class="p">)):</span>
+
+ <span class="c1"># This field is used to set namespace for Avro Record schema.</span>
+ <span class="n">_avro_namespace</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="c1"># Generate a schema where fields are sorted alphabetically</span>
+ <span class="n">_sorted_fields</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">required_default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">*</ [...]
+ <span class="bp">self</span><span class="o">.</span><span class="n">_required_default</span> <span class="o">=</span> <span class="n">required_default</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_default</span> <span class="o">=</span> <span class="n">default</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_required</span> <span class="o">=</span> <span class="n">required</span>
+
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="c1"># Use dict init Record object</span>
+ <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
+ <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">copied</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Array</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="n [...]
+ <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">array_type</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span [...]
+ <span class="n">arr</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">]:</span>
+ <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">array_type</span><span class="p">)</span>
+ <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">item</span><span class="p">)</span>
+ <span class="n">arr</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">copied</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">arr</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Map</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb" [...]
+ <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">value_type</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span c [...]
+ <span class="n">dic</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">mapKey</span><span class="p">,</span> <span class="n">mapValue</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">value_type</span><span class="p">)</span>
+ <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">mapValue</span><span class="p">)</span>
+ <span class="n">dic</span><span class="p">[</span><span class="n">mapKey</span><span class="p">]</span> <span class="o">=</span> <span class="n">copied</span>
+ <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">dic</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># Value was overridden at constructor</span>
+ <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">):</span>
+ <span class="c1"># Value is a subrecord</span>
+ <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># Set field to default value, without revalidating the default value type</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">Record</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">default</span><span class="p">())</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">schema</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="nb">set</span><span class="p">())</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">schema_info</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">defined_names</span><span class="p">):</span>
+ <span class="n">namespace_prefix</span> <span class="o">=</span> <span class="s1">''</span>
+ <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">namespace_prefix</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="o">+</span> <span class="s1">'.'</span>
+ <span class="n">namespace_name</span> <span class="o">=</span> <span class="n">namespace_prefix</span> <span class="o">+</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span>
+
+ <span class="k">if</span> <span class="n">namespace_name</span> <span class="ow">in</span> <span class="n">defined_names</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">namespace_name</span>
+
+ <span class="n">defined_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">namespace_name</span><span class="p">)</span>
+
+ <span class="n">schema</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">'type'</span><span class="p">:</span> <span class="s1">'record'</span><span class="p">,</span>
+ <span class="s1">'name'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
+ <span class="p">}</span>
+ <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">[</span><span class="s1">'namespace'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span>
+ <span class="n">schema</span><span class="p">[</span><span class="s1">'fields'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">get_filed_default_value</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+ <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_sorted_fields</span><span class="p">:</span>
+ <span class="n">fields</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">fields</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
+ <span class="n">field</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+ <span class="n">field_type</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="n">defined_names</span><span class="p">)</span> \
+ <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">_required</span> <span class="k">else</span> <span class="p">[</span><span class="s1">'null'</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="n">defined_names</span><span class="p">)]</span>
+ <span class="n">schema</span><span class="p">[</span><span class="s1">'fields'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
... 4245 lines suppressed ...