Skip to content

Commit 9f7217f

Browse files
author
Mike Shultz
authored
Merge pull request #1 from ApeWorX/refactor/name
fix: name and other stuff
2 parents e7c3f3a + 3b13ef8 commit 9f7217f

7 files changed

Lines changed: 76 additions & 29 deletions

File tree

.github/workflows/test.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ concurrency:
99
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
1010
cancel-in-progress: true
1111

12+
env:
13+
AWS_DEFAULT_REGION: "us-east-1"
14+
1215
jobs:
1316
linting:
1417
runs-on: ubuntu-latest
@@ -61,7 +64,7 @@ jobs:
6164
strategy:
6265
matrix:
6366
os: [ubuntu-latest, macos-latest] # eventually add `windows-latest`
64-
python-version: ["3.8", "3.9", "3.10", "3.11"]
67+
python-version: ["3.10", "3.11", "3.12"]
6568

6669
steps:
6770
- uses: actions/checkout@v3

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,32 @@ Mostly generic SQS async broker for TaskIQ.
55
## Expiration
66

77
If you set the `sqs_expiry` label to a unix timestamp, the message will be discarded if the worker receives it after that time.
8+
9+
```python
10+
import asyncio
11+
from taskiq_sqs import SQSBroker
12+
13+
broker = SQSBroker("http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/my-queue")
14+
15+
@broker.task
16+
async def add_one(value: int) -> int:
17+
return value + 1
18+
19+
20+
async def main() -> None:
21+
# Never forget to call startup in the beginning.
22+
await broker.startup()
23+
# Send the task to the broker.
24+
task = await add_one.kiq(1)
25+
# Wait for the result. (result backend must be configured)
26+
result = await task.wait_result(timeout=2)
27+
print(f"Task execution took: {result.execution_time} seconds.")
28+
if not result.is_err:
29+
print(f"Returned value: {result.return_value}")
30+
else:
31+
print("Error found while executing task.")
32+
await broker.shutdown()
33+
34+
if __name__ == "__main__":
35+
asyncio.run(main())
36+
```

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ name = "taskiq-sqs"
77
description = "SQS Broker for TaskIQ"
88
urls = {source = "https://github.com/ApeWorx/taskiq-sqs"}
99
readme = "README.md"
10-
requires-python = ">=3.8"
10+
requires-python = ">=3.10"
1111
keywords = ["taskiq", "broker", "aws", "sqs"]
1212
license = {file = "LICENSE"}
1313
classifiers = [
@@ -41,6 +41,7 @@ dev = [
4141
"pytest~=7.4.4",
4242
"requests~=2.31.0",
4343
"setuptools-scm~=8.0.4",
44+
"taskiq>=0.10.3,<1",
4445
"types-requests>=2.31.0.20240106",
4546
]
4647

taskiq_redis/__init__.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

taskiq_sqs/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from taskiq_sqs.broker import SQSBroker
2+
3+
__all__ = ["SQSBroker"]
Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import asyncio
22
import logging
33
from datetime import datetime, timezone
4-
from typing import (
5-
AsyncGenerator,
6-
Callable,
7-
Optional,
8-
Union,
9-
)
4+
from typing import AsyncGenerator, Callable, Optional, Union
105

116
import boto3
12-
from ape.logging import logger
137
from asyncer import asyncify
148
from mypy_boto3_sqs.service_resource import Queue
159
from taskiq import AsyncBroker
@@ -18,7 +12,10 @@
1812
from taskiq.message import BrokerMessage
1913

2014
logger = logging.getLogger(__name__)
21-
stamp = lambda: int(datetime.now(tz=timezone.utc).timestamp())
15+
16+
17+
def stamp() -> int:
18+
return int(datetime.now(tz=timezone.utc).timestamp())
2219

2320

2421
class SQSBroker(AsyncBroker):
@@ -39,7 +36,9 @@ async def _get_queue(self) -> Queue:
3936
queue_name = self.sqs_queue_url.split("/")[-1]
4037

4138
if not self._sqs_queue:
42-
self._sqs_queue = await asyncify(self._sqs.get_queue_by_name)(QueueName=queue_name)
39+
self._sqs_queue = await asyncify(self._sqs.get_queue_by_name)(
40+
QueueName=queue_name
41+
)
4342

4443
if not self._sqs_queue:
4544
raise Exception("SQS Queue not found")
@@ -63,18 +62,16 @@ async def kick(
6362
"""
6463
queue = await self._get_queue()
6564
# Must be explicitly set as a label to a unix timestamp
66-
expiry = message.labels.pop("sqs_expiry", None)
67-
68-
# SQS structured message attributes
69-
message_attributes = dict()
70-
if expiry:
71-
message_attributes["expiry"] = {
72-
"StringValue": str(expiry),
73-
"DataType": "Number",
74-
}
65+
expiry = message.labels.pop("sqs_expiry", 0)
7566

7667
await asyncify(queue.send_message)(
77-
MessageAttributes=message_attributes,
68+
# SQS structured message attributes
69+
MessageAttributes={
70+
"expiry": {
71+
"StringValue": str(expiry),
72+
"DataType": "Number",
73+
}
74+
},
7875
MessageBody=message.message.decode("utf-8"),
7976
MessageGroupId=message.task_name,
8077
)
@@ -102,14 +99,20 @@ async def listen(self) -> AsyncGenerator[Union[bytes, AckableMessage], None]:
10299
while True:
103100
last_had_message = False
104101

105-
for message in await asyncify(queue.receive_messages)():
102+
for message in await asyncify(queue.receive_messages)(
103+
MessageAttributeNames=[".*"]
104+
):
106105
try:
107106
if message.message_attributes:
108107
# if expiry was set as a message attribute, respect it
109-
if expiry := message.message_attributes.get("expiry"):
110-
diff = stamp() - expiry
111-
if diff > 0:
112-
logger.debug(f"Message expired {diff} seconds ago. Skipping.")
108+
if expiry_typed := message.message_attributes.get("expiry"):
109+
expiry = int(expiry_typed.get("StringValue", 0))
110+
now = stamp()
111+
if 0 < expiry < now:
112+
logger.warn(
113+
f"Message expired {now - expiry} seconds ago. Skipping."
114+
)
115+
await asyncify(message.delete)()
113116
continue
114117
except TypeError:
115118
# Ignore weird expiries. Not critical.

tests/test_broker.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from taskiq_sqs import SQSBroker
2+
3+
4+
def test_init():
5+
broker = SQSBroker("https://sqs.us-west-2.amazonaws.com/123456789012/queue-name")
6+
assert (
7+
broker.sqs_queue_url
8+
== "https://sqs.us-west-2.amazonaws.com/123456789012/queue-name"
9+
)
10+
assert broker._sqs is not None
11+
assert broker._sqs_queue is None

0 commit comments

Comments
 (0)