mirror of https://github.com/dapr/docs.git
Merge pull request #4485 from hhunter-ms/issue_4424
add python to streaming subscriptions
This commit is contained in:
commit
ddcc50ed74
|
@ -203,7 +203,112 @@ As messages are sent to the given message handler code, there is no concept of r
|
||||||
|
|
||||||
The example below shows the different ways to stream subscribe to a topic.
|
The example below shows the different ways to stream subscribe to a topic.
|
||||||
|
|
||||||
{{< tabs Go>}}
|
{{< tabs Python Go >}}
|
||||||
|
|
||||||
|
{{% codetab %}}
|
||||||
|
|
||||||
|
You can use the `subscribe` method, which returns a `Subscription` object and allows you to pull messages from the stream by calling the `next_message` method. This runs in and may block the main thread while waiting for messages.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time
|
||||||
|
|
||||||
|
from dapr.clients import DaprClient
|
||||||
|
from dapr.clients.grpc.subscription import StreamInactiveError
|
||||||
|
|
||||||
|
counter = 0
|
||||||
|
|
||||||
|
|
||||||
|
def process_message(message):
|
||||||
|
global counter
|
||||||
|
counter += 1
|
||||||
|
# Process the message here
|
||||||
|
print(f'Processing message: {message.data()} from {message.topic()}...')
|
||||||
|
return 'success'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
with DaprClient() as client:
|
||||||
|
global counter
|
||||||
|
|
||||||
|
subscription = client.subscribe(
|
||||||
|
pubsub_name='pubsub', topic='orders', dead_letter_topic='orders_dead'
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
while counter < 5:
|
||||||
|
try:
|
||||||
|
message = subscription.next_message()
|
||||||
|
|
||||||
|
except StreamInactiveError as e:
|
||||||
|
print('Stream is inactive. Retrying...')
|
||||||
|
time.sleep(1)
|
||||||
|
continue
|
||||||
|
if message is None:
|
||||||
|
print('No message received within timeout period.')
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Process the message
|
||||||
|
response_status = process_message(message)
|
||||||
|
|
||||||
|
if response_status == 'success':
|
||||||
|
subscription.respond_success(message)
|
||||||
|
elif response_status == 'retry':
|
||||||
|
subscription.respond_retry(message)
|
||||||
|
elif response_status == 'drop':
|
||||||
|
subscription.respond_drop(message)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
print("Closing subscription...")
|
||||||
|
subscription.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use the `subscribe_with_handler` method, which accepts a callback function executed for each message received from the stream. This runs in a separate thread, so it doesn't block the main thread.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time
|
||||||
|
|
||||||
|
from dapr.clients import DaprClient
|
||||||
|
from dapr.clients.grpc._response import TopicEventResponse
|
||||||
|
|
||||||
|
counter = 0
|
||||||
|
|
||||||
|
|
||||||
|
def process_message(message):
|
||||||
|
# Process the message here
|
||||||
|
global counter
|
||||||
|
counter += 1
|
||||||
|
print(f'Processing message: {message.data()} from {message.topic()}...')
|
||||||
|
return TopicEventResponse('success')
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
with (DaprClient() as client):
|
||||||
|
# This will start a new thread that will listen for messages
|
||||||
|
# and process them in the `process_message` function
|
||||||
|
close_fn = client.subscribe_with_handler(
|
||||||
|
pubsub_name='pubsub', topic='orders', handler_fn=process_message,
|
||||||
|
dead_letter_topic='orders_dead'
|
||||||
|
)
|
||||||
|
|
||||||
|
while counter < 5:
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
print("Closing subscription...")
|
||||||
|
close_fn()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
[Learn more about streaming subscriptions using the Python SDK client.]({{< ref "python-client.md#streaming-message-subscription" >}})
|
||||||
|
|
||||||
|
{{% /codetab %}}
|
||||||
|
|
||||||
{{% codetab %}}
|
{{% codetab %}}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue