Skip to content

Commit 997e70d

Browse files
authored
Merge pull request #60 from php-enqueue/sqs-transport
Amazon SQS Transport
2 parents e63b949 + 5d8171d commit 997e70d

39 files changed

+3540
-3
lines changed

README.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@ Features:
99

1010
* [JMS](https://docs.oracle.com/javaee/7/api/javax/jms/package-summary.html) like transport [abstraction](https://github.com/php-enqueue/psr-queue).
1111
* Feature rich.
12-
* Supports [AMQP](docs/transport/amqp.md) (RabbitMQ, ActiveMQ and others), [STOMP](docs/transport/stomp.md) (RabbitMQ, ActiveMQ and others), [Redis](docs/transport/redis.md), [Doctrine DBAL](docs/transport/dbal.md), [Filesystem](docs/transport/filesystem.md), [Null](docs/transport/null.md) transports.
12+
* Supports transports:
13+
- [AMQP](docs/transport/amqp.md) (RabbitMQ, ActiveMQ and others),
14+
- [STOMP](docs/transport/stomp.md)
15+
- [Amazon SQS](docs/transport/sqs.md)
16+
- [Redis](docs/transport/redis.md)
17+
- [Doctrine DBAL](docs/transport/dbal.md)
18+
- [Filesystem](docs/transport/filesystem.md)
19+
- [Null](docs/transport/null.md).
1320
* Generic purpose abstraction level (the transport level).
1421
* "Opinionated" easy to use abstraction level (the client level).
1522
* [Message bus](http://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBus.html) support.

bin/dev

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
set -x
44
set -e
55

6-
while getopts "bustefc" OPTION; do
6+
while getopts "bustefcd" OPTION; do
77
case $OPTION in
88
b)
99
COMPOSE_PROJECT_NAME=mqdev docker-compose build
@@ -27,6 +27,8 @@ while getopts "bustefc" OPTION; do
2727
COMPOSE_PROJECT_NAME=mqdev docker-compose run -e CHANGELOG_GITHUB_TOKEN=${CHANGELOG_GITHUB_TOKEN:-""} --workdir="/mqdev" --rm generate-changelog github_changelog_generator --future-release "$2" --simple-list
2828
;;
2929

30+
d) COMPOSE_PROJECT_NAME=mqdev docker-compose run --workdir="/mqdev" --rm dev php pkg/enqueue-bundle/Tests/Functional/app/console.php config:dump-reference enqueue
31+
;;
3032
\?)
3133
echo "Invalid option: -$OPTARG" >&2
3234
exit 1

bin/subtree-split

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ remote fs git@github.com:php-enqueue/fs.git
5151
remote redis git@github.com:php-enqueue/redis.git
5252
remote dbal git@github.com:php-enqueue/dbal.git
5353
remote null git@github.com:php-enqueue/null.git
54+
remote sqs git@github.com:php-enqueue/sqs.git
5455
remote enqueue-bundle git@github.com:php-enqueue/enqueue-bundle.git
5556
remote job-queue git@github.com:php-enqueue/job-queue.git
5657
remote test git@github.com:php-enqueue/test.git
@@ -63,6 +64,7 @@ split 'pkg/fs' fs
6364
split 'pkg/redis' redis
6465
split 'pkg/dbal' dbal
6566
split 'pkg/null' null
67+
split 'pkg/sqs' sqs
6668
split 'pkg/enqueue-bundle' enqueue-bundle
6769
split 'pkg/job-queue' job-queue
6870
split 'pkg/test' test

composer.json

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"enqueue/fs": "*@dev",
1313
"enqueue/null": "*@dev",
1414
"enqueue/dbal": "*@dev",
15+
"enqueue/sqs": "*@dev",
1516
"enqueue/enqueue-bundle": "*@dev",
1617
"enqueue/job-queue": "*@dev",
1718
"enqueue/test": "*@dev",
@@ -72,6 +73,10 @@
7273
{
7374
"type": "path",
7475
"url": "pkg/dbal"
76+
},
77+
{
78+
"type": "path",
79+
"url": "pkg/sqs"
7580
}
7681
]
7782
}

