Skip to content

Commit 86d9d9e

Browse files
authored
Merge pull request #5 from digitalfortress-dev/feat/allow-publish-lazy-message-without-subscribe
feat: allow to publish lazy message without subscribe
2 parents a2bc339 + adf410a commit 86d9d9e

8 files changed

Lines changed: 165 additions & 20 deletions

File tree

README.md

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,84 @@ pip install sqs-client
2020

2121
## Example
2222

23+
#### Subscribe
2324

2425
```python
2526
from sqs_client.client import SQSClient
2627

2728
sqs_client = SQSClient()
2829

2930

30-
# Subscribe to an SQS
31+
# Subscribe to a SQS
3132
@sqs_client.task(
3233
queue_name="sqs-queue-name",
33-
lazy=True,
3434
wait_time_seconds=0,
3535
visibility_timeout=300,
3636
)
3737
def test_task(message):
3838
print("test_task received:", message)
39+
```
40+
41+
#### Publish
42+
```python
43+
from sqs_client.client import SQSClient
44+
from sqs_client.publisher import Publisher
45+
46+
sqs_client = SQSClient()
47+
48+
sqs_client.publish(
49+
queue_name="sqs-queue-name",
50+
message="test message",
51+
)
52+
53+
# or
54+
55+
publisher = Publisher(
56+
sqs_client=sqs_client,
57+
queue_name="sqs-queue-name",
58+
)
59+
```
60+
61+
### Lazy mode
62+
63+
Faster to subscribe and publish a message to SQS
64+
65+
```python
66+
from sqs_client.client import SQSClient
67+
68+
sqs_client = SQSClient()
69+
70+
71+
# Subscribe to a SQS
72+
@sqs_client.task(
73+
queue_name="sqs-queue-name",
74+
lazy=True,
75+
wait_time_seconds=0,
76+
visibility_timeout=300,
77+
)
78+
def test_task(message, abc):
79+
print("test_task received message:", message)
80+
print("test_task received abc:", abc)
3981

4082

4183
# Publish a message
42-
test_task.trigger("Test message")
84+
test_task.trigger("Test message", abc=1)
85+
```
86+
87+
Publish a lazy mode message without subscribe
88+
89+
```python
90+
from sqs_client.client import SQSClient
91+
from sqs_client.publisher import Publisher
92+
93+
sqs_client = SQSClient()
94+
95+
publisher = Publisher(
96+
sqs_client=sqs_client,
97+
queue_name="sqs-queue-name",
98+
)
99+
100+
publisher.publish_lazy("Test lazy message", abc=1)
43101
```
44102

45103
## License

examples/lazy_mode.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from sqs_client.client import SQSClient
2+
3+
sqs_client = SQSClient()
4+
5+
6+
# Subscribe to a SQS
7+
@sqs_client.task(
8+
queue_name="sqs-queue-name",
9+
lazy=True,
10+
wait_time_seconds=0,
11+
visibility_timeout=300,
12+
)
13+
def test_task(message, abc):
14+
print("test_task received message:", message)
15+
print("test_task received abc:", abc)
16+
17+
18+
# Publish a message
19+
test_task.trigger("Test message", abc=1)

examples/publish.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from sqs_client.client import SQSClient
2+
from sqs_client.publisher import Publisher
3+
4+
sqs_client = SQSClient()
5+
6+
sqs_client.publish(
7+
queue_name="sqs-queue-name",
8+
message="test message",
9+
)
10+
11+
# or
12+
13+
publisher = Publisher(
14+
sqs_client=sqs_client,
15+
queue_name="sqs-queue-name",
16+
)
17+
18+
publisher.publish("test message")
19+
20+
# publish lazy mode message
21+
publisher.publish_lazy("test lazy message", abc=1)
Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,8 @@
66
# Subscribe to a SQS
77
@sqs_client.task(
88
queue_name="sqs-queue-name",
9-
lazy=True,
109
wait_time_seconds=0,
1110
visibility_timeout=300,
1211
)
1312
def test_task(message):
1413
print("test_task received:", message)
15-
16-
17-
# Publish a message
18-
test_task.trigger("Test message")

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "sqs-client"
3-
version = "0.0.4"
3+
version = "0.1.0"
44
authors = [
55
{name="Digital Fortress", email="hai.huynh@digitalfortress.dev" },
66
]

sqs_client/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def publish(
188188
This function allows you to publish a message to an SQS queue.
189189
190190
Args:
191-
queue_name: (string) The name of the SQS queue you want to receives messages.
191+
queue_name: (string) The name of the SQS queue you want to receive messages.
192192
message: (string) The message content to be sent.
193193
delay_seconds: (integer) The length of time, in seconds, for which to delay a specific message.
194194
Valid values: 0 to 900. Default: 0

sqs_client/publisher.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import json
2+
3+
4+
class Publisher:
5+
"""
6+
This class represents a publisher to send messages to an SQS queue
7+
"""
8+
9+
def __init__(
10+
self,
11+
sqs_client,
12+
queue_name,
13+
delay_seconds=0,
14+
):
15+
"""
16+
Initializes the Publisher class.
17+
18+
Args:
19+
sqs_client: (SQSClient) The SQSClient of task.
20+
queue_name: (string) The name of the SQS queue you want to send and receive messages.
21+
delay_seconds: (integer) The length of time, in seconds, for which to delay a specific message.
22+
Valid values: 0 to 900. Default: 0
23+
"""
24+
self._sqs_client = sqs_client
25+
self._queue_name = queue_name
26+
self._delay_seconds = delay_seconds
27+
28+
def publish(self, message):
29+
"""
30+
This function allows you to publish a message to an SQS queue.
31+
32+
Args:
33+
message: (string) The message content to be sent.
34+
"""
35+
self._sqs_client.publish(
36+
queue_name=self._queue_name,
37+
delay_seconds=self._delay_seconds,
38+
message=message,
39+
)
40+
41+
def publish_lazy(self, *args, **kwargs):
42+
"""
43+
This function allows you to publish a message in lazy mode.
44+
"""
45+
self._sqs_client.publish(
46+
queue_name=self._queue_name,
47+
delay_seconds=self._delay_seconds,
48+
message=json.dumps(
49+
{
50+
"args": args,
51+
"kwargs": kwargs,
52+
}
53+
),
54+
)

sqs_client/task.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import threading
33
import uuid
44

5+
from sqs_client.publisher import Publisher
6+
57

68
class Task:
79
"""
@@ -49,6 +51,11 @@ def __init__(
4951
self._delay_seconds = delay_seconds
5052
self._lazy = lazy
5153
self._thread = self._create_subscribe_thread()
54+
self._publisher = Publisher(
55+
sqs_client=self._sqs_client,
56+
queue_name=self._queue_name,
57+
delay_seconds=self._delay_seconds,
58+
)
5259

5360
def __call__(self, *args, **kwargs):
5461
"""
@@ -119,13 +126,4 @@ def trigger(self, *args, **kwargs):
119126
if not self._lazy:
120127
raise Exception("Trigger function only work on lazy mode")
121128

122-
self._sqs_client.publish(
123-
queue_name=self._queue_name,
124-
delay_seconds=self._delay_seconds,
125-
message=json.dumps(
126-
{
127-
"args": args,
128-
"kwargs": kwargs,
129-
}
130-
),
131-
)
129+
self._publisher.publish_lazy(*args, **kwargs)

0 commit comments

Comments
 (0)