blob: 399ab97d5eb9c5b85fe306187e84746430e7ed15 [file] [log] [blame]
<!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 10.0.3"/>
<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,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
<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}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
<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;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;}nav.pdoc{--pad:1.75rem;--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent }nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc li{display:block;margin:0;padding:.2rem 0 .2rem var(--indent);transition:all 100ms;}nav.pdoc > div > ul > li{padding-left:0;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
<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 .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--code);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc section{margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.pdoc details{filter:opacity(1);}.pdoc details:not([open]){height:0;}.pdoc details > summary{position:absolute;top:-35px;right:0;font-size:.75rem;color:var(--muted);padding:0 .7em;user-select:none;cursor:pointer;}.pdoc details > summary:focus{outline:0;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc > section:first-of-type > .docstring{margin-bottom:2.5rem;}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc .headerlink{position:absolute;width:0;margin-left:-1.5rem;line-height:1.4rem;font-size:1.5rem;font-weight:normal;transition:all 100ms ease-in-out;opacity:0;user-select:none;}.pdoc .attr > .headerlink{margin-left:-2.5rem;}.pdoc *:hover > .headerlink,.pdoc *:target > .attr > .headerlink{opacity:1;}.pdoc .attr{display:block;color:var(--text);margin:.5rem 0 .5rem;padding:.4rem 5rem .4rem 1rem;background-color:var(--accent);}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{white-space:pre-wrap;}.pdoc .annotation{color:var(--annotation);}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
<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/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.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>
</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>
</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>
</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-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
</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"># &quot;License&quot;); 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"># &quot;AS IS&quot; 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">&quot;&quot;&quot;</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(&#39;pulsar://localhost:6650&#39;)</span>
<span class="sd"> producer = client.create_producer(&#39;my-topic&#39;)</span>
<span class="sd"> for i in range(10):</span>
<span class="sd"> producer.send((&#39;Hello-%d&#39; % i).encode(&#39;utf-8&#39;))</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(&#39;pulsar://localhost:6650&#39;)</span>
<span class="sd"> consumer = client.subscribe(&#39;my-topic&#39;, &#39;my-subscription&#39;)</span>
<span class="sd"> while True:</span>
<span class="sd"> msg = consumer.receive()</span>
<span class="sd"> try:</span>
<span class="sd"> print(&quot;Received message &#39;%s&#39; id=&#39;%s&#39;&quot;, msg.data().decode(&#39;utf-8&#39;), 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(&#39;pulsar://localhost:6650&#39;)</span>
<span class="sd"> producer = client.create_producer(</span>
<span class="sd"> &#39;my-topic&#39;,</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(&#39;Message published res=%s&#39;, res)</span>
<span class="sd"> while True:</span>
<span class="sd"> producer.send_async((&#39;Hello-%d&#39; % i).encode(&#39;utf-8&#39;), send_callback)</span>
<span class="sd"> client.close()</span>
<span class="sd">&quot;&quot;&quot;</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.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">&#39;x&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Represents a message id</span>
<span class="sd"> &quot;&quot;&quot;</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</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
<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">&#39;Represents the earliest message stored in a topic&#39;</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">&#39;Represents the latest message published on a topic&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Deserialize a message id object from a previously</span>
<span class="sd"> serialized bytes sequence.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object typed bytes with the payload of the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object with the de-serialized version of the message content</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the partitioning key for the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> The message ID that can be used to refere to this particular message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the topic Name from which this message originated from</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the redelivery count for this message</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the schema version for this message</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;unknown message id type&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Authentication provider object. Used to load authentication from an external</span>
<span class="sd"> shared library.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;dynamicLibPath&#39;</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">&#39;authParamsString&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> TLS Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;certificate_path&#39;</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">&#39;private_key_path&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Token based authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Athenz Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Oauth2 Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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="p">):</span>
<span class="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;service_url&#39;</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">&#39;authentication&#39;</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">&#39;operation_timeout_seconds&#39;</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">&#39;io_threads&#39;</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">&#39;message_listener_threads&#39;</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">&#39;concurrent_lookup_requests&#39;</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">&#39;log_conf_file_path&#39;</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">&#39;use_tls&#39;</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">&#39;tls_trust_certs_file_path&#39;</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">&#39;tls_allow_insecure_connection&#39;</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">&#39;tls_validate_hostname&#39;</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">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">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">&#39;pulsar+ssl://&#39;</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">&#39;https://&#39;</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">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">&quot;&quot;&quot;</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&#39;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"> * `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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;producer_name&#39;</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">&#39;schema&#39;</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">&#39;initial_sequence_id&#39;</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">&#39;send_timeout_millis&#39;</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">&#39;compression_type&#39;</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">&#39;max_pending_messages&#39;</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">&#39;max_pending_messages_across_partitions&#39;</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">&#39;block_if_queue_full&#39;</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">&#39;batching_enabled&#39;</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">&#39;batching_max_messages&#39;</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">&#39;batching_max_allowed_size_in_bytes&#39;</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">&#39;batching_max_publish_delay_ms&#39;</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">&#39;properties&#39;</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">&#39;batching_type&#39;</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">&#39;encryption_key&#39;</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">&#39;crypto_key_reader&#39;</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="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="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="sd">&quot;&quot;&quot;</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=&#39;my-topic&#39;`</span>
<span class="sd"> - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
<span class="sd"> - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</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"> &quot;&quot;&quot;</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">&#39;subscription_name&#39;</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">&#39;consumer_type&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;max_total_receiver_queue_size_across_partitions&#39;</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">&#39;consumer_name&#39;</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">&#39;unacked_messages_timeout_ms&#39;</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">&#39;broker_consumer_stats_cache_time_ms&#39;</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">&#39;negative_ack_redelivery_delay_ms&#39;</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">&#39;pattern_auto_discovery_period&#39;</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">&#39;is_read_compacted&#39;</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">&#39;properties&#39;</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">&#39;initial_position&#39;</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">&#39;crypto_key_reader&#39;</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">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 class="p">)</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">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</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="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;start_message_id&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;reader_name&#39;</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">&#39;subscription_role_prefix&#39;</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">&#39;is_read_compacted&#39;</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="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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Close the client and all the associated producers and consumers</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> The Pulsar message producer, used to publish messages on a topic.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic which producer is publishing to</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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&#39;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&#39;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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(&#39;Message published: %s&#39; % 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&#39;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&#39;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the producer.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;data&#39;</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">&#39;properties&#39;</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">&#39;partition_key&#39;</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">&#39;sequence_id&#39;</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">&#39;replication_clusters&#39;</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">&#39;disable_replication&#39;</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">&#39;event_timestamp&#39;</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">&#39;deliver_at&#39;</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">&#39;deliver_after&#39;</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">class</span> <span class="nc">Consumer</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pulsar consumer.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this consumer is subscribed to.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the subscription name.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Acknowledge the failure to process a single message.</span>
<span class="sd"> When a message is &quot;negatively acked&quot; 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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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&#39;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&#39;t throw an exception. In case the connection breaks, the messages</span>
<span class="sd"> are redelivered after reconnect.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the consumer.</span>
<span class="sd"> &quot;&quot;&quot;</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">class</span> <span class="nc">Reader</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pulsar topic reader.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this reader is reading from.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Check if there is any message available to read from the current position.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the reader.</span>
<span class="sd"> &quot;&quot;&quot;</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">class</span> <span class="nc">CryptoKeyReader</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Default crypto key reader implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;public_key_path&#39;</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">&#39;private_key_path&#39;</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">&quot;Argument </span><span class="si">%s</span><span class="s2"> is expected to be of type &#39;</span><span class="si">%s</span><span class="s2">&#39; and not &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</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">&quot;Argument </span><span class="si">%s</span><span class="s2"> is expected to be either None or of type &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Represents a message id</span>
<span class="sd"> &quot;&quot;&quot;</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</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
<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">&#39;Represents the earliest message stored in a topic&#39;</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">&#39;Represents the latest message published on a topic&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Deserialize a message id object from a previously</span>
<span class="sd"> serialized bytes sequence.</span>
<span class="sd"> &quot;&quot;&quot;</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__">#&nbsp;&nbsp</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><span class="p">,</span> <span class="n">batch_index</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
<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">#&nbsp;&nbsp</a>
<span class="name">earliest</span><span class="default_value"> = &lt;_pulsar.MessageId object&gt;</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">#&nbsp;&nbsp</a>
<span class="name">latest</span><span class="default_value"> = &lt;_pulsar.MessageId object&gt;</span>
</div>
</div>
<div id="MessageId.ledger_id" class="classattr">
<div class="attr function"><a class="headerlink" href="#MessageId.ledger_id">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Deserialize a message id object from a previously</span>
<span class="sd"> serialized bytes sequence.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object typed bytes with the payload of the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object with the de-serialized version of the message content</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the partitioning key for the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> The message ID that can be used to refere to this particular message.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the topic Name from which this message originated from</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the redelivery count for this message</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the schema version for this message</span>
<span class="sd"> &quot;&quot;&quot;</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__">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object typed bytes with the payload of the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Returns object with the de-serialized version of the message content</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the partitioning key for the message.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message publish time.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the timestamp in milliseconds with the message event time.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> The message ID that can be used to refere to this particular message.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the topic Name from which this message originated from</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the redelivery count for this message</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Get the schema version for this message</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;unknown message id type&quot;</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__">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;unknown message id type&quot;</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">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Authentication provider object. Used to load authentication from an external</span>
<span class="sd"> shared library.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;dynamicLibPath&#39;</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">&#39;authParamsString&#39;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;dynamicLibPath&#39;</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">&#39;authParamsString&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> TLS Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;certificate_path&#39;</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">&#39;private_key_path&#39;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;certificate_path&#39;</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">&#39;private_key_path&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Token based authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Athenz Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Oauth2 Authentication implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;auth_params_string&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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="p">):</span>
<span class="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;service_url&#39;</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">&#39;authentication&#39;</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">&#39;operation_timeout_seconds&#39;</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">&#39;io_threads&#39;</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">&#39;message_listener_threads&#39;</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">&#39;concurrent_lookup_requests&#39;</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">&#39;log_conf_file_path&#39;</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">&#39;use_tls&#39;</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">&#39;tls_trust_certs_file_path&#39;</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">&#39;tls_allow_insecure_connection&#39;</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">&#39;tls_validate_hostname&#39;</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">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">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">&#39;pulsar+ssl://&#39;</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">&#39;https://&#39;</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">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">&quot;&quot;&quot;</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&#39;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"> * `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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;producer_name&#39;</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">&#39;schema&#39;</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">&#39;initial_sequence_id&#39;</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">&#39;send_timeout_millis&#39;</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">&#39;compression_type&#39;</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">&#39;max_pending_messages&#39;</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">&#39;max_pending_messages_across_partitions&#39;</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">&#39;block_if_queue_full&#39;</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">&#39;batching_enabled&#39;</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">&#39;batching_max_messages&#39;</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">&#39;batching_max_allowed_size_in_bytes&#39;</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">&#39;batching_max_publish_delay_ms&#39;</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">&#39;properties&#39;</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">&#39;batching_type&#39;</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">&#39;encryption_key&#39;</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">&#39;crypto_key_reader&#39;</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="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="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="sd">&quot;&quot;&quot;</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=&#39;my-topic&#39;`</span>
<span class="sd"> - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
<span class="sd"> - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</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"> &quot;&quot;&quot;</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">&#39;subscription_name&#39;</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">&#39;consumer_type&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;max_total_receiver_queue_size_across_partitions&#39;</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">&#39;consumer_name&#39;</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">&#39;unacked_messages_timeout_ms&#39;</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">&#39;broker_consumer_stats_cache_time_ms&#39;</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">&#39;negative_ack_redelivery_delay_ms&#39;</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">&#39;pattern_auto_discovery_period&#39;</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">&#39;is_read_compacted&#39;</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">&#39;properties&#39;</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">&#39;initial_position&#39;</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">&#39;crypto_key_reader&#39;</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">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 class="p">)</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">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</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="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;start_message_id&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;reader_name&#39;</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">&#39;subscription_role_prefix&#39;</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">&#39;is_read_compacted&#39;</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="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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Close the client and all the associated producers and consumers</span>
<span class="sd"> &quot;&quot;&quot;</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__">#&nbsp;&nbsp</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
)</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="p">):</span>
<span class="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;service_url&#39;</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">&#39;authentication&#39;</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">&#39;operation_timeout_seconds&#39;</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">&#39;io_threads&#39;</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">&#39;message_listener_threads&#39;</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">&#39;concurrent_lookup_requests&#39;</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">&#39;log_conf_file_path&#39;</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">&#39;use_tls&#39;</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">&#39;tls_trust_certs_file_path&#39;</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">&#39;tls_allow_insecure_connection&#39;</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">&#39;tls_validate_hostname&#39;</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">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">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">&#39;pulsar+ssl://&#39;</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">&#39;https://&#39;</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>
</ul>
</div>
</div>
<div id="Client.create_producer" class="classattr">
<div class="attr function"><a class="headerlink" href="#Client.create_producer">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">create_producer</span><span class="signature">(
self,
topic,
producer_name=None,
schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
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,
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">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">&quot;&quot;&quot;</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&#39;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"> * `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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;producer_name&#39;</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">&#39;schema&#39;</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">&#39;initial_sequence_id&#39;</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">&#39;send_timeout_millis&#39;</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">&#39;compression_type&#39;</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">&#39;max_pending_messages&#39;</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">&#39;max_pending_messages_across_partitions&#39;</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">&#39;block_if_queue_full&#39;</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">&#39;batching_enabled&#39;</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">&#39;batching_max_messages&#39;</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">&#39;batching_max_allowed_size_in_bytes&#39;</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">&#39;batching_max_publish_delay_ms&#39;</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">&#39;properties&#39;</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">&#39;batching_type&#39;</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">&#39;encryption_key&#39;</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">&#39;crypto_key_reader&#39;</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="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="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>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">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">subscribe</span><span class="signature">(
self,
topic,
subscription_name,
consumer_type=_pulsar.ConsumerType.Exclusive,
schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
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
)</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="sd">&quot;&quot;&quot;</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=&#39;my-topic&#39;`</span>
<span class="sd"> - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
<span class="sd"> - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</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"> &quot;&quot;&quot;</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">&#39;subscription_name&#39;</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">&#39;consumer_type&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;max_total_receiver_queue_size_across_partitions&#39;</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">&#39;consumer_name&#39;</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">&#39;unacked_messages_timeout_ms&#39;</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">&#39;broker_consumer_stats_cache_time_ms&#39;</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">&#39;negative_ack_redelivery_delay_ms&#39;</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">&#39;pattern_auto_discovery_period&#39;</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">&#39;is_read_compacted&#39;</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">&#39;properties&#39;</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">&#39;initial_position&#39;</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">&#39;crypto_key_reader&#39;</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">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 class="p">)</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">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</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>
</ul>
</div>
</div>
<div id="Client.create_reader" class="classattr">
<div class="attr function"><a class="headerlink" href="#Client.create_reader">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">create_reader</span><span class="signature">(
self,
topic,
start_message_id,
schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
reader_listener=None,
receiver_queue_size=1000,
reader_name=None,
subscription_role_prefix=None,
is_read_compacted=False
)</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="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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">&#39;start_message_id&#39;</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">&#39;schema&#39;</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">&#39;receiver_queue_size&#39;</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">&#39;reader_name&#39;</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">&#39;subscription_role_prefix&#39;</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">&#39;is_read_compacted&#39;</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="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>
</ul>
</div>
</div>
<div id="Client.get_topic_partitions" class="classattr">
<div class="attr function"><a class="headerlink" href="#Client.get_topic_partitions">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;topic&#39;</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.
:param topic: the topic name to lookup
:return: a list of partition name</p>
</div>
</div>
<div id="Client.close" class="classattr">
<div class="attr function"><a class="headerlink" href="#Client.close">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the client and all the associated producers and consumers</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> The Pulsar message producer, used to publish messages on a topic.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic which producer is publishing to</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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&#39;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&#39;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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(&#39;Message published: %s&#39; % 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&#39;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&#39;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the producer.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;data&#39;</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">&#39;properties&#39;</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">&#39;partition_key&#39;</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">&#39;sequence_id&#39;</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">&#39;replication_clusters&#39;</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">&#39;disable_replication&#39;</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">&#39;event_timestamp&#39;</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">&#39;deliver_at&#39;</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">&#39;deliver_after&#39;</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>
</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__">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic which producer is publishing to</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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&#39;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&#39;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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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(&#39;Message published: %s&#39; % 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&#39;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&#39;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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the producer.</span>
<span class="sd"> &quot;&quot;&quot;</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>
</section>
<section id="Consumer">
<div class="attr class">
<a class="headerlink" href="#Consumer">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Pulsar consumer.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this consumer is subscribed to.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the subscription name.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Acknowledge the failure to process a single message.</span>
<span class="sd"> When a message is &quot;negatively acked&quot; 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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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&#39;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&#39;t throw an exception. In case the connection breaks, the messages</span>
<span class="sd"> are redelivered after reconnect.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the consumer.</span>
<span class="sd"> &quot;&quot;&quot;</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>Pulsar consumer.</p>
</div>
<div id="Consumer.__init__" class="classattr">
<div class="attr function"><a class="headerlink" href="#Consumer.__init__">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this consumer is subscribed to.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the subscription name.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Acknowledge the failure to process a single message.</span>
<span class="sd"> When a message is &quot;negatively acked&quot; 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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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&#39;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&#39;t throw an exception. In case the connection breaks, the messages</span>
<span class="sd"> are redelivered after reconnect.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the consumer.</span>
<span class="sd"> &quot;&quot;&quot;</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>
</section>
<section id="Reader">
<div class="attr class">
<a class="headerlink" href="#Reader">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Pulsar topic reader.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this reader is reading from.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Check if there is any message available to read from the current position.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the reader.</span>
<span class="sd"> &quot;&quot;&quot;</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>Pulsar topic reader.</p>
</div>
<div id="Reader.__init__" class="classattr">
<div class="attr function"><a class="headerlink" href="#Reader.__init__">#&nbsp;&nbsp</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the topic this reader is reading from.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;timeout_millis&#39;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Check if there is any message available to read from the current position.</span>
<span class="sd"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Close the reader.</span>
<span class="sd"> &quot;&quot;&quot;</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>
</section>
<section id="CryptoKeyReader">
<div class="attr class">
<a class="headerlink" href="#CryptoKeyReader">#&nbsp;&nbsp</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">&quot;&quot;&quot;</span>
<span class="sd"> Default crypto key reader implementation</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;public_key_path&#39;</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">&#39;private_key_path&#39;</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__">#&nbsp;&nbsp</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;public_key_path&#39;</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">&#39;private_key_path&#39;</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>