docker-compose.yml

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ services:
2424
- SYMFONY__DB__PASSWORD=rootpass
2525
- SYMFONY__REDIS__HOST=redis
2626
- SYMFONY__REDIS__PORT=6379
27+
- AWS__SQS__KEY=$ENQUEUE_AWS__SQS__KEY
28+
- AWS__SQS__SECRET=$ENQUEUE_AWS__SQS__SECRET
29+
- AWS__SQS__REGION=$ENQUEUE_AWS__SQS__REGION
2730

2831
rabbitmq:
2932
image: enqueue/rabbitmq:latest

docs/bundle/config_reference.md

+10
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ enqueue:
130130
# How often query for new messages.
131131
polling_interval: 1000
132132
lazy: true
133+
sqs:
134+
key: null
135+
secret: null
136+
token: null
137+
region: ~ # Required
138+
retries: 3
139+
version: '2012-11-05'
140+
141+
# the connection will be performed as later as possible, if the option set to true
142+
lazy: true
133143
client:
134144
traceable_producer: false
135145
prefix: enqueue

docs/index.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* [Quick tour](quick_tour.md)
44
* Transports
55
- [Amqp (RabbitMQ, ActiveMQ)](transport/amqp.md)
6-
- [Stomp (RabbitMQ, ActiveMQ)](transport/stomp.md)
6+
- [Amazon SQS](transport/sqs.md)
7+
- [Stomp](transport/stomp.md)
78
- [Redis](transport/redis.md)
89
- [Doctrine DBAL](transport/dbal.md)
910
- [Filesystem](transport/filesystem.md)

docs/transport/sqs.md

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Amazon SQS transport
2+
3+
A transport for [Amazon SQS](https://aws.amazon.com/sqs/) broker.
4+
It uses internally official [aws sdk library](https://packagist.org/packages/aws/aws-sdk-php)
5+
6+
* [Installation](#installation)
7+
* [Create context](#create-context)
8+
* [Declare queue](#decalre-queue)
9+
* [Send message to queue](#send-message-to-queue)
10+
* [Consume message](#consume-message)
11+
* [Purge queue messages](#purge-queue-messages)
12+
13+
## Installation
14+
15+
```bash
16+
$ composer require enqueue/sqs
17+
```
18+
19+
## Create context
20+
21+
```php
22+
<?php
23+
use Enqueue\Sqs\SqsConnectionFactory;
24+
25+
$connectionFactory = new SqsConnectionFactory([
26+
'key' => 'aKey',
27+
'secret' => 'aSecret',
28+
'region' => 'aRegion',
29+
]);
30+
31+
$psrContext = $connectionFactory->createContext();
32+
```
33+
34+
## Declare queue.
35+
36+
Declare queue operation creates a queue on a broker side.
37+
38+
```php
39+
<?php
40+
/** @var \Enqueue\Sqs\SqsContext $psrContext */
41+
42+
$fooQueue = $psrContext->createQueue('foo');
43+
$psrContext->declareQueue($fooQueue);
44+
45+
// to remove queue use deleteQueue method
46+
//$psrContext->deleteQueue($fooQueue);
47+
```
48+
49+
## Send message to queue
50+
51+
```php
52+
<?php
53+
/** @var \Enqueue\Sqs\SqsContext $psrContext */
54+
55+
$fooQueue = $psrContext->createQueue('foo');
56+
$message = $psrContext->createMessage('Hello world!');
57+
58+
$psrContext->createProducer()->send($fooQueue, $message);
59+
```
60+
61+
## Consume message:
62+
63+
```php
64+
<?php
65+
/** @var \Enqueue\Sqs\SqsContext $psrContext */
66+
67+
$fooQueue = $psrContext->createQueue('foo');
68+
$consumer = $psrContext->createConsumer($fooQueue);
69+
70+
$message = $consumer->receive();
71+
72+
// process a message
73+
74+
$consumer->acknowledge($message);
75+
// $consumer->reject($message);
76+
```
77+
78+
## Purge queue messages:
79+
80+
```php
81+
<?php
82+
/** @var \Enqueue\Sqs\SqsContext $psrContext */
83+
84+
$fooQueue = $psrContext->createQueue('foo');
85+
86+
$psrContext->purge($fooQueue);
87+
```
88+
89+
[back to index](../index.md)

phpunit.xml.dist

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
<directory>pkg/null/Tests</directory>
4646
</testsuite>
4747

48+
<testsuite name="sqs transport">
49+
<directory>pkg/sqs/Tests</directory>
50+
</testsuite>
51+
4852
<testsuite name="enqueue-bundle">
4953
<directory>pkg/enqueue-bundle/Tests</directory>
5054
</testsuite>

pkg/enqueue-bundle/EnqueueBundle.php

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Enqueue\Fs\Symfony\FsTransportFactory;
1818
use Enqueue\Redis\RedisContext;
1919
use Enqueue\Redis\Symfony\RedisTransportFactory;
20+
use Enqueue\Sqs\SqsContext;
21+
use Enqueue\Sqs\Symfony\SqsTransportFactory;
2022
use Enqueue\Stomp\StompContext;
2123
use Enqueue\Stomp\Symfony\RabbitMqStompTransportFactory;
2224
use Enqueue\Stomp\Symfony\StompTransportFactory;
@@ -64,5 +66,9 @@ public function build(ContainerBuilder $container)
6466
if (class_exists(DbalContext::class)) {
6567
$extension->addTransportFactory(new DbalTransportFactory());
6668
}
69+
70+
if (class_exists(SqsContext::class)) {
71+
$extension->addTransportFactory(new SqsTransportFactory());
72+
}
6773
}
6874
}

pkg/enqueue-bundle/Tests/Functional/UseCasesTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ public function provideEnqueueConfigs()
8686
]
8787
]
8888
]],
89+
['sqs' => [
90+
'transport' => [
91+
'default' => 'sqs',
92+
'sqs' => [
93+
'key' => getenv('AWS__SQS__KEY'),
94+
'secret' => getenv('AWS__SQS__SECRET'),
95+
'region' => getenv('AWS__SQS__REGION'),
96+
]
97+
]
98+
]],
8999
];
90100
}
91101

pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Enqueue\Dbal\Symfony\DbalTransportFactory;
1515
use Enqueue\Fs\Symfony\FsTransportFactory;
1616
use Enqueue\Redis\Symfony\RedisTransportFactory;
17+
use Enqueue\Sqs\Symfony\SqsTransportFactory;
1718
use Enqueue\Stomp\Symfony\RabbitMqStompTransportFactory;
1819
use Enqueue\Stomp\Symfony\StompTransportFactory;
1920
use Enqueue\Symfony\DefaultTransportFactory;
@@ -194,6 +195,23 @@ public function testShouldRegisterDbalTransportFactory()
194195
$bundle->build($container);
195196
}
196197

198+
public function testShouldRegisterSqsTransportFactory()
199+
{
200+
$extensionMock = $this->createEnqueueExtensionMock();
201+
202+
$container = new ContainerBuilder();
203+
$container->registerExtension($extensionMock);
204+
205+
$extensionMock
206+
->expects($this->at(9))
207+
->method('addTransportFactory')
208+
->with($this->isInstanceOf(SqsTransportFactory::class))
209+
;
210+
211+
$bundle = new EnqueueBundle();
212+
$bundle->build($container);
213+
}
214+
197215
/**
198216
* @return \PHPUnit_Framework_MockObject_MockObject|EnqueueExtension
199217
*/

pkg/sqs/.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*~
2+
/composer.lock
3+
/composer.phar
4+
/phpunit.xml
5+
/vendor/
6+
/.idea/

pkg/sqs/.travis.yml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
sudo: false
2+
3+
git:
4+
depth: 1
5+
6+
language: php
7+
8+
php:
9+
- '5.6'
10+
- '7.0'
11+
12+
cache:
13+
directories:
14+
- $HOME/.composer/cache
15+
16+
install:
17+
- composer self-update
18+
- composer install --prefer-source
19+
20+
script:
21+
- vendor/bin/phpunit --exclude-group=functional

0 commit comments

Comments
 (0)