├── src
├── NotImplementedException.php
├── Connectors
│ └── MnsConnector.php
├── Jobs
│ └── MnsJob.php
├── MnsQueue.php
└── MnsAdapter.php
├── .styleci.yml
├── lib
├── AliyunMNS
│ ├── Exception
│ │ ├── MalformedXMLException.php
│ │ ├── QueueNotExistException.php
│ │ ├── TopicNotExistException.php
│ │ ├── InvalidArgumentException.php
│ │ ├── MessageNotExistException.php
│ │ ├── QueueAlreadyExistException.php
│ │ ├── ReceiptHandleErrorException.php
│ │ ├── SubscriptionNotExistException.php
│ │ ├── TopicAlreadyExistException.php
│ │ ├── SubscriptionAlreadyExistException.php
│ │ ├── BatchSendFailException.php
│ │ ├── BatchDeleteFailException.php
│ │ └── MnsException.php
│ ├── Responses
│ │ ├── BaseResponse.php
│ │ ├── MnsPromise.php
│ │ ├── DeleteQueueResponse.php
│ │ ├── DeleteTopicResponse.php
│ │ ├── UnsubscribeResponse.php
│ │ ├── SetQueueAttributeResponse.php
│ │ ├── SetSubscriptionAttributeResponse.php
│ │ ├── SetTopicAttributeResponse.php
│ │ ├── SubscribeResponse.php
│ │ ├── CreateQueueResponse.php
│ │ ├── CreateTopicResponse.php
│ │ ├── DeleteMessageResponse.php
│ │ ├── GetQueueAttributeResponse.php
│ │ ├── GetTopicAttributeResponse.php
│ │ ├── GetSubscriptionAttributeResponse.php
│ │ ├── SendMessageResponse.php
│ │ ├── PublishMessageResponse.php
│ │ ├── PeekMessageResponse.php
│ │ ├── ReceiveMessageResponse.php
│ │ ├── BatchPeekMessageResponse.php
│ │ ├── BatchReceiveMessageResponse.php
│ │ ├── ListQueueResponse.php
│ │ ├── ChangeMessageVisibilityResponse.php
│ │ ├── BatchDeleteMessageResponse.php
│ │ ├── ListTopicResponse.php
│ │ ├── ListSubscriptionResponse.php
│ │ └── BatchSendMessageResponse.php
│ ├── Requests
│ │ ├── GetQueueAttributeRequest.php
│ │ ├── GetTopicAttributeRequest.php
│ │ ├── PeekMessageRequest.php
│ │ ├── DeleteQueueRequest.php
│ │ ├── DeleteTopicRequest.php
│ │ ├── UnsubscribeRequest.php
│ │ ├── GetSubscriptionAttributeRequest.php
│ │ ├── DeleteMessageRequest.php
│ │ ├── BatchPeekMessageRequest.php
│ │ ├── ReceiveMessageRequest.php
│ │ ├── SubscribeRequest.php
│ │ ├── ChangeMessageVisibilityRequest.php
│ │ ├── PublishMessageRequest.php
│ │ ├── SetSubscriptionAttributeRequest.php
│ │ ├── CreateQueueRequest.php
│ │ ├── CreateTopicRequest.php
│ │ ├── BatchDeleteMessageRequest.php
│ │ ├── SetQueueAttributeRequest.php
│ │ ├── SetTopicAttributeRequest.php
│ │ ├── BatchReceiveMessageRequest.php
│ │ ├── BaseRequest.php
│ │ ├── SendMessageRequest.php
│ │ ├── ListQueueRequest.php
│ │ ├── ListTopicRequest.php
│ │ ├── BatchSendMessageRequest.php
│ │ └── ListSubscriptionRequest.php
│ ├── Traits
│ │ ├── MessagePropertiesForPublish.php
│ │ ├── MessageIdAndMD5.php
│ │ ├── MessagePropertiesForReceive.php
│ │ ├── MessagePropertiesForSend.php
│ │ └── MessagePropertiesForPeek.php
│ ├── AsyncCallback.php
│ ├── Model
│ │ ├── SendMessageRequestItem.php
│ │ ├── UpdateSubscriptionAttributes.php
│ │ ├── DeleteMessageErrorItem.php
│ │ ├── SendMessageResponseItem.php
│ │ ├── TopicAttributes.php
│ │ ├── Message.php
│ │ └── SubscriptionAttributes.php
│ ├── Config.php
│ ├── Common
│ │ └── XMLParser.php
│ ├── Signature
│ │ └── Signature.php
│ ├── Constants.php
│ ├── Topic.php
│ ├── Http
│ │ └── HttpClient.php
│ └── Client.php
└── README.md
├── .gitignore
├── tests
├── bootstrap.php
├── MnsAdapterTest.php
├── AbstractTestCase.php
├── Jobs
│ └── MnsJobTest.php
└── MnsQueueTest.php
├── .scrutinizer.yml
├── phpunit.xml
├── composer.json
├── LICENSE
├── .php_cs
├── .travis.yml
└── README.md
/src/NotImplementedException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/QueueNotExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/TopicNotExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/InvalidArgumentException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/MessageNotExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/QueueAlreadyExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/ReceiptHandleErrorException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/SubscriptionNotExistException.php:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/TopicAlreadyExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/SubscriptionAlreadyExistException.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Finder
2 | ._.DS_Store
3 | .DS_Store
4 |
5 | # PHPStorm
6 | .idea
7 |
8 | # Composer vendor
9 | /vendor
10 |
11 | # Node Module
12 | /node_modules
13 |
14 | # Configuration file
15 | .env
16 |
17 | # IDE helper
18 | _ide_helper.php
19 | .phpstorm.meta.php
20 |
21 | .composer.lock
22 |
--------------------------------------------------------------------------------
/lib/README.md:
--------------------------------------------------------------------------------
1 | # MNS SDK for PHP
2 | Please refer to http://www.aliyun.com/product/mns and https://docs.aliyun.com/?spm=5176.7393424.9.6.5ki1hv#/pub/mns/api_reference/intro&intro for more API details.
3 |
4 | ## Samples
5 | You must fulfill the AccessId/AccessKey/AccountID in the example before running.
6 |
7 | ## Require
8 | PHP >= 5.5
9 |
10 | ## Usage
11 | Add the require_once("/path_to_sdk/mns-autoloader.php") in your php file when using sdk
12 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/BaseResponse.php:
--------------------------------------------------------------------------------
1 | succeed;
14 | }
15 |
16 | public function getStatusCode()
17 | {
18 | return $this->statusCode;
19 | }
20 | }
21 |
22 | ?>
23 |
--------------------------------------------------------------------------------
/tests/bootstrap.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | require __DIR__ . '/../vendor/autoload.php';
16 |
17 | date_default_timezone_set('Asia/Chongqing');
18 |
--------------------------------------------------------------------------------
/.scrutinizer.yml:
--------------------------------------------------------------------------------
1 | filter:
2 | excluded_paths:
3 | - tests/*
4 | - lib/*
5 |
6 | checks:
7 | php:
8 | code_rating: true
9 | duplication: true
10 |
11 | build:
12 | environment:
13 | php:
14 | version: 5.5.9
15 |
16 | tests:
17 | before:
18 | - command: 'composer require laravel/framework:5.2'
19 | override:
20 | - command: 'phpunit --coverage-clover=some-file'
21 | coverage:
22 | file: 'some-file'
23 | format: 'php-clover'
24 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/GetQueueAttributeRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
15 | }
16 |
17 | public function getQueueName()
18 | {
19 | return $this->queueName;
20 | }
21 |
22 | public function generateBody()
23 | {
24 | return NULL;
25 | }
26 |
27 | public function generateQueryString()
28 | {
29 | return NULL;
30 | }
31 | }
32 | ?>
33 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/GetTopicAttributeRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
15 | }
16 |
17 | public function getTopicName()
18 | {
19 | return $this->topicName;
20 | }
21 |
22 | public function generateBody()
23 | {
24 | return NULL;
25 | }
26 |
27 | public function generateQueryString()
28 | {
29 | return NULL;
30 | }
31 | }
32 | ?>
33 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Traits/MessagePropertiesForPublish.php:
--------------------------------------------------------------------------------
1 | messageBody;
13 | }
14 |
15 | public function setMessageBody($messageBody)
16 | {
17 | $this->messageBody = $messageBody;
18 | }
19 |
20 | public function writeMessagePropertiesForPublishXML(\XMLWriter $xmlWriter)
21 | {
22 | if ($this->messageBody != NULL)
23 | {
24 | $xmlWriter->writeElement(Constants::MESSAGE_BODY, $this->messageBody);
25 | }
26 | }
27 | }
28 |
29 | ?>
30 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Traits/MessageIdAndMD5.php:
--------------------------------------------------------------------------------
1 | messageId;
15 | }
16 |
17 | public function getMessageBodyMD5()
18 | {
19 | return $this->messageBodyMD5;
20 | }
21 |
22 | public function readMessageIdAndMD5XML(\XMLReader $xmlReader)
23 | {
24 | $message = Message::fromXML($xmlReader, TRUE);
25 | $this->messageId = $message->getMessageId();
26 | $this->messageBodyMD5 = $message->getMessageBodyMD5();
27 | }
28 | }
29 |
30 | ?>
31 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/PeekMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
16 | }
17 |
18 | public function getQueueName()
19 | {
20 | return $this->queueName;
21 | }
22 |
23 | public function generateBody()
24 | {
25 | return NULL;
26 | }
27 |
28 | public function generateQueryString()
29 | {
30 | return NULL;
31 | }
32 | }
33 | ?>
34 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/DeleteQueueRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
16 | }
17 |
18 | public function getQueueName()
19 | {
20 | return $this->queueName;
21 | }
22 |
23 | public function generateBody()
24 | {
25 | return NULL;
26 | }
27 |
28 | public function generateQueryString()
29 | {
30 | return NULL;
31 | }
32 | }
33 | ?>
34 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/DeleteTopicRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
16 | }
17 |
18 | public function getTopicName()
19 | {
20 | return $this->topicName;
21 | }
22 |
23 | public function generateBody()
24 | {
25 | return NULL;
26 | }
27 |
28 | public function generateQueryString()
29 | {
30 | return NULL;
31 | }
32 | }
33 | ?>
34 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/AsyncCallback.php:
--------------------------------------------------------------------------------
1 | succeedCallback = $succeedCallback;
15 | $this->failedCallback = $failedCallback;
16 | }
17 |
18 | public function onSucceed(BaseResponse $result)
19 | {
20 | return call_user_func($this->succeedCallback, $result);
21 | }
22 |
23 | public function onFailed(MnsException $e)
24 | {
25 | return call_user_func($this->failedCallback, $e);
26 | }
27 | }
28 |
29 | ?>
30 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/SendMessageRequestItem.php:
--------------------------------------------------------------------------------
1 | messageBody = $messageBody;
15 | $this->delaySeconds = $delaySeconds;
16 | $this->priority = $priority;
17 | }
18 |
19 | public function writeXML(\XMLWriter $xmlWriter, $base64)
20 | {
21 | $xmlWriter->startELement('Message');
22 | $this->writeMessagePropertiesForSendXML($xmlWriter, $base64);
23 | $xmlWriter->endElement();
24 | }
25 | }
26 |
27 | ?>
28 |
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 |
19 | ./tests
20 |
21 |
22 |
23 |
24 | ./src
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/UnsubscribeRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
15 | $this->subscriptionName = $subscriptionName;
16 | }
17 |
18 | public function getTopicName()
19 | {
20 | return $this->topicName;
21 | }
22 |
23 | public function getSubscriptionName()
24 | {
25 | return $this->subscriptionName;
26 | }
27 |
28 | public function generateBody()
29 | {
30 | return NULL;
31 | }
32 |
33 | public function generateQueryString()
34 | {
35 | return NULL;
36 | }
37 | }
38 |
39 | ?>
40 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/GetSubscriptionAttributeRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
15 | $this->subscriptionName = $subscriptionName;
16 | }
17 |
18 | public function getTopicName()
19 | {
20 | return $this->topicName;
21 | }
22 |
23 | public function getSubscriptionName()
24 | {
25 | return $this->subscriptionName;
26 | }
27 |
28 | public function generateBody()
29 | {
30 | return NULL;
31 | }
32 |
33 | public function generateQueryString()
34 | {
35 | return NULL;
36 | }
37 | }
38 |
39 | ?>
40 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/DeleteMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
17 | $this->receiptHandle = $receiptHandle;
18 | }
19 |
20 | public function getQueueName()
21 | {
22 | return $this->queueName;
23 | }
24 |
25 | public function getReceiptHandle()
26 | {
27 | return $this->receiptHandle;
28 | }
29 |
30 | public function generateBody()
31 | {
32 | return NULL;
33 | }
34 |
35 | public function generateQueryString()
36 | {
37 | return http_build_query(array("ReceiptHandle" => $this->receiptHandle));
38 | }
39 | }
40 | ?>
41 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/BatchPeekMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
18 | $this->numOfMessages = $numOfMessages;
19 | }
20 |
21 | public function getQueueName()
22 | {
23 | return $this->queueName;
24 | }
25 |
26 | public function getNumOfMessages()
27 | {
28 | return $this->numOfMessages;
29 | }
30 |
31 | public function generateBody()
32 | {
33 | return NULL;
34 | }
35 |
36 | public function generateQueryString()
37 | {
38 | return http_build_query(array("numOfMessages" => $this->numOfMessages, "peekonly" => "true"));
39 | }
40 | }
41 | ?>
42 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/ReceiveMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
17 | $this->waitSeconds = $waitSeconds;
18 | }
19 |
20 | public function getQueueName()
21 | {
22 | return $this->queueName;
23 | }
24 |
25 | public function getWaitSeconds()
26 | {
27 | return $this->waitSeconds;
28 | }
29 |
30 | public function generateBody()
31 | {
32 | return NULL;
33 | }
34 |
35 | public function generateQueryString()
36 | {
37 | if ($this->waitSeconds != NULL)
38 | {
39 | return http_build_query(array("waitseconds" => $this->waitSeconds));
40 | }
41 | }
42 | }
43 | ?>
44 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/BatchSendFailException.php:
--------------------------------------------------------------------------------
1 | sendMessageResponseItems = array();
22 | }
23 |
24 | public function addSendMessageResponseItem(SendMessageResponseItem $item)
25 | {
26 | $this->sendMessageResponseItems[] = $item;
27 | }
28 |
29 | public function getSendMessageResponseItems()
30 | {
31 | return $this->sendMessageResponseItems;
32 | }
33 | }
34 |
35 | ?>
36 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/BatchDeleteFailException.php:
--------------------------------------------------------------------------------
1 | deleteMessageErrorItems = array();
22 | }
23 |
24 | public function addDeleteMessageErrorItem(DeleteMessageErrorItem $item)
25 | {
26 | $this->deleteMessageErrorItems[] = $item;
27 | }
28 |
29 | public function getDeleteMessageErrorItems()
30 | {
31 | return $this->deleteMessageErrorItems;
32 | }
33 | }
34 |
35 | ?>
36 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Traits/MessagePropertiesForReceive.php:
--------------------------------------------------------------------------------
1 | receiptHandle;
16 | }
17 |
18 | public function readMessagePropertiesForReceiveXML(\XMLReader $xmlReader, $base64)
19 | {
20 | $message = Message::fromXML($xmlReader, $base64);
21 | $this->messageId = $message->getMessageId();
22 | $this->messageBodyMD5 = $message->getMessageBodyMD5();
23 | $this->messageBody = $message->getMessageBody();
24 | $this->enqueueTime = $message->getEnqueueTime();
25 | $this->nextVisibleTime = $message->getNextVisibleTime();
26 | $this->firstDequeueTime = $message->getFirstDequeueTime();
27 | $this->dequeueCount = $message->getDequeueCount();
28 | $this->priority = $message->getPriority();
29 | $this->receiptHandle = $message->getReceiptHandle();
30 | }
31 | }
32 |
33 | ?>
34 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "abe/laravel-mns",
3 | "description": "Laravel queue driver bases on Aliyun Message Service(MNS).",
4 | "keywords": ["aliyun", "laravel", "queue", "mns"],
5 | "license": "MIT",
6 | "authors": [
7 | {
8 | "name": "Abraham Greyson",
9 | "email": "82011220@qq.com"
10 | }
11 | ],
12 | "support": {
13 | "issues": "https://github.com/abrahamgreyson/laravel-mns/issues",
14 | "source": "https://github.com/abrahamgreyson/laravel-mns"
15 | },
16 | "require": {
17 | "guzzlehttp/guzzle": "^6.2",
18 | "guzzlehttp/psr7": "^1.3"
19 | },
20 | "require-dev": {
21 | "phpunit/phpunit": "~4.1",
22 | "mockery/mockery": "~0.9.4"
23 | },
24 | "autoload": {
25 | "psr-4": {
26 | "AliyunMNS\\": "lib/AliyunMNS/",
27 | "LaravelMns\\": "src/"
28 | }
29 | },
30 | "autoload-dev": {
31 | "psr-4": {
32 | "LaravelMns\\Test\\": "tests/"
33 | }
34 | },
35 | "minimum-stability": "dev",
36 | "extra": {
37 | "branch-alias": {
38 | "dev-master": "5.2-dev"
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 chunfang
4 | Copyright (c) 2016 Abraham Greyson <82011220@qq.com>
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/SubscribeRequest.php:
--------------------------------------------------------------------------------
1 | getTopicName() . '/subscriptions/' . $attributes->getSubscriptionName());
15 |
16 | $this->attributes = $attributes;
17 | }
18 |
19 | public function getSubscriptionAttributes()
20 | {
21 | return $this->attributes;
22 | }
23 |
24 | public function generateBody()
25 | {
26 | $xmlWriter = new \XMLWriter;
27 | $xmlWriter->openMemory();
28 | $xmlWriter->startDocument("1.0", "UTF-8");
29 | $xmlWriter->startElementNS(NULL, "Subscription", Constants::MNS_XML_NAMESPACE);
30 | $this->attributes->writeXML($xmlWriter);
31 | $xmlWriter->endElement();
32 | $xmlWriter->endDocument();
33 | return $xmlWriter->outputMemory();
34 | }
35 |
36 | public function generateQueryString()
37 | {
38 | return NULL;
39 | }
40 | }
41 |
42 | ?>
43 |
--------------------------------------------------------------------------------
/src/Connectors/MnsConnector.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Connectors;
16 |
17 | use AliyunMNS\Client as MnsClient;
18 | use Illuminate\Queue\Connectors\ConnectorInterface;
19 | use LaravelMns\MnsAdapter;
20 | use LaravelMns\MnsQueue;
21 |
22 | /**
23 | * Class MnsConnector.
24 | *
25 | * @codeCoverageIgnore
26 | */
27 | class MnsConnector implements ConnectorInterface
28 | {
29 | /**
30 | * Establish a queue connection.
31 | *
32 | * @param array $config
33 | *
34 | * @return \Illuminate\Contracts\Queue\Queue
35 | */
36 | public function connect(array $config)
37 | {
38 | $config = config('queue.connections.mns');
39 |
40 | return new MnsQueue(
41 | new MnsAdapter(
42 | new MnsClient($config['endpoint'], $config['key'], $config['secret']),
43 | $config['queue']
44 | )
45 | );
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/.php_cs:
--------------------------------------------------------------------------------
1 |
9 | @link: https://github.com/abrahamgreyson/laravel-mns
10 |
11 | This source file is subject to the MIT license that is bundled
12 | with this source code in the file LICENSE.
13 | EOF;
14 |
15 | $level = Symfony\CS\FixerInterface::PSR2_LEVEL;
16 |
17 | $fixers = [
18 | 'header_comment',
19 | 'blankline_after_open_tag',
20 | 'multiline_array_trailing_comma',
21 | 'no_blank_lines_after_class_opening',
22 | 'no_empty_lines_after_phpdocs',
23 | 'phpdoc_no_package',
24 | 'phpdoc_var_without_name',
25 | 'remove_lines_between_uses',
26 | 'return',
27 | 'single_array_no_trailing_comma',
28 | 'single_quote',
29 | 'ternary_spaces',
30 | 'trim_array_spaces',
31 | 'unary_operators_spaces',
32 | 'ordered_use',
33 | 'short_array_syntax',
34 | 'whitespacy_lines',
35 | 'spaces_cast'
36 | ];
37 |
38 | Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader($header);
39 |
40 | $finder = Symfony\CS\Finder\DefaultFinder::create()->in(__DIR__)->exclude('lib');
41 |
42 | return Symfony\CS\Config\Config::create()->level($level)->fixers($fixers)->finder($finder);
43 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/ChangeMessageVisibilityRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
18 | $this->receiptHandle = $receiptHandle;
19 | $this->visibilityTimeout = $visibilityTimeout;
20 | }
21 |
22 | public function getQueueName()
23 | {
24 | return $this->queueName;
25 | }
26 |
27 | public function getReceiptHandle()
28 | {
29 | return $this->receiptHandle;
30 | }
31 |
32 | public function getVisibilityTimeout()
33 | {
34 | return $this->visibilityTimeout;
35 | }
36 |
37 | public function generateBody()
38 | {
39 | return NULL;
40 | }
41 |
42 | public function generateQueryString()
43 | {
44 | return http_build_query(array("receiptHandle" => $this->receiptHandle, "visibilityTimeout" => $this->visibilityTimeout));
45 | }
46 | }
47 | ?>
48 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/UpdateSubscriptionAttributes.php:
--------------------------------------------------------------------------------
1 | subscriptionName = $subscriptionName;
20 |
21 | $this->strategy = $strategy;
22 | }
23 |
24 | public function getStrategy()
25 | {
26 | return $this->strategy;
27 | }
28 |
29 | public function setStrategy($strategy)
30 | {
31 | $this->strategy = $strategy;
32 | }
33 |
34 | public function getTopicName()
35 | {
36 | return $this->topicName;
37 | }
38 |
39 | public function setTopicName($topicName)
40 | {
41 | $this->topicName = $topicName;
42 | }
43 |
44 | public function getSubscriptionName()
45 | {
46 | return $this->subscriptionName;
47 | }
48 |
49 | public function writeXML(\XMLWriter $xmlWriter)
50 | {
51 | if ($this->strategy != NULL)
52 | {
53 | $xmlWriter->writeElement(Constants::STRATEGY, $this->strategy);
54 | }
55 | }
56 | }
57 |
58 | ?>
59 |
--------------------------------------------------------------------------------
/tests/MnsAdapterTest.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Test;
16 |
17 | use AliyunMNS\Client;
18 | use LaravelMns\MnsAdapter;
19 | use Mockery as m;
20 |
21 | class MnsAdapterTest extends AbstractTestCase
22 | {
23 | public function setUp()
24 | {
25 | parent::setUp(); // TODO: Change the autogenerated stub
26 | }
27 |
28 | public function tearDown()
29 | {
30 | parent::tearDown(); // TODO: Change the autogenerated stub
31 | }
32 |
33 | public function testSetQueueProperlySetQueueName()
34 | {
35 | $defaultQueueName = 'default';
36 | $mnsClient = m::mock(Client::class)->makePartial();
37 | $mnsClient->shouldReceive('getQueueRef')
38 | ->twice()
39 | ->with(m::anyOf($defaultQueueName, 'anotherName'))
40 | ->andReturn('whatever');
41 | $adapterUnderTest = new MnsAdapter($mnsClient, $defaultQueueName);
42 | $adapterUnderTest->setQueue('anotherName');
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/PublishMessageRequest.php:
--------------------------------------------------------------------------------
1 | topicName = NULL;
19 | $this->messageBody = $messageBody;
20 | }
21 |
22 | public function setTopicName($topicName)
23 | {
24 | $this->topicName = $topicName;
25 | $this->resourcePath = 'topics/' . $topicName . '/messages';
26 | }
27 |
28 | public function getTopicName()
29 | {
30 | return $this->topicName;
31 | }
32 |
33 | public function generateBody()
34 | {
35 | $xmlWriter = new \XMLWriter;
36 | $xmlWriter->openMemory();
37 | $xmlWriter->startDocument("1.0", "UTF-8");
38 | $xmlWriter->startElementNS(NULL, "Message", Constants::MNS_XML_NAMESPACE);
39 | $this->writeMessagePropertiesForPublishXML($xmlWriter);
40 | $xmlWriter->endElement();
41 | $xmlWriter->endDocument();
42 | return $xmlWriter->outputMemory();
43 | }
44 |
45 | public function generateQueryString()
46 | {
47 | return NULL;
48 | }
49 | }
50 | ?>
51 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/SetSubscriptionAttributeRequest.php:
--------------------------------------------------------------------------------
1 | getTopicName() . '/subscriptions/' . $attributes->getSubscriptionName() . '?metaoverride=true');
14 |
15 | if ($attributes == NULL)
16 | {
17 | $attributes = new UpdateSubscriptionAttributes();
18 | }
19 |
20 | $this->attributes = $attributes;
21 | }
22 |
23 | public function getSubscriptionAttributes()
24 | {
25 | return $this->attributes;
26 | }
27 |
28 | public function generateBody()
29 | {
30 | $xmlWriter = new \XMLWriter;
31 | $xmlWriter->openMemory();
32 | $xmlWriter->startDocument("1.0", "UTF-8");
33 | $xmlWriter->startElementNS(NULL, "Subscription", Constants::MNS_XML_NAMESPACE);
34 | $this->attributes->writeXML($xmlWriter);
35 | $xmlWriter->endElement();
36 | $xmlWriter->endDocument();
37 | return $xmlWriter->outputMemory();
38 | }
39 |
40 | public function generateQueryString()
41 | {
42 | return NULL;
43 | }
44 | }
45 |
46 | ?>
47 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Config.php:
--------------------------------------------------------------------------------
1 | maxAttempts = 3;
14 | $this->proxy = NULL;
15 | $this->requestTimeout = 6; // 6 seconds
16 | $this->expectContinue = false;
17 | }
18 |
19 | /*
20 | public function getMaxAttempts()
21 | {
22 | return $this->maxAttempts;
23 | }
24 |
25 | public function setMaxAttempts($maxAttempts)
26 | {
27 | $this->maxAttempts = $maxAttempts;
28 | }
29 | */
30 |
31 | public function getProxy()
32 | {
33 | return $this->proxy;
34 | }
35 |
36 | public function setProxy($proxy)
37 | {
38 | $this->proxy = $proxy;
39 | }
40 |
41 | public function getRequestTimeout()
42 | {
43 | return $this->requestTimeout;
44 | }
45 |
46 | public function setRequestTimeout($requestTimeout)
47 | {
48 | $this->requestTimeout = $requestTimeout;
49 | }
50 |
51 | public function getExpectContinue()
52 | {
53 | return $this->expectContinue;
54 | }
55 |
56 | public function setExpectContinue($expectContinue)
57 | {
58 | $this->expectContinue = $expectContinue;
59 | }
60 | }
61 |
62 | ?>
63 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/MnsPromise.php:
--------------------------------------------------------------------------------
1 | promise = $promise;
18 | $this->response = $response;
19 | }
20 |
21 | public function isCompleted()
22 | {
23 | return $this->promise->getState() != 'pending';
24 | }
25 |
26 | public function getResponse()
27 | {
28 | return $this->response;
29 | }
30 |
31 | public function wait()
32 | {
33 | try {
34 | $res = $this->promise->wait();
35 | if ($res instanceof ResponseInterface)
36 | {
37 | $this->response->parseResponse($res->getStatusCode(), $res->getBody());
38 | }
39 | } catch (TransferException $e) {
40 | $message = $e->getMessage();
41 | if ($e->hasResponse()) {
42 | $message = $e->getResponse()->getBody();
43 | }
44 | $this->response->parseErrorResponse($e->getCode(), $message);
45 | }
46 | return $this->response;
47 | }
48 | }
49 |
50 | ?>
51 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/CreateQueueRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
23 | $this->attributes = $attributes;
24 | }
25 |
26 | public function getQueueName()
27 | {
28 | return $this->queueName;
29 | }
30 |
31 | public function getQueueAttributes()
32 | {
33 | return $this->attributes;
34 | }
35 |
36 | public function generateBody()
37 | {
38 | $xmlWriter = new \XMLWriter;
39 | $xmlWriter->openMemory();
40 | $xmlWriter->startDocument("1.0", "UTF-8");
41 | $xmlWriter->startElementNS(NULL, "Queue", Constants::MNS_XML_NAMESPACE);
42 | $this->attributes->writeXML($xmlWriter);
43 | $xmlWriter->endElement();
44 | $xmlWriter->endDocument();
45 | return $xmlWriter->outputMemory();
46 | }
47 |
48 | public function generateQueryString()
49 | {
50 | return NULL;
51 | }
52 | }
53 | ?>
54 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/CreateTopicRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
23 | $this->attributes = $attributes;
24 | }
25 |
26 | public function getTopicName()
27 | {
28 | return $this->topicName;
29 | }
30 |
31 | public function getTopicAttributes()
32 | {
33 | return $this->attributes;
34 | }
35 |
36 | public function generateBody()
37 | {
38 | $xmlWriter = new \XMLWriter;
39 | $xmlWriter->openMemory();
40 | $xmlWriter->startDocument("1.0", "UTF-8");
41 | $xmlWriter->startElementNS(NULL, "Topic", Constants::MNS_XML_NAMESPACE);
42 | $this->attributes->writeXML($xmlWriter);
43 | $xmlWriter->endElement();
44 | $xmlWriter->endDocument();
45 | return $xmlWriter->outputMemory();
46 | }
47 |
48 | public function generateQueryString()
49 | {
50 | return NULL;
51 | }
52 | }
53 | ?>
54 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/BatchDeleteMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
17 | $this->receiptHandles = $receiptHandles;
18 | }
19 |
20 | public function getQueueName()
21 | {
22 | return $this->queueName;
23 | }
24 |
25 | public function getReceiptHandles()
26 | {
27 | return $this->receiptHandles;
28 | }
29 |
30 | public function generateBody()
31 | {
32 | $xmlWriter = new \XMLWriter;
33 | $xmlWriter->openMemory();
34 | $xmlWriter->startDocument("1.0", "UTF-8");
35 | $xmlWriter->startElementNS(NULL, Constants::RECEIPT_HANDLES, Constants::MNS_XML_NAMESPACE);
36 | foreach ($this->receiptHandles as $receiptHandle)
37 | {
38 | $xmlWriter->writeElement(Constants::RECEIPT_HANDLE, $receiptHandle);
39 | }
40 | $xmlWriter->endElement();
41 | $xmlWriter->endDocument();
42 | return $xmlWriter->outputMemory();
43 | }
44 |
45 | public function generateQueryString()
46 | {
47 | return NULL;
48 | }
49 | }
50 | ?>
51 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/SetQueueAttributeRequest.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
23 | $this->attributes = $attributes;
24 | }
25 |
26 | public function getQueueName()
27 | {
28 | return $this->queueName;
29 | }
30 |
31 | public function getQueueAttributes()
32 | {
33 | return $this->attributes;
34 | }
35 |
36 | public function generateBody()
37 | {
38 | $xmlWriter = new \XMLWriter;
39 | $xmlWriter->openMemory();
40 | $xmlWriter->startDocument("1.0", "UTF-8");
41 | $xmlWriter->startElementNS(NULL, "Queue", Constants::MNS_XML_NAMESPACE);
42 | $this->attributes->writeXML($xmlWriter);
43 | $xmlWriter->endElement();
44 | $xmlWriter->endDocument();
45 | return $xmlWriter->outputMemory();
46 | }
47 |
48 | public function generateQueryString()
49 | {
50 | return NULL;
51 | }
52 | }
53 | ?>
54 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/SetTopicAttributeRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
23 | $this->attributes = $attributes;
24 | }
25 |
26 | public function getTopicName()
27 | {
28 | return $this->topicName;
29 | }
30 |
31 | public function getTopicAttributes()
32 | {
33 | return $this->attributes;
34 | }
35 |
36 | public function generateBody()
37 | {
38 | $xmlWriter = new \XMLWriter;
39 | $xmlWriter->openMemory();
40 | $xmlWriter->startDocument("1.0", "UTF-8");
41 | $xmlWriter->startElementNS(NULL, "Topic", Constants::MNS_XML_NAMESPACE);
42 | $this->attributes->writeXML($xmlWriter);
43 | $xmlWriter->endElement();
44 | $xmlWriter->endDocument();
45 | return $xmlWriter->outputMemory();
46 | }
47 |
48 | public function generateQueryString()
49 | {
50 | return NULL;
51 | }
52 | }
53 | ?>
54 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/BatchReceiveMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = NULL;
18 | $this->numOfMessages = $numOfMessages;
19 | $this->waitSeconds = $waitSeconds;
20 | }
21 |
22 | public function setQueueName($queueName)
23 | {
24 | $this->queueName = $queueName;
25 | $this->resourcePath = 'queues/' . $queueName . '/messages';
26 | }
27 |
28 | public function getQueueName()
29 | {
30 | return $this->queueName;
31 | }
32 |
33 | public function getWaitSeconds()
34 | {
35 | return $this->waitSeconds;
36 | }
37 |
38 | public function getNumOfMessages()
39 | {
40 | return $this->numOfMessages;
41 | }
42 |
43 | public function generateBody()
44 | {
45 | return NULL;
46 | }
47 |
48 | public function generateQueryString()
49 | {
50 | $params = array("numOfMessages" => $this->numOfMessages);
51 | if ($this->waitSeconds != NULL)
52 | {
53 | $params["waitseconds"] = $this->waitSeconds;
54 | }
55 | return http_build_query($params);
56 | }
57 | }
58 | ?>
59 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/DeleteQueueResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
17 | if ($statusCode == 204) {
18 | $this->succeed = TRUE;
19 | } else {
20 | $this->parseErrorResponse($statusCode, $content);
21 | }
22 | }
23 |
24 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
25 | {
26 | $this->succeed = FALSE;
27 | $xmlReader = new \XMLReader();
28 | try {
29 | $xmlReader->XML($content);
30 | $result = XMLParser::parseNormalError($xmlReader);
31 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
32 | } catch (\Exception $e) {
33 | if ($exception != NULL) {
34 | throw $exception;
35 | } elseif($e instanceof MnsException) {
36 | throw $e;
37 | } else {
38 | throw new MnsException($statusCode, $e->getMessage());
39 | }
40 | } catch (\Throwable $t) {
41 | throw new MnsException($statusCode, $t->getMessage());
42 | }
43 | }
44 | }
45 |
46 | ?>
47 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/DeleteTopicResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
17 | if ($statusCode == 204) {
18 | $this->succeed = TRUE;
19 | } else {
20 | $this->parseErrorResponse($statusCode, $content);
21 | }
22 | }
23 |
24 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
25 | {
26 | $this->succeed = FALSE;
27 | $xmlReader = new \XMLReader();
28 | try {
29 | $xmlReader->XML($content);
30 | $result = XMLParser::parseNormalError($xmlReader);
31 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
32 | } catch (\Exception $e) {
33 | if ($exception != NULL) {
34 | throw $exception;
35 | } elseif($e instanceof MnsException) {
36 | throw $e;
37 | } else {
38 | throw new MnsException($statusCode, $e->getMessage());
39 | }
40 | } catch (\Throwable $t) {
41 | throw new MnsException($statusCode, $t->getMessage());
42 | }
43 | }
44 | }
45 |
46 | ?>
47 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/UnsubscribeResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
17 | if ($statusCode == 204)
18 | {
19 | $this->succeed = TRUE;
20 | }
21 | else
22 | {
23 | $this->parseErrorResponse($statusCode, $content);
24 | }
25 | }
26 |
27 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
28 | {
29 | $this->succeed = FALSE;
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $result = XMLParser::parseNormalError($xmlReader);
34 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
35 | } catch (\Exception $e) {
36 | if ($exception != NULL) {
37 | throw $exception;
38 | } elseif($e instanceof MnsException) {
39 | throw $e;
40 | } else {
41 | throw new MnsException($statusCode, $e->getMessage());
42 | }
43 | } catch (\Throwable $t) {
44 | throw new MnsException($statusCode, $t->getMessage());
45 | }
46 | }
47 | }
48 |
49 | ?>
50 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # see http://about.travis-ci.org/docs/user/languages/php/ for more hints.
2 | language: php
3 |
4 | # list any PHP version you want to test against.
5 | php:
6 | # using major version aliases.
7 | # after php 5.5, aliased to a recent version.
8 | - 5.5
9 | - 5.6
10 | - 7.0
11 | - hhvm
12 |
13 | env:
14 | global:
15 | - COMPOSER_DISCARD_CHANGES=true
16 | matrix:
17 | - laravel_version="5.1.*" composer_prefer="--prefer-lowest"
18 | - laravel_version="5.1.*" composer_prefer="--prefer-stable"
19 | - laravel_version="5.1.*" composer_prefer=""
20 | - laravel_version="5.2.*" composer_prefer="--prefer-lowest"
21 | - laravel_version="5.2.*" composer_prefer="--prefer-stable"
22 | - laravel_version="5.2.*" composer_prefer=""
23 | - laravel_version="5.0.*" composer_prefer="--prefer-lowest"
24 | - laravel_version="5.0.*" composer_prefer="--prefer-stable"
25 | - laravel_version="5.0.*" composer_prefer=""
26 |
27 | matrix:
28 | global:
29 | # failures not break entire test suite.
30 | allow_failures:
31 | - php: nightly
32 | - php: hhvm
33 | fast_finish: true
34 |
35 | install:
36 | # speed up package installation process use parallel.
37 | - composer global require hirak/prestissimo
38 | - composer require laravel/framework:$laravel_version
39 | - composer update --prefer-source --no-interaction $composer_prefer
40 |
41 | before_script:
42 | # disable xdebug since it override var_dump() function we rely on to parse object.
43 | - if [ $(phpenv version-name) != "hhvm" ]; then phpenv config-rm xdebug.ini; fi
44 |
45 | script:
46 | - ./vendor/bin/phpunit
47 |
48 | notifications:
49 | email:
50 | on_success: never
51 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/BaseRequest.php:
--------------------------------------------------------------------------------
1 | method = $method;
15 | $this->resourcePath = $resourcePath;
16 | }
17 |
18 | abstract public function generateBody();
19 | abstract public function generateQueryString();
20 |
21 | public function setBody($body)
22 | {
23 | $this->body = $body;
24 | }
25 |
26 | public function getBody()
27 | {
28 | return $this->body;
29 | }
30 |
31 | public function setQueryString($queryString)
32 | {
33 | $this->queryString = $queryString;
34 | }
35 |
36 | public function getQueryString()
37 | {
38 | return $this->queryString;
39 | }
40 |
41 | public function isHeaderSet($header)
42 | {
43 | return isset($this->headers[$header]);
44 | }
45 |
46 | public function getHeaders()
47 | {
48 | return $this->headers;
49 | }
50 |
51 | public function removeHeader($header)
52 | {
53 | if (isset($this->headers[$header]))
54 | {
55 | unset($this->headers[$header]);
56 | }
57 | }
58 |
59 | public function setHeader($header, $value)
60 | {
61 | $this->headers[$header] = $value;
62 | }
63 |
64 | public function getResourcePath()
65 | {
66 | return $this->resourcePath;
67 | }
68 |
69 | public function getMethod()
70 | {
71 | return $this->method;
72 | }
73 | }
74 |
75 | ?>
76 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Traits/MessagePropertiesForSend.php:
--------------------------------------------------------------------------------
1 | messageBody;
15 | }
16 |
17 | public function setMessageBody($messageBody)
18 | {
19 | $this->messageBody = $messageBody;
20 | }
21 |
22 | public function getDelaySeconds()
23 | {
24 | return $this->delaySeconds;
25 | }
26 |
27 | public function setDelaySeconds($delaySeconds)
28 | {
29 | $this->delaySeconds = $delaySeconds;
30 | }
31 |
32 | public function getPriority()
33 | {
34 | return $this->priority;
35 | }
36 |
37 | public function setPriority($priority)
38 | {
39 | $this->priority = $priority;
40 | }
41 |
42 | public function writeMessagePropertiesForSendXML(\XMLWriter $xmlWriter, $base64)
43 | {
44 | if ($this->messageBody != NULL)
45 | {
46 | if ($base64 == TRUE) {
47 | $xmlWriter->writeElement(Constants::MESSAGE_BODY, base64_encode($this->messageBody));
48 | } else {
49 | $xmlWriter->writeElement(Constants::MESSAGE_BODY, $this->messageBody);
50 | }
51 | }
52 | if ($this->delaySeconds != NULL)
53 | {
54 | $xmlWriter->writeElement(Constants::DELAY_SECONDS, $this->delaySeconds);
55 | }
56 | if ($this->priority != NULL)
57 | {
58 | $xmlWriter->writeElement(Constants::PRIORITY, $this->priority);
59 | }
60 | }
61 | }
62 |
63 | ?>
64 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Exception/MnsException.php:
--------------------------------------------------------------------------------
1 | = 500)
17 | {
18 | $mnsErrorCode = "ServerError";
19 | }
20 | else
21 | {
22 | $mnsErrorCode = "ClientError";
23 | }
24 | }
25 | $this->mnsErrorCode = $mnsErrorCode;
26 |
27 | $this->requestId = $requestId;
28 | $this->hostId = $hostId;
29 | }
30 |
31 | public function __toString()
32 | {
33 | $str = "Code: " . $this->getCode() . " Message: " . $this->getMessage();
34 | if ($this->mnsErrorCode != NULL)
35 | {
36 | $str .= " MnsErrorCode: " . $this->mnsErrorCode;
37 | }
38 | if ($this->requestId != NULL)
39 | {
40 | $str .= " RequestId: " . $this->requestId;
41 | }
42 | if ($this->hostId != NULL)
43 | {
44 | $str .= " HostId: " . $this->hostId;
45 | }
46 | return $str;
47 | }
48 |
49 | public function getMnsErrorCode()
50 | {
51 | return $this->mnsErrorCode;
52 | }
53 |
54 | public function getRequestId()
55 | {
56 | return $this->requestId;
57 | }
58 |
59 | public function getHostId()
60 | {
61 | return $this->hostId;
62 | }
63 | }
64 |
65 | ?>
66 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Traits/MessagePropertiesForPeek.php:
--------------------------------------------------------------------------------
1 | messageBody;
22 | }
23 |
24 | public function getEnqueueTime()
25 | {
26 | return $this->enqueueTime;
27 | }
28 |
29 | public function getNextVisibleTime()
30 | {
31 | return $this->nextVisibleTime;
32 | }
33 |
34 | public function getFirstDequeueTime()
35 | {
36 | return $this->firstDequeueTime;
37 | }
38 |
39 | public function getDequeueCount()
40 | {
41 | return $this->dequeueCount;
42 | }
43 |
44 | public function getPriority()
45 | {
46 | return $this->priority;
47 | }
48 |
49 | public function readMessagePropertiesForPeekXML(\XMLReader $xmlReader, $base64)
50 | {
51 | $message = Message::fromXML($xmlReader, $base64);
52 | $this->messageId = $message->getMessageId();
53 | $this->messageBodyMD5 = $message->getMessageBodyMD5();
54 | $this->messageBody = $message->getMessageBody();
55 | $this->enqueueTime = $message->getEnqueueTime();
56 | $this->nextVisibleTime = $message->getNextVisibleTime();
57 | $this->firstDequeueTime = $message->getFirstDequeueTime();
58 | $this->dequeueCount = $message->getDequeueCount();
59 | $this->priority = $message->getPriority();
60 | }
61 | }
62 |
63 | ?>
64 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Common/XMLParser.php:
--------------------------------------------------------------------------------
1 | NULL, 'Message' => NULL, 'RequestId' => NULL, 'HostId' => NULL);
11 | while ($xmlReader->Read())
12 | {
13 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
14 | {
15 | switch ($xmlReader->name) {
16 | case 'Code':
17 | $xmlReader->read();
18 | if ($xmlReader->nodeType == \XMLReader::TEXT)
19 | {
20 | $result['Code'] = $xmlReader->value;
21 | }
22 | break;
23 | case 'Message':
24 | $xmlReader->read();
25 | if ($xmlReader->nodeType == \XMLReader::TEXT)
26 | {
27 | $result['Message'] = $xmlReader->value;
28 | }
29 | break;
30 | case 'RequestId':
31 | $xmlReader->read();
32 | if ($xmlReader->nodeType == \XMLReader::TEXT)
33 | {
34 | $result['RequestId'] = $xmlReader->value;
35 | }
36 | break;
37 | case 'HostId':
38 | $xmlReader->read();
39 | if ($xmlReader->nodeType == \XMLReader::TEXT)
40 | {
41 | $result['HostId'] = $xmlReader->value;
42 | }
43 | break;
44 | }
45 | }
46 | }
47 | return $result;
48 | }
49 | }
50 |
51 | ?>
52 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Signature/Signature.php:
--------------------------------------------------------------------------------
1 | getHeaders();
13 | $contentMd5 = "";
14 | if (isset($headers['Content-MD5']))
15 | {
16 | $contentMd5 = $headers['Content-MD5'];
17 | }
18 | $contentType = "";
19 | if (isset($headers['Content-Type']))
20 | {
21 | $contentType = $headers['Content-Type'];
22 | }
23 | $date = $headers['Date'];
24 | $queryString = $request->getQueryString();
25 | $canonicalizedResource = $request->getResourcePath();
26 | if ($queryString != NULL)
27 | {
28 | $canonicalizedResource .= "?" . $request->getQueryString();
29 | }
30 | if (0 !== strpos($canonicalizedResource, "/"))
31 | {
32 | $canonicalizedResource = "/" . $canonicalizedResource;
33 | }
34 |
35 | $tmpHeaders = array();
36 | foreach ($headers as $key => $value)
37 | {
38 | if (0 === strpos($key, Constants::MNS_HEADER_PREFIX))
39 | {
40 | $tmpHeaders[$key] = $value;
41 | }
42 | }
43 | ksort($tmpHeaders);
44 |
45 | $canonicalizedMNSHeaders = implode("\n", array_map(function ($v, $k) { return $k . ":" . $v; }, $tmpHeaders, array_keys($tmpHeaders)));
46 |
47 | $stringToSign = strtoupper($request->getMethod()) . "\n" . $contentMd5 . "\n" . $contentType . "\n" . $date . "\n" . $canonicalizedMNSHeaders . "\n" . $canonicalizedResource;
48 |
49 | return base64_encode(hash_hmac("sha1", $stringToSign, $accessKey, $raw_output = TRUE));
50 | }
51 | }
52 |
53 | ?>
54 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Laravel-MNS
2 | [](https://travis-ci.org/abrahamgreyson/laravel-mns)
3 | [](https://scrutinizer-ci.com/g/abrahamgreyson/laravel-mns/?branch=master)
4 | [](https://packagist.org/packages/abe/laravel-mns)
5 | [](https://packagist.org/packages/abe/laravel-mns)
6 |
7 | 阿里云消息服务(MNS)的 Laravel 适配,本质上是为 Laravel 的队列增加 MNS 驱动。包含了阿里云 MNS SDK,为了 Laravel 能透明的使用 MNS 而对其作必要的引用。
8 |
9 | > 自 [chefxu/aliyun_mns](https://github.com/chefxu/aliyun_mns) 之上修改而来,鉴于缩进、换行和文件命名等代码风格有所差异,无法发 pr。
10 |
11 | > 阿里云 MNS SDK 不支持 Composer,直接将其包含在版本库中,并注册到 `AliyunMNS` 命名空间下。
12 |
13 |
14 | ## 安装使用
15 |
16 | 通过 Composer 安装:
17 |
18 | ```shell
19 | $ composer require abe/laravel-mns
20 | ```
21 |
22 | 之后在 config/queue.php 中增加 `mns` 配置:
23 |
24 | ```php
25 | 'connections' => [
26 | 'redis' => [
27 | 'driver' => 'redis',
28 | 'connection' => 'default',
29 | 'queue' => 'default',
30 | 'expire' => 60,
31 | ],
32 |
33 | // 新增阿里云 MNS。
34 | 'mns' => [
35 | 'driver' => 'mns',
36 | 'key' => env('MNS_ACCESS_KEY', 'access-key'),
37 | 'secret' => env('MNS_SECRET_KEY', 'secret-key'),
38 | // 外网连接必须启用 https。
39 | 'endpoint' => 'your-endpoint',
40 | 'queue' => env('MNS_DEFAULT_QUEUE', 'default-queue-name'),
41 | ],
42 | ],
43 | ```
44 |
45 | 并且在你常用的 ServiceProvider 中注册队列驱动:
46 |
47 | ```php
48 | Queue::extend('mns', function()
49 | {
50 | return new \LaravelMns\Connectors\MnsConnector();
51 | });
52 | ```
53 |
54 | 正常使用 Laravel Queue 即可:
55 |
56 | [https://laravel.com/docs/5.2/queues](https://laravel.com/docs/5.2/queues)
57 |
58 |
59 | ## 许可
60 |
61 | MIT
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/SendMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = NULL;
23 | $this->messageBody = $messageBody;
24 | $this->delaySeconds = $delaySeconds;
25 | $this->priority = $priority;
26 | $this->base64 = $base64;
27 | }
28 |
29 | public function setBase64($base64)
30 | {
31 | $this->base64 = $base64;
32 | }
33 |
34 | public function isBase64()
35 | {
36 | return ($this->base64 == TRUE);
37 | }
38 |
39 | public function setQueueName($queueName)
40 | {
41 | $this->queueName = $queueName;
42 | $this->resourcePath = 'queues/' . $queueName . '/messages';
43 | }
44 |
45 | public function getQueueName()
46 | {
47 | return $this->queueName;
48 | }
49 |
50 | public function generateBody()
51 | {
52 | $xmlWriter = new \XMLWriter;
53 | $xmlWriter->openMemory();
54 | $xmlWriter->startDocument("1.0", "UTF-8");
55 | $xmlWriter->startElementNS(NULL, "Message", Constants::MNS_XML_NAMESPACE);
56 | $this->writeMessagePropertiesForSendXML($xmlWriter, $this->base64);
57 | $xmlWriter->endElement();
58 | $xmlWriter->endDocument();
59 | return $xmlWriter->outputMemory();
60 | }
61 |
62 | public function generateQueryString()
63 | {
64 | return NULL;
65 | }
66 | }
67 | ?>
68 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/ListQueueRequest.php:
--------------------------------------------------------------------------------
1 | setRetNum($retNum);
17 | $this->setPrefix($prefix);
18 | $this->setMarker($marker);
19 | }
20 |
21 | public function getRetNum()
22 | {
23 | return $this->retNum;
24 | }
25 |
26 | public function setRetNum($retNum)
27 | {
28 | $this->retNum = $retNum;
29 | if ($retNum != NULL)
30 | {
31 | $this->setHeader("x-mns-ret-number", $retNum);
32 | }
33 | else
34 | {
35 | $this->removeHeader("x-mns-ret-number");
36 | }
37 | }
38 |
39 | public function getPrefix()
40 | {
41 | return $this->prefix;
42 | }
43 |
44 | public function setPrefix($prefix)
45 | {
46 | $this->prefis = $prefix;
47 | if ($prefix != NULL)
48 | {
49 | $this->setHeader("x-mns-prefix", $prefix);
50 | }
51 | else
52 | {
53 | $this->removeHeader("x-mns-prefix");
54 | }
55 | }
56 |
57 | public function getMarker()
58 | {
59 | return $this->marker;
60 | }
61 |
62 | public function setMarker($marker)
63 | {
64 | $this->marker = $marker;
65 | if ($marker != NULL)
66 | {
67 | $this->setHeader("x-mns-marker", $marker);
68 | }
69 | else
70 | {
71 | $this->removeHeader("x-mns-marker");
72 | }
73 | }
74 |
75 | public function generateBody()
76 | {
77 | return NULL;
78 | }
79 |
80 | public function generateQueryString()
81 | {
82 | return NULL;
83 | }
84 | }
85 |
86 | ?>
87 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/ListTopicRequest.php:
--------------------------------------------------------------------------------
1 | setRetNum($retNum);
17 | $this->setPrefix($prefix);
18 | $this->setMarker($marker);
19 | }
20 |
21 | public function getRetNum()
22 | {
23 | return $this->retNum;
24 | }
25 |
26 | public function setRetNum($retNum)
27 | {
28 | $this->retNum = $retNum;
29 | if ($retNum != NULL)
30 | {
31 | $this->setHeader("x-mns-ret-number", $retNum);
32 | }
33 | else
34 | {
35 | $this->removeHeader("x-mns-ret-number");
36 | }
37 | }
38 |
39 | public function getPrefix()
40 | {
41 | return $this->prefix;
42 | }
43 |
44 | public function setPrefix($prefix)
45 | {
46 | $this->prefis = $prefix;
47 | if ($prefix != NULL)
48 | {
49 | $this->setHeader("x-mns-prefix", $prefix);
50 | }
51 | else
52 | {
53 | $this->removeHeader("x-mns-prefix");
54 | }
55 | }
56 |
57 | public function getMarker()
58 | {
59 | return $this->marker;
60 | }
61 |
62 | public function setMarker($marker)
63 | {
64 | $this->marker = $marker;
65 | if ($marker != NULL)
66 | {
67 | $this->setHeader("x-mns-marker", $marker);
68 | }
69 | else
70 | {
71 | $this->removeHeader("x-mns-marker");
72 | }
73 | }
74 |
75 | public function generateBody()
76 | {
77 | return NULL;
78 | }
79 |
80 | public function generateQueryString()
81 | {
82 | return NULL;
83 | }
84 | }
85 |
86 | ?>
87 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/BatchSendMessageRequest.php:
--------------------------------------------------------------------------------
1 | queueName = NULL;
21 | $this->sendMessageRequestItems = $sendMessageRequestItems;
22 | $this->base64 = $base64;
23 | }
24 |
25 | public function setBase64($base64)
26 | {
27 | $this->base64 = $base64;
28 | }
29 |
30 | public function isBase64()
31 | {
32 | return ($this->base64 == TRUE);
33 | }
34 |
35 | public function setQueueName($queueName)
36 | {
37 | $this->queueName = $queueName;
38 | $this->resourcePath = 'queues/' . $queueName . '/messages';
39 | }
40 |
41 | public function getQueueName()
42 | {
43 | return $this->queueName;
44 | }
45 |
46 | public function getSendMessageRequestItems()
47 | {
48 | return $this->sendMessageRequestItems;
49 | }
50 |
51 | public function addSendMessageRequestItem(SendMessageRequestItem $item)
52 | {
53 | $this->sendMessageRequestItems[] = $item;
54 | }
55 |
56 | public function generateBody()
57 | {
58 | $xmlWriter = new \XMLWriter;
59 | $xmlWriter->openMemory();
60 | $xmlWriter->startDocument("1.0", "UTF-8");
61 | $xmlWriter->startElementNS(NULL, "Messages", Constants::MNS_XML_NAMESPACE);
62 | foreach ($this->sendMessageRequestItems as $item)
63 | {
64 | $item->writeXML($xmlWriter, $this->base64);
65 | }
66 | $xmlWriter->endElement();
67 | $xmlWriter->endDocument();
68 | return $xmlWriter->outputMemory();
69 | }
70 |
71 | public function generateQueryString()
72 | {
73 | return NULL;
74 | }
75 | }
76 | ?>
77 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/SetQueueAttributeResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
20 | if ($statusCode == 204) {
21 | $this->succeed = TRUE;
22 | } else {
23 | $this->parseErrorResponse($statusCode, $content);
24 | }
25 | }
26 |
27 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
28 | {
29 | $this->succeed = FALSE;
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $result = XMLParser::parseNormalError($xmlReader);
34 |
35 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
36 | {
37 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
38 | }
39 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
40 | {
41 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
42 | }
43 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
44 | } catch (\Exception $e) {
45 | if ($exception != NULL) {
46 | throw $exception;
47 | } elseif($e instanceof MnsException) {
48 | throw $e;
49 | } else {
50 | throw new MnsException($statusCode, $e->getMessage());
51 | }
52 | } catch (\Throwable $t) {
53 | throw new MnsException($statusCode, $t->getMessage());
54 | }
55 | }
56 | }
57 |
58 | ?>
59 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Requests/ListSubscriptionRequest.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
22 | $this->setRetNum($retNum);
23 | $this->setPrefix($prefix);
24 | $this->setMarker($marker);
25 | }
26 |
27 | public function getTopicName()
28 | {
29 | return $this->topicName;
30 | }
31 |
32 | public function getRetNum()
33 | {
34 | return $this->retNum;
35 | }
36 |
37 | public function setRetNum($retNum)
38 | {
39 | $this->retNum = $retNum;
40 | if ($retNum != NULL)
41 | {
42 | $this->setHeader("x-mns-ret-number", $retNum);
43 | }
44 | else
45 | {
46 | $this->removeHeader("x-mns-ret-number");
47 | }
48 | }
49 |
50 | public function getPrefix()
51 | {
52 | return $this->prefix;
53 | }
54 |
55 | public function setPrefix($prefix)
56 | {
57 | $this->prefis = $prefix;
58 | if ($prefix != NULL)
59 | {
60 | $this->setHeader("x-mns-prefix", $prefix);
61 | }
62 | else
63 | {
64 | $this->removeHeader("x-mns-prefix");
65 | }
66 | }
67 |
68 | public function getMarker()
69 | {
70 | return $this->marker;
71 | }
72 |
73 | public function setMarker($marker)
74 | {
75 | $this->marker = $marker;
76 | if ($marker != NULL)
77 | {
78 | $this->setHeader("x-mns-marker", $marker);
79 | }
80 | else
81 | {
82 | $this->removeHeader("x-mns-marker");
83 | }
84 | }
85 |
86 | public function generateBody()
87 | {
88 | return NULL;
89 | }
90 |
91 | public function generateQueryString()
92 | {
93 | return NULL;
94 | }
95 | }
96 |
97 | ?>
98 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Constants.php:
--------------------------------------------------------------------------------
1 |
61 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/SetSubscriptionAttributeResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
20 | if ($statusCode == 204) {
21 | $this->succeed = TRUE;
22 | } else {
23 | $this->parseErrorResponse($statusCode, $content);
24 | }
25 | }
26 |
27 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
28 | {
29 | $this->succeed = FALSE;
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $result = XMLParser::parseNormalError($xmlReader);
34 |
35 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
36 | {
37 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
38 | }
39 | if ($result['Code'] == Constants::SUBSCRIPTION_NOT_EXIST)
40 | {
41 | throw new SubscriptionNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
42 | }
43 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
44 | }
45 | catch (\Exception $e)
46 | {
47 | if ($exception != NULL) {
48 | throw $exception;
49 | }
50 | elseif ($e instanceof MnsException)
51 | {
52 | throw $e;
53 | }
54 | else
55 | {
56 | throw new MnsException($statusCode, $e->getMessage());
57 | }
58 | } catch (\Throwable $t) {
59 | throw new MnsException($statusCode, $t->getMessage());
60 | }
61 | }
62 | }
63 |
64 | ?>
65 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/SetTopicAttributeResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
20 | if ($statusCode == 204) {
21 | $this->succeed = TRUE;
22 | } else {
23 | $this->parseErrorResponse($statusCode, $content);
24 | }
25 | }
26 |
27 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
28 | {
29 | $this->succeed = FALSE;
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $result = XMLParser::parseNormalError($xmlReader);
34 |
35 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
36 | {
37 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
38 | }
39 | if ($result['Code'] == Constants::TOPIC_NOT_EXIST)
40 | {
41 | throw new TopicNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
42 | }
43 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
44 | }
45 | catch (\Exception $e)
46 | {
47 | if ($exception != NULL)
48 | {
49 | throw $exception;
50 | }
51 | elseif ($e instanceof MnsException)
52 | {
53 | throw $e;
54 | }
55 | else
56 | {
57 | throw new MnsException($statusCode, $e->getMessage());
58 | }
59 | }
60 | catch (\Throwable $t)
61 | {
62 | throw new MnsException($statusCode, $t->getMessage());
63 | }
64 | }
65 | }
66 |
67 | ?>
68 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/SubscribeResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
16 | if ($statusCode == 201 || $statusCode == 204)
17 | {
18 | $this->succeed = TRUE;
19 | }
20 | else
21 | {
22 | $this->parseErrorResponse($statusCode, $content);
23 | }
24 | }
25 |
26 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
27 | {
28 | $this->succeed = FALSE;
29 | $xmlReader = new \XMLReader();
30 | try
31 | {
32 | $xmlReader->XML($content);
33 | $result = XMLParser::parseNormalError($xmlReader);
34 |
35 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
36 | {
37 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
38 | }
39 | if ($result['Code'] == Constants::SUBSCRIPTION_ALREADY_EXIST)
40 | {
41 | throw new SubscriptionAlreadyExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
42 | }
43 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
44 | }
45 | catch (\Exception $e)
46 | {
47 | if ($exception != NULL)
48 | {
49 | throw $exception;
50 | }
51 | elseif ($e instanceof MnsException)
52 | {
53 | throw $e;
54 | }
55 | else
56 | {
57 | throw new MnsException($statusCode, $e->getMessage());
58 | }
59 | }
60 | catch (\Throwable $t)
61 | {
62 | throw new MnsException($statusCode, $t->getMessage());
63 | }
64 | }
65 | }
66 |
67 | ?>
68 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/CreateQueueResponse.php:
--------------------------------------------------------------------------------
1 | queueName = $queueName;
18 | }
19 |
20 | public function parseResponse($statusCode, $content)
21 | {
22 | $this->statusCode = $statusCode;
23 | if ($statusCode == 201 || $statusCode == 204) {
24 | $this->succeed = TRUE;
25 | } else {
26 | $this->parseErrorResponse($statusCode, $content);
27 | }
28 | }
29 |
30 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
31 | {
32 | $this->succeed = FALSE;
33 | $xmlReader = new \XMLReader();
34 | try {
35 | $xmlReader->XML($content);
36 | $result = XMLParser::parseNormalError($xmlReader);
37 |
38 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
39 | {
40 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
41 | }
42 | if ($result['Code'] == Constants::QUEUE_ALREADY_EXIST)
43 | {
44 | throw new QueueAlreadyExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
45 | }
46 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
47 | } catch (\Exception $e) {
48 | if ($exception != NULL) {
49 | throw $exception;
50 | } elseif($e instanceof MnsException) {
51 | throw $e;
52 | } else {
53 | throw new MnsException($statusCode, $e->getMessage());
54 | }
55 | } catch (\Throwable $t) {
56 | throw new MnsException($statusCode, $t->getMessage());
57 | }
58 | }
59 |
60 | public function getQueueName()
61 | {
62 | return $this->queueName;
63 | }
64 | }
65 |
66 | ?>
67 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/CreateTopicResponse.php:
--------------------------------------------------------------------------------
1 | topicName = $topicName;
18 | }
19 |
20 | public function parseResponse($statusCode, $content)
21 | {
22 | $this->statusCode = $statusCode;
23 | if ($statusCode == 201 || $statusCode == 204) {
24 | $this->succeed = TRUE;
25 | } else {
26 | $this->parseErrorResponse($statusCode, $content);
27 | }
28 | }
29 |
30 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
31 | {
32 | $this->succeed = FALSE;
33 | $xmlReader = new \XMLReader();
34 | try {
35 | $xmlReader->XML($content);
36 | $result = XMLParser::parseNormalError($xmlReader);
37 |
38 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
39 | {
40 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
41 | }
42 | if ($result['Code'] == Constants::TOPIC_ALREADY_EXIST)
43 | {
44 | throw new TopicAlreadyExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
45 | }
46 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
47 | } catch (\Exception $e) {
48 | if ($exception != NULL) {
49 | throw $exception;
50 | } elseif($e instanceof MnsException) {
51 | throw $e;
52 | } else {
53 | throw new MnsException($statusCode, $e->getMessage());
54 | }
55 | } catch (\Throwable $t) {
56 | throw new MnsException($statusCode, $t->getMessage());
57 | }
58 | }
59 |
60 | public function getTopicName()
61 | {
62 | return $this->topicName;
63 | }
64 | }
65 |
66 | ?>
67 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/DeleteMessageResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
21 | if ($statusCode == 204) {
22 | $this->succeed = TRUE;
23 | } else {
24 | $this->parseErrorResponse($statusCode, $content);
25 | }
26 | }
27 |
28 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
29 | {
30 | $this->succeed = FALSE;
31 | $xmlReader = new \XMLReader();
32 | try {
33 | $xmlReader->XML($content);
34 | $result = XMLParser::parseNormalError($xmlReader);
35 |
36 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
37 | {
38 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
39 | }
40 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
41 | {
42 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
43 | }
44 | if ($result['Code'] == Constants::RECEIPT_HANDLE_ERROR)
45 | {
46 | throw new ReceiptHandleErrorException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
47 | }
48 |
49 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
50 | } catch (\Exception $e) {
51 | if ($exception != NULL) {
52 | throw $exception;
53 | } elseif($e instanceof MnsException) {
54 | throw $e;
55 | } else {
56 | throw new MnsException($statusCode, $e->getMessage());
57 | }
58 | } catch (\Throwable $t) {
59 | throw new MnsException($statusCode, $t->getMessage());
60 | }
61 | }
62 | }
63 |
64 | ?>
65 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/GetQueueAttributeResponse.php:
--------------------------------------------------------------------------------
1 | attributes = NULL;
19 | }
20 |
21 | public function getQueueAttributes()
22 | {
23 | return $this->attributes;
24 | }
25 |
26 | public function parseResponse($statusCode, $content)
27 | {
28 | $this->statusCode = $statusCode;
29 | if ($statusCode == 200) {
30 | $this->succeed = TRUE;
31 | } else {
32 | $this->parseErrorResponse($statusCode, $content);
33 | }
34 |
35 | $xmlReader = new \XMLReader();
36 | try {
37 | $xmlReader->XML($content);
38 | $this->attributes = QueueAttributes::fromXML($xmlReader);
39 | } catch (\Exception $e) {
40 | throw new MnsException($statusCode, $e->getMessage(), $e);
41 | } catch (\Throwable $t) {
42 | throw new MnsException($statusCode, $t->getMessage());
43 | }
44 |
45 | }
46 |
47 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
48 | {
49 | $this->succeed = FALSE;
50 | $xmlReader = new \XMLReader();
51 | try {
52 | $xmlReader->XML($content);
53 | $result = XMLParser::parseNormalError($xmlReader);
54 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
55 | {
56 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
57 | }
58 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
59 | } catch (\Exception $e) {
60 | if ($exception != NULL) {
61 | throw $exception;
62 | } elseif($e instanceof MnsException) {
63 | throw $e;
64 | } else {
65 | throw new MnsException($statusCode, $e->getMessage());
66 | }
67 | } catch (\Throwable $t) {
68 | throw new MnsException($statusCode, $t->getMessage());
69 | }
70 | }
71 | }
72 |
73 | ?>
74 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/DeleteMessageErrorItem.php:
--------------------------------------------------------------------------------
1 | errorCode = $errorCode;
15 | $this->errorMessage = $errorMessage;
16 | $this->receiptHandle = $receiptHandle;
17 | }
18 |
19 | public function getErrorCode()
20 | {
21 | return $this->errorCode;
22 | }
23 |
24 | public function getErrorMessage()
25 | {
26 | return $this->errorMessage;
27 | }
28 |
29 | public function getReceiptHandle()
30 | {
31 | return $this->receiptHandle;
32 | }
33 |
34 | static public function fromXML($xmlReader)
35 | {
36 | $errorCode = NULL;
37 | $errorMessage = NULL;
38 | $receiptHandle = NULL;
39 |
40 | while ($xmlReader->read())
41 | {
42 | switch ($xmlReader->nodeType)
43 | {
44 | case \XMLReader::ELEMENT:
45 | switch ($xmlReader->name)
46 | {
47 | case Constants::ERROR_CODE:
48 | $xmlReader->read();
49 | if ($xmlReader->nodeType == \XMLReader::TEXT)
50 | {
51 | $errorCode = $xmlReader->value;
52 | }
53 | break;
54 | case Constants::ERROR_MESSAGE:
55 | $xmlReader->read();
56 | if ($xmlReader->nodeType == \XMLReader::TEXT)
57 | {
58 | $errorMessage = $xmlReader->value;
59 | }
60 | break;
61 | case Constants::RECEIPT_HANDLE:
62 | $xmlReader->read();
63 | if ($xmlReader->nodeType == \XMLReader::TEXT)
64 | {
65 | $receiptHandle = $xmlReader->value;
66 | }
67 | break;
68 | }
69 | break;
70 | case \XMLReader::END_ELEMENT:
71 | if ($xmlReader->name == Constants::ERROR)
72 | {
73 | return new DeleteMessageErrorItem($errorCode, $errorMessage, $receiptHandle);
74 | }
75 | break;
76 | }
77 | }
78 |
79 | return new DeleteMessageErrorItem($errorCode, $errorMessage, $receiptHandle);
80 | }
81 | }
82 |
83 | ?>
84 |
--------------------------------------------------------------------------------
/tests/AbstractTestCase.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Test;
16 |
17 | use Mockery as m;
18 | use PHPUnit_Runner_Version;
19 |
20 | abstract class AbstractTestCase extends \PHPUnit_Framework_TestCase
21 | {
22 | /**
23 | * @var string phpunit major version string.
24 | */
25 | protected $phpunitSeries;
26 |
27 | public function tearDown()
28 | {
29 | // 因为运行在 strict 模式下的 phpunit,会将不包含 phpunit 断言的测试方法
30 | // 标记为 risky。这里简单的在测试方法执行后把 mockery 的预期全部转化成
31 | // phpunit 的断言,通常不直接包含 phpunit 断言的测试,基本都是 mockery 预期。
32 | // 测试类需要继承这里, m::close() 的时候替换为 parent::tearDown()。
33 | if ($container = m::getContainer()) {
34 | $this->addToAssertionCount(
35 | $container->mockery_getExpectationCount()
36 | );
37 | m::close();
38 | }
39 | $this->phpunitSeries = null;
40 | }
41 |
42 | public function setUp()
43 | {
44 | // 取到 phpunit 的版本,并在这个类里做适配防止测试运行在
45 | // 不同 phpunit 版本下出现的接口不兼容问题。
46 | $id = PHPUnit_Runner_Version::id();
47 | if (2 === substr_count($id, '.')) {
48 | // x.x.x
49 | $second = strpos($id, '.') + 1;
50 | $this->phpunitSeries = substr($id, 0, strpos($id, '.', $second));
51 | } elseif (1 === substr_count($id, '.')) {
52 | // x.x
53 | $this->phpunitSeries = $id;
54 | } else {
55 | // x
56 | $this->phpunitSeries = $id . '.0';
57 | }
58 | if ('' == $this->phpunitSeries) {
59 | $this->phpunitSeries = '4.0';
60 | }
61 | }
62 |
63 | /**
64 | * In phpunit 5.2 setExpectedException() method is deprecated.
65 | *
66 | * @param mixed $exception
67 | */
68 | public function expectException($exception)
69 | {
70 | if ($this->phpunitSeries < 5.2) {
71 | $this->setExpectedException($exception);
72 | } else {
73 | parent::expectException($exception);
74 | }
75 | }
76 |
77 | public function expectExceptionMessage($message)
78 | {
79 | if ($this->phpunitSeries < 5.2) {
80 | $this->setExpectedException($this->getExpectedException(), $message);
81 | } else {
82 | parent::expectExceptionMessage($message);
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/GetTopicAttributeResponse.php:
--------------------------------------------------------------------------------
1 | attributes = NULL;
18 | }
19 |
20 | public function getTopicAttributes()
21 | {
22 | return $this->attributes;
23 | }
24 |
25 | public function parseResponse($statusCode, $content)
26 | {
27 | $this->statusCode = $statusCode;
28 | if ($statusCode == 200)
29 | {
30 | $this->succeed = TRUE;
31 | }
32 | else
33 | {
34 | $this->parseErrorResponse($statusCode, $content);
35 | }
36 |
37 | $xmlReader = new \XMLReader();
38 | try {
39 | $xmlReader->XML($content);
40 | $this->attributes = TopicAttributes::fromXML($xmlReader);
41 | }
42 | catch (\Exception $e)
43 | {
44 | throw new MnsException($statusCode, $e->getMessage(), $e);
45 | }
46 | catch (\Throwable $t)
47 | {
48 | throw new MnsException($statusCode, $t->getMessage());
49 | }
50 | }
51 |
52 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
53 | {
54 | $this->succeed = FALSE;
55 | $xmlReader = new \XMLReader();
56 | try
57 | {
58 | $xmlReader->XML($content);
59 | $result = XMLParser::parseNormalError($xmlReader);
60 | if ($result['Code'] == Constants::TOPIC_NOT_EXIST)
61 | {
62 | throw new TopicNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
63 | }
64 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
65 | }
66 | catch (\Exception $e)
67 | {
68 | if ($exception != NULL)
69 | {
70 | throw $exception;
71 | }
72 | elseif ($e instanceof MnsException)
73 | {
74 | throw $e;
75 | }
76 | else
77 | {
78 | throw new MnsException($statusCode, $e->getMessage());
79 | }
80 | }
81 | catch (\Throwable $t)
82 | {
83 | throw new MnsException($statusCode, $t->getMessage());
84 | }
85 | }
86 | }
87 |
88 | ?>
89 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/GetSubscriptionAttributeResponse.php:
--------------------------------------------------------------------------------
1 | attributes = NULL;
18 | }
19 |
20 | public function getSubscriptionAttributes()
21 | {
22 | return $this->attributes;
23 | }
24 |
25 | public function parseResponse($statusCode, $content)
26 | {
27 | $this->statusCode = $statusCode;
28 | if ($statusCode == 200)
29 | {
30 | $this->succeed = TRUE;
31 | }
32 | else
33 | {
34 | $this->parseErrorResponse($statusCode, $content);
35 | }
36 |
37 | $xmlReader = new \XMLReader();
38 | try
39 | {
40 | $xmlReader->XML($content);
41 | $this->attributes = SubscriptionAttributes::fromXML($xmlReader);
42 | }
43 | catch (\Exception $e)
44 | {
45 | throw new MnsException($statusCode, $e->getMessage(), $e);
46 | }
47 | catch (\Throwable $t)
48 | {
49 | throw new MnsException($statusCode, $t->getMessage());
50 | }
51 | }
52 |
53 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
54 | {
55 | $this->succeed = FALSE;
56 | $xmlReader = new \XMLReader();
57 | try
58 | {
59 | $xmlReader->XML($content);
60 | $result = XMLParser::parseNormalError($xmlReader);
61 | if ($result['Code'] == Constants::SUBSCRIPTION_NOT_EXIST)
62 | {
63 | throw new SubscriptionNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
64 | }
65 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
66 | }
67 | catch (\Exception $e)
68 | {
69 | if ($exception != NULL)
70 | {
71 | throw $exception;
72 | }
73 | elseif ($e instanceof MnsException)
74 | {
75 | throw $e;
76 | }
77 | else
78 | {
79 | throw new MnsException($statusCode, $e->getMessage());
80 | }
81 | }
82 | catch (\Throwable $t)
83 | {
84 | throw new MnsException($statusCode, $t->getMessage());
85 | }
86 | }
87 | }
88 | ?>
89 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/SendMessageResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
24 | if ($statusCode == 201) {
25 | $this->succeed = TRUE;
26 | } else {
27 | $this->parseErrorResponse($statusCode, $content);
28 | }
29 |
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $this->readMessageIdAndMD5XML($xmlReader);
34 | } catch (\Exception $e) {
35 | throw new MnsException($statusCode, $e->getMessage(), $e);
36 | } catch (\Throwable $t) {
37 | throw new MnsException($statusCode, $t->getMessage());
38 | }
39 |
40 | }
41 |
42 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
43 | {
44 | $this->succeed = FALSE;
45 | $xmlReader = new \XMLReader();
46 | try {
47 | $xmlReader->XML($content);
48 | $result = XMLParser::parseNormalError($xmlReader);
49 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
50 | {
51 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
52 | }
53 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
54 | {
55 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
56 | }
57 | if ($result['Code'] == Constants::MALFORMED_XML)
58 | {
59 | throw new MalformedXMLException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
60 | }
61 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
62 | } catch (\Exception $e) {
63 | if ($exception != NULL) {
64 | throw $exception;
65 | } elseif($e instanceof MnsException) {
66 | throw $e;
67 | } else {
68 | throw new MnsException($statusCode, $e->getMessage());
69 | }
70 | } catch (\Throwable $t) {
71 | throw new MnsException($statusCode, $t->getMessage());
72 | }
73 | }
74 | }
75 |
76 | ?>
77 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/PublishMessageResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
24 | if ($statusCode == 201) {
25 | $this->succeed = TRUE;
26 | } else {
27 | $this->parseErrorResponse($statusCode, $content);
28 | }
29 |
30 | $xmlReader = new \XMLReader();
31 | try {
32 | $xmlReader->XML($content);
33 | $this->readMessageIdAndMD5XML($xmlReader);
34 | } catch (\Exception $e) {
35 | throw new MnsException($statusCode, $e->getMessage(), $e);
36 | } catch (\Throwable $t) {
37 | throw new MnsException($statusCode, $t->getMessage());
38 | }
39 |
40 | }
41 |
42 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
43 | {
44 | $this->succeed = FALSE;
45 | $xmlReader = new \XMLReader();
46 | try {
47 | $xmlReader->XML($content);
48 | $result = XMLParser::parseNormalError($xmlReader);
49 | if ($result['Code'] == Constants::TOPIC_NOT_EXIST)
50 | {
51 | throw new TopicNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
52 | }
53 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
54 | {
55 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
56 | }
57 | if ($result['Code'] == Constants::MALFORMED_XML)
58 | {
59 | throw new MalformedXMLException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
60 | }
61 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
62 | } catch (\Exception $e) {
63 | if ($exception != NULL) {
64 | throw $exception;
65 | } elseif($e instanceof MnsException) {
66 | throw $e;
67 | } else {
68 | throw new MnsException($statusCode, $e->getMessage());
69 | }
70 | } catch (\Throwable $t) {
71 | throw new MnsException($statusCode, $t->getMessage());
72 | }
73 | }
74 | }
75 |
76 | ?>
77 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/PeekMessageResponse.php:
--------------------------------------------------------------------------------
1 | base64 = $base64;
22 | }
23 |
24 | public function setBase64($base64)
25 | {
26 | $this->base64 = $base64;
27 | }
28 |
29 | public function isBase64()
30 | {
31 | return ($this->base64 == TRUE);
32 | }
33 |
34 | public function parseResponse($statusCode, $content)
35 | {
36 | $this->statusCode = $statusCode;
37 | if ($statusCode == 200) {
38 | $this->succeed = TRUE;
39 | } else {
40 | $this->parseErrorResponse($statusCode, $content);
41 | }
42 |
43 | $xmlReader = new \XMLReader();
44 | try {
45 | $xmlReader->XML($content);
46 | $this->readMessagePropertiesForPeekXML($xmlReader, $this->base64);
47 | } catch (\Exception $e) {
48 | throw new MnsException($statusCode, $e->getMessage(), $e);
49 | } catch (\Throwable $t) {
50 | throw new MnsException($statusCode, $t->getMessage());
51 | }
52 |
53 | }
54 |
55 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
56 | {
57 | $this->succeed = FALSE;
58 | $xmlReader = new \XMLReader();
59 | try {
60 | $xmlReader->XML($content);
61 | $result = XMLParser::parseNormalError($xmlReader);
62 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
63 | {
64 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
65 | }
66 | if ($result['Code'] == Constants::MESSAGE_NOT_EXIST)
67 | {
68 | throw new MessageNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
69 | }
70 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
71 | } catch (\Exception $e) {
72 | if ($exception != NULL) {
73 | throw $exception;
74 | } elseif($e instanceof MnsException) {
75 | throw $e;
76 | } else {
77 | throw new MnsException($statusCode, $e->getMessage());
78 | }
79 | } catch (\Throwable $t) {
80 | throw new MnsException($statusCode, $t->getMessage());
81 | }
82 | }
83 | }
84 |
85 | ?>
86 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/ReceiveMessageResponse.php:
--------------------------------------------------------------------------------
1 | base64 = $base64;
22 | }
23 |
24 | public function setBase64($base64)
25 | {
26 | $this->base64 = $base64;
27 | }
28 |
29 | public function isBase64()
30 | {
31 | return ($this->base64 == TRUE);
32 | }
33 |
34 | public function parseResponse($statusCode, $content)
35 | {
36 | $this->statusCode = $statusCode;
37 | if ($statusCode == 200) {
38 | $this->succeed = TRUE;
39 | } else {
40 | $this->parseErrorResponse($statusCode, $content);
41 | }
42 |
43 | $xmlReader = new \XMLReader();
44 | try {
45 | $xmlReader->XML($content);
46 | $this->readMessagePropertiesForReceiveXML($xmlReader, $this->base64);
47 | } catch (\Exception $e) {
48 | throw new MnsException($statusCode, $e->getMessage(), $e);
49 | } catch (\Throwable $t) {
50 | throw new MnsException($statusCode, $t->getMessage());
51 | }
52 |
53 | }
54 |
55 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
56 | {
57 | $this->succeed = FALSE;
58 | $xmlReader = new \XMLReader();
59 | try {
60 | $xmlReader->XML($content);
61 | $result = XMLParser::parseNormalError($xmlReader);
62 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
63 | {
64 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
65 | }
66 | if ($result['Code'] == Constants::MESSAGE_NOT_EXIST)
67 | {
68 | throw new MessageNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
69 | }
70 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
71 | } catch (\Exception $e) {
72 | if ($exception != NULL) {
73 | throw $exception;
74 | } elseif($e instanceof MnsException) {
75 | throw $e;
76 | } else {
77 | throw new MnsException($statusCode, $e->getMessage());
78 | }
79 | } catch (\Throwable $t) {
80 | throw new MnsException($statusCode, $t->getMessage());
81 | }
82 | }
83 | }
84 |
85 | ?>
86 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/BatchPeekMessageResponse.php:
--------------------------------------------------------------------------------
1 | messages = array();
22 | $this->base64 = $base64;
23 | }
24 |
25 | public function setBase64($base64)
26 | {
27 | $this->base64 = $base64;
28 | }
29 |
30 | public function isBase64()
31 | {
32 | return ($this->base64 == TRUE);
33 | }
34 |
35 | public function getMessages()
36 | {
37 | return $this->messages;
38 | }
39 |
40 | public function parseResponse($statusCode, $content)
41 | {
42 | $this->statusCode = $statusCode;
43 | if ($statusCode == 200) {
44 | $this->succeed = TRUE;
45 | } else {
46 | $this->parseErrorResponse($statusCode, $content);
47 | }
48 |
49 | $xmlReader = new \XMLReader();
50 | try {
51 | $xmlReader->XML($content);
52 | while ($xmlReader->read())
53 | {
54 | if ($xmlReader->nodeType == \XMLReader::ELEMENT
55 | && $xmlReader->name == 'Message')
56 | {
57 | $this->messages[] = Message::fromXML($xmlReader, $this->base64);
58 | }
59 | }
60 | } catch (\Exception $e) {
61 | throw new MnsException($statusCode, $e->getMessage(), $e);
62 | } catch (\Throwable $t) {
63 | throw new MnsException($statusCode, $t->getMessage());
64 | }
65 | }
66 |
67 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
68 | {
69 | $this->succeed = FALSE;
70 | $xmlReader = new \XMLReader();
71 | try {
72 | $xmlReader->XML($content);
73 | $result = XMLParser::parseNormalError($xmlReader);
74 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
75 | {
76 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
77 | }
78 | if ($result['Code'] == Constants::MESSAGE_NOT_EXIST)
79 | {
80 | throw new MessageNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
81 | }
82 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
83 | } catch (\Exception $e) {
84 | if ($exception != NULL) {
85 | throw $exception;
86 | } elseif($e instanceof MnsException) {
87 | throw $e;
88 | } else {
89 | throw new MnsException($statusCode, $e->getMessage());
90 | }
91 | } catch (\Throwable $t) {
92 | throw new MnsException($statusCode, $t->getMessage());
93 | }
94 | }
95 | }
96 |
97 | ?>
98 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/BatchReceiveMessageResponse.php:
--------------------------------------------------------------------------------
1 | messages = array();
22 | $this->base64 = $base64;
23 | }
24 |
25 | public function setBase64($base64)
26 | {
27 | $this->base64 = $base64;
28 | }
29 |
30 | public function isBase64()
31 | {
32 | return ($this->base64 == TRUE);
33 | }
34 |
35 | public function getMessages()
36 | {
37 | return $this->messages;
38 | }
39 |
40 | public function parseResponse($statusCode, $content)
41 | {
42 | $this->statusCode = $statusCode;
43 | if ($statusCode == 200) {
44 | $this->succeed = TRUE;
45 | } else {
46 | $this->parseErrorResponse($statusCode, $content);
47 | }
48 |
49 | $xmlReader = new \XMLReader();
50 | try {
51 | $xmlReader->XML($content);
52 | while ($xmlReader->read())
53 | {
54 | if ($xmlReader->nodeType == \XMLReader::ELEMENT
55 | && $xmlReader->name == 'Message')
56 | {
57 | $this->messages[] = Message::fromXML($xmlReader, $this->base64);
58 | }
59 | }
60 | } catch (\Exception $e) {
61 | throw new MnsException($statusCode, $e->getMessage(), $e);
62 | } catch (\Throwable $t) {
63 | throw new MnsException($statusCode, $t->getMessage());
64 | }
65 | }
66 |
67 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
68 | {
69 | $this->succeed = FALSE;
70 | $xmlReader = new \XMLReader();
71 | try {
72 | $xmlReader->XML($content);
73 | $result = XMLParser::parseNormalError($xmlReader);
74 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
75 | {
76 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
77 | }
78 | if ($result['Code'] == Constants::MESSAGE_NOT_EXIST)
79 | {
80 | throw new MessageNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
81 | }
82 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
83 | } catch (\Exception $e) {
84 | if ($exception != NULL) {
85 | throw $exception;
86 | } elseif($e instanceof MnsException) {
87 | throw $e;
88 | } else {
89 | throw new MnsException($statusCode, $e->getMessage());
90 | }
91 | } catch (\Throwable $t) {
92 | throw new MnsException($statusCode, $t->getMessage());
93 | }
94 |
95 | }
96 | }
97 |
98 | ?>
99 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/ListQueueResponse.php:
--------------------------------------------------------------------------------
1 | queueNames = array();
16 | $this->nextMarker = NULL;
17 | }
18 |
19 | public function isFinished()
20 | {
21 | return $this->nextMarker == NULL;
22 | }
23 |
24 | public function getQueueNames()
25 | {
26 | return $this->queueNames;
27 | }
28 |
29 | public function getNextMarker()
30 | {
31 | return $this->nextMarker;
32 | }
33 |
34 | public function parseResponse($statusCode, $content)
35 | {
36 | $this->statusCode = $statusCode;
37 | if ($statusCode != 200) {
38 | $this->parseErrorResponse($statusCode, $content);
39 | return;
40 | }
41 |
42 | $this->succeed = TRUE;
43 | $xmlReader = new \XMLReader();
44 | try {
45 | $xmlReader->XML($content);
46 | while ($xmlReader->read())
47 | {
48 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
49 | {
50 | switch ($xmlReader->name) {
51 | case 'QueueURL':
52 | $xmlReader->read();
53 | if ($xmlReader->nodeType == \XMLReader::TEXT)
54 | {
55 | $queueName = $this->getQueueNameFromQueueURL($xmlReader->value);
56 | $this->queueNames[] = $queueName;
57 | }
58 | break;
59 | case 'NextMarker':
60 | $xmlReader->read();
61 | if ($xmlReader->nodeType == \XMLReader::TEXT)
62 | {
63 | $this->nextMarker = $xmlReader->value;
64 | }
65 | break;
66 | }
67 | }
68 | }
69 | } catch (\Exception $e) {
70 | throw new MnsException($statusCode, $e->getMessage(), $e);
71 | } catch (\Throwable $t) {
72 | throw new MnsException($statusCode, $t->getMessage());
73 | }
74 | }
75 |
76 | private function getQueueNameFromQueueURL($queueURL)
77 | {
78 | $pieces = explode("/", $queueURL);
79 | if (count($pieces) == 5)
80 | {
81 | return $pieces[4];
82 | }
83 | return "";
84 | }
85 |
86 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
87 | {
88 | $this->succeed = FALSE;
89 | $xmlReader = new \XMLReader();
90 | try {
91 | $xmlReader->XML($content);
92 | $result = XMLParser::parseNormalError($xmlReader);
93 |
94 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
95 | } catch (\Exception $e) {
96 | if ($exception != NULL) {
97 | throw $exception;
98 | } elseif($e instanceof MnsException) {
99 | throw $e;
100 | } else {
101 | throw new MnsException($statusCode, $e->getMessage());
102 | }
103 | } catch (\Throwable $t) {
104 | throw new MnsException($statusCode, $t->getMessage());
105 | }
106 | }
107 | }
108 |
109 | ?>
110 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/ChangeMessageVisibilityResponse.php:
--------------------------------------------------------------------------------
1 | receiptHandle;
26 | }
27 |
28 | public function getNextVisibleTime()
29 | {
30 | return $this->nextVisibleTime;
31 | }
32 |
33 | public function parseResponse($statusCode, $content)
34 | {
35 | $this->statusCode = $statusCode;
36 | if ($statusCode == 200) {
37 | $this->succeed = TRUE;
38 | } else {
39 | $this->parseErrorResponse($statusCode, $content);
40 | }
41 |
42 | $xmlReader = new \XMLReader();
43 | try {
44 | $xmlReader->XML($content);
45 | $message = Message::fromXML($xmlReader, TRUE);
46 | $this->receiptHandle = $message->getReceiptHandle();
47 | $this->nextVisibleTime = $message->getNextVisibleTime();
48 | } catch (\Exception $e) {
49 | throw new MnsException($statusCode, $e->getMessage(), $e);
50 | } catch (\Throwable $t) {
51 | throw new MnsException($statusCode, $t->getMessage());
52 | }
53 | }
54 |
55 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
56 | {
57 | $this->succeed = FALSE;
58 | $xmlReader = new \XMLReader();
59 | try {
60 | $xmlReader->XML($content);
61 | $result = XMLParser::parseNormalError($xmlReader);
62 |
63 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
64 | {
65 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
66 | }
67 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
68 | {
69 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
70 | }
71 | if ($result['Code'] == Constants::MESSAGE_NOT_EXIST)
72 | {
73 | throw new MessageNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
74 | }
75 | if ($result['Code'] == Constants::RECEIPT_HANDLE_ERROR)
76 | {
77 | throw new ReceiptHandleErrorException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
78 | }
79 |
80 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
81 | } catch (\Exception $e) {
82 | if ($exception != NULL) {
83 | throw $exception;
84 | } elseif($e instanceof MnsException) {
85 | throw $e;
86 | } else {
87 | throw new MnsException($statusCode, $e->getMessage());
88 | }
89 | } catch (\Throwable $t) {
90 | throw new MnsException($statusCode, $t->getMessage());
91 | }
92 |
93 | }
94 | }
95 |
96 | ?>
97 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/BatchDeleteMessageResponse.php:
--------------------------------------------------------------------------------
1 | statusCode = $statusCode;
23 | if ($statusCode == 204) {
24 | $this->succeed = TRUE;
25 | } else {
26 | $this->parseErrorResponse($statusCode, $content);
27 | }
28 | }
29 |
30 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
31 | {
32 | $this->succeed = FALSE;
33 | $xmlReader = new \XMLReader();
34 | try {
35 | $xmlReader->XML($content);
36 | while ($xmlReader->read())
37 | {
38 | if ($xmlReader->nodeType == \XMLReader::ELEMENT) {
39 | switch ($xmlReader->name) {
40 | case Constants::ERROR:
41 | $this->parseNormalErrorResponse($xmlReader);
42 | break;
43 | default: // case Constants::Messages
44 | $this->parseBatchDeleteErrorResponse($xmlReader);
45 | break;
46 | }
47 | }
48 | }
49 | } catch (\Exception $e) {
50 | if ($exception != NULL) {
51 | throw $exception;
52 | } elseif($e instanceof MnsException) {
53 | throw $e;
54 | } else {
55 | throw new MnsException($statusCode, $e->getMessage());
56 | }
57 | } catch (\Throwable $t) {
58 | throw new MnsException($statusCode, $t->getMessage());
59 | }
60 | }
61 |
62 | private function parseBatchDeleteErrorResponse($xmlReader)
63 | {
64 | $ex = new BatchDeleteFailException($this->statusCode, "BatchDeleteMessage Failed For Some ReceiptHandles");
65 | while ($xmlReader->read())
66 | {
67 | if ($xmlReader->nodeType == \XMLReader::ELEMENT && $xmlReader->name == Constants::ERROR) {
68 | $ex->addDeleteMessageErrorItem( DeleteMessageErrorItem::fromXML($xmlReader));
69 | }
70 | }
71 | throw $ex;
72 | }
73 |
74 | private function parseNormalErrorResponse($xmlReader)
75 | {
76 | $result = XMLParser::parseNormalError($xmlReader);
77 |
78 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
79 | {
80 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
81 | }
82 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
83 | {
84 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
85 | }
86 | if ($result['Code'] == Constants::RECEIPT_HANDLE_ERROR)
87 | {
88 | throw new ReceiptHandleErrorException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
89 | }
90 |
91 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
92 | }
93 | }
94 |
95 | ?>
96 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/SendMessageResponseItem.php:
--------------------------------------------------------------------------------
1 | isSucceed = $isSucceed;
22 | if ($isSucceed == TRUE)
23 | {
24 | $this->messageId = $param1;
25 | $this->messageBodyMD5 = $param2;
26 | }
27 | else
28 | {
29 | $this->errorCode = $param1;
30 | $this->errorMessage = $param2;
31 | }
32 | }
33 |
34 | public function isSucceed()
35 | {
36 | return $this->isSucceed;
37 | }
38 |
39 | public function getErrorCode()
40 | {
41 | return $this->errorCode;
42 | }
43 |
44 | public function getErrorMessage()
45 | {
46 | return $this->errorMessage;
47 | }
48 |
49 | static public function fromXML($xmlReader)
50 | {
51 | $messageId = NULL;
52 | $messageBodyMD5 = NULL;
53 | $errorCode = NULL;
54 | $errorMessage = NULL;
55 |
56 | while ($xmlReader->read())
57 | {
58 | switch ($xmlReader->nodeType)
59 | {
60 | case \XMLReader::ELEMENT:
61 | switch ($xmlReader->name) {
62 | case Constants::MESSAGE_ID:
63 | $xmlReader->read();
64 | if ($xmlReader->nodeType == \XMLReader::TEXT)
65 | {
66 | $messageId = $xmlReader->value;
67 | }
68 | break;
69 | case Constants::MESSAGE_BODY_MD5:
70 | $xmlReader->read();
71 | if ($xmlReader->nodeType == \XMLReader::TEXT)
72 | {
73 | $messageBodyMD5 = $xmlReader->value;
74 | }
75 | break;
76 | case Constants::ERROR_CODE:
77 | $xmlReader->read();
78 | if ($xmlReader->nodeType == \XMLReader::TEXT)
79 | {
80 | $errorCode = $xmlReader->value;
81 | }
82 | break;
83 | case Constants::ERROR_MESSAGE:
84 | $xmlReader->read();
85 | if ($xmlReader->nodeType == \XMLReader::TEXT)
86 | {
87 | $errorMessage = $xmlReader->value;
88 | }
89 | break;
90 | }
91 | break;
92 | case \XMLReader::END_ELEMENT:
93 | if ($xmlReader->name == 'Message')
94 | {
95 | if ($messageId != NULL)
96 | {
97 | return new SendMessageResponseItem(TRUE, $messageId, $messageBodyMD5);
98 | }
99 | else
100 | {
101 | return new SendMessageResponseItem(FALSE, $errorCode, $errorMessage);
102 | }
103 | }
104 | break;
105 | }
106 | }
107 |
108 | if ($messageId != NULL)
109 | {
110 | return new SendMessageResponseItem(TRUE, $messageId, $messageBodyMD5);
111 | }
112 | else
113 | {
114 | return new SendMessageResponseItem(FALSE, $errorCode, $errorMessage);
115 | }
116 | }
117 | }
118 |
119 | ?>
120 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/ListTopicResponse.php:
--------------------------------------------------------------------------------
1 | topicNames = array();
16 | $this->nextMarker = NULL;
17 | }
18 |
19 | public function isFinished()
20 | {
21 | return $this->nextMarker == NULL;
22 | }
23 |
24 | public function getTopicNames()
25 | {
26 | return $this->topicNames;
27 | }
28 |
29 | public function getNextMarker()
30 | {
31 | return $this->nextMarker;
32 | }
33 |
34 | public function parseResponse($statusCode, $content)
35 | {
36 | $this->statusCode = $statusCode;
37 | if ($statusCode != 200) {
38 | $this->parseErrorResponse($statusCode, $content);
39 | return;
40 | }
41 |
42 | $this->succeed = TRUE;
43 | $xmlReader = new \XMLReader();
44 | try
45 | {
46 | $xmlReader->XML($content);
47 | while ($xmlReader->read())
48 | {
49 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
50 | {
51 | switch ($xmlReader->name) {
52 | case 'TopicURL':
53 | $xmlReader->read();
54 | if ($xmlReader->nodeType == \XMLReader::TEXT)
55 | {
56 | $topicName = $this->getTopicNameFromTopicURL($xmlReader->value);
57 | $this->topicNames[] = $topicName;
58 | }
59 | break;
60 | case 'NextMarker':
61 | $xmlReader->read();
62 | if ($xmlReader->nodeType == \XMLReader::TEXT)
63 | {
64 | $this->nextMarker = $xmlReader->value;
65 | }
66 | break;
67 | }
68 | }
69 | }
70 | }
71 | catch (\Exception $e)
72 | {
73 | throw new MnsException($statusCode, $e->getMessage(), $e);
74 | }
75 | catch (\Throwable $t)
76 | {
77 | throw new MnsException($statusCode, $t->getMessage());
78 | }
79 | }
80 |
81 | private function getTopicNameFromTopicURL($topicURL)
82 | {
83 | $pieces = explode("/", $topicURL);
84 | if (count($pieces) == 5)
85 | {
86 | return $pieces[4];
87 | }
88 | return "";
89 | }
90 |
91 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
92 | {
93 | $this->succeed = FALSE;
94 | $xmlReader = new \XMLReader();
95 | try
96 | {
97 | $xmlReader->XML($content);
98 | $result = XMLParser::parseNormalError($xmlReader);
99 |
100 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
101 | }
102 | catch (\Exception $e)
103 | {
104 | if ($exception != NULL)
105 | {
106 | throw $exception;
107 | }
108 | elseif ($e instanceof MnsException)
109 | {
110 | throw $e;
111 | }
112 | else
113 | {
114 | throw new MnsException($statusCode, $e->getMessage());
115 | }
116 | }
117 | catch (\Throwable $t)
118 | {
119 | throw new MnsException($statusCode, $t->getMessage());
120 | }
121 | }
122 | }
123 |
124 | ?>
125 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Topic.php:
--------------------------------------------------------------------------------
1 | client = $client;
34 | $this->topicName = $topicName;
35 | }
36 |
37 | public function getTopicName()
38 | {
39 | return $this->topicName;
40 | }
41 |
42 | public function setAttribute(TopicAttributes $attributes)
43 | {
44 | $request = new SetTopicAttributeRequest($this->topicName, $attributes);
45 | $response = new SetTopicAttributeResponse();
46 | return $this->client->sendRequest($request, $response);
47 | }
48 |
49 | public function getAttribute()
50 | {
51 | $request = new GetTopicAttributeRequest($this->topicName);
52 | $response = new GetTopicAttributeResponse();
53 | return $this->client->sendRequest($request, $response);
54 | }
55 |
56 | public function publishMessage(PublishMessageRequest $request)
57 | {
58 | $request->setTopicName($this->topicName);
59 | $response = new PublishMessageResponse();
60 | return $this->client->sendRequest($request, $response);
61 | }
62 |
63 | public function subscribe(SubscriptionAttributes $attributes)
64 | {
65 | $attributes->setTopicName($this->topicName);
66 | $request = new SubscribeRequest($attributes);
67 | $response = new SubscribeResponse();
68 | return $this->client->sendRequest($request, $response);
69 | }
70 |
71 | public function unsubscribe($subscriptionName)
72 | {
73 | $request = new UnsubscribeRequest($this->topicName, $subscriptionName);
74 | $response = new UnsubscribeResponse();
75 | return $this->client->sendRequest($request, $response);
76 | }
77 |
78 | public function getSubscriptionAttribute($subscriptionName)
79 | {
80 | $request = new GetSubscriptionAttributeRequest($this->topicName, $subscriptionName);
81 | $response = new GetSubscriptionAttributeResponse();
82 | return $this->client->sendRequest($request, $response);
83 | }
84 |
85 | public function setSubscriptionAttribute(UpdateSubscriptionAttributes $attributes)
86 | {
87 | $attributes->setTopicName($this->topicName);
88 | $request = new SetSubscriptionAttributeRequest($attributes);
89 | $response = new SetSubscriptionAttributeResponse();
90 | return $this->client->sendRequest($request, $response);
91 | }
92 |
93 | public function listSubscription($retNum = NULL, $prefix = NULL, $marker = NULL)
94 | {
95 | $request = new ListSubscriptionRequest($this->topicName, $retNum, $prefix, $marker);
96 | $response = new ListSubscriptionResponse();
97 | return $this->client->sendRequest($request, $response);
98 | }
99 | }
100 |
101 | ?>
102 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/ListSubscriptionResponse.php:
--------------------------------------------------------------------------------
1 | SubscriptionNames = array();
16 | $this->nextMarker = NULL;
17 | }
18 |
19 | public function isFinished()
20 | {
21 | return $this->nextMarker == NULL;
22 | }
23 |
24 | public function getSubscriptionNames()
25 | {
26 | return $this->SubscriptionNames;
27 | }
28 |
29 | public function getNextMarker()
30 | {
31 | return $this->nextMarker;
32 | }
33 |
34 | public function parseResponse($statusCode, $content)
35 | {
36 | $this->statusCode = $statusCode;
37 | if ($statusCode != 200) {
38 | $this->parseErrorResponse($statusCode, $content);
39 | return;
40 | }
41 |
42 | $this->succeed = TRUE;
43 | $xmlReader = new \XMLReader();
44 | try {
45 | $xmlReader->XML($content);
46 | while ($xmlReader->read())
47 | {
48 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
49 | {
50 | switch ($xmlReader->name) {
51 | case 'SubscriptionURL':
52 | $xmlReader->read();
53 | if ($xmlReader->nodeType == \XMLReader::TEXT)
54 | {
55 | $subscriptionName = $this->getSubscriptionNameFromSubscriptionURL($xmlReader->value);
56 | $this->SubscriptionNames[] = $subscriptionName;
57 | }
58 | break;
59 | case 'NextMarker':
60 | $xmlReader->read();
61 | if ($xmlReader->nodeType == \XMLReader::TEXT)
62 | {
63 | $this->nextMarker = $xmlReader->value;
64 | }
65 | break;
66 | }
67 | }
68 | }
69 | }
70 | catch (\Exception $e)
71 | {
72 | throw new MnsException($statusCode, $e->getMessage(), $e);
73 | }
74 | catch (\Throwable $t)
75 | {
76 | throw new MnsException($statusCode, $t->getMessage());
77 | }
78 | }
79 |
80 | private function getSubscriptionNameFromSubscriptionURL($subscriptionURL)
81 | {
82 | $pieces = explode("/", $subscriptionURL);
83 | if (count($pieces) == 7)
84 | {
85 | return $pieces[6];
86 | }
87 | return "";
88 | }
89 |
90 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
91 | {
92 | $this->succeed = FALSE;
93 | $xmlReader = new \XMLReader();
94 | try
95 | {
96 | $xmlReader->XML($content);
97 | $result = XMLParser::parseNormalError($xmlReader);
98 |
99 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
100 | }
101 | catch (\Exception $e)
102 | {
103 | if ($exception != NULL)
104 | {
105 | throw $exception;
106 | }
107 | elseif ($e instanceof MnsException)
108 | {
109 | throw $e;
110 | }
111 | else
112 | {
113 | throw new MnsException($statusCode, $e->getMessage());
114 | }
115 | }
116 | catch (\Throwable $t)
117 | {
118 | throw new MnsException($statusCode, $t->getMessage());
119 | }
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/src/Jobs/MnsJob.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Jobs;
16 |
17 | use AliyunMNS\Responses\ReceiveMessageResponse;
18 | use Illuminate\Container\Container;
19 | use Illuminate\Contracts\Queue\Job as JobContract;
20 | use Illuminate\Queue\Jobs\Job;
21 | use LaravelMns\MnsAdapter;
22 |
23 | class MnsJob extends Job implements JobContract
24 | {
25 | /**
26 | * The class name of the job.
27 | *
28 | * @var string
29 | */
30 | protected $job;
31 |
32 | /**
33 | * The queue message data.
34 | *
35 | * @var string
36 | */
37 | protected $data;
38 |
39 | /**
40 | * @var \LaravelMns\MnsAdapter
41 | */
42 | private $mns;
43 |
44 | /**
45 | * Create a new job instance.
46 | *
47 | * @param \Illuminate\Container\Container $container
48 | * @param \LaravelMns\MnsAdapter $mns
49 | * @param string $queue
50 | * @param \AliyunMNS\Responses\ReceiveMessageResponse $job
51 | */
52 | public function __construct(
53 | Container $container,
54 | MnsAdapter $mns,
55 | $queue,
56 | ReceiveMessageResponse $job
57 | ) {
58 | $this->container = $container;
59 | $this->mns = $mns;
60 | $this->queue = $queue;
61 | $this->job = $job;
62 | }
63 |
64 | /**
65 | * Fire the job.
66 | *
67 | * @return void
68 | */
69 | public function fire()
70 | {
71 | if (method_exists($this, 'resolveAndFire')) {
72 | $this->resolveAndFire(json_decode($this->getRawBody(), true));
73 | return;
74 | }
75 | parent::fire();
76 | }
77 |
78 | /**
79 | * Get the raw body string for the job.
80 | *
81 | * @return string
82 | */
83 | public function getRawBody()
84 | {
85 | return $this->job->getMessageBody();
86 | }
87 |
88 | /**
89 | * Delete the job from the queue.
90 | */
91 | public function delete()
92 | {
93 | parent::delete();
94 | $receiptHandle = $this->job->getReceiptHandle();
95 | $this->mns->deleteMessage($receiptHandle);
96 | }
97 |
98 | /**
99 | * Release the job back into the queue.
100 | *
101 | * @param int $delay
102 | */
103 | public function release($delay = 0)
104 | {
105 | // 默认情况下 Laravel 将以 delay 0 来更改可见性,其预期的是使用队列服务默认的
106 | // 下次可消费时间,但 Aliyun MNS PHP SDK 的接口要求这个值必须大于 0,
107 | // 指从现在起,多久后消息变为可消费。
108 | $delay = $delay > 0
109 | ? $delay
110 | : $this->fromNowToNextVisibleTime($this->job->getNextVisibleTime());
111 | parent::release($delay);
112 | $this->mns->changeMessageVisibility(
113 | $this->job->getReceiptHandle(),
114 | $delay
115 | );
116 | }
117 |
118 | /**
119 | * Get the number of times the job has been attempted.
120 | *
121 | * @return int
122 | */
123 | public function attempts()
124 | {
125 | return (int) $this->job->getDequeueCount();
126 | }
127 |
128 | /**
129 | * 从现在起到消息变为可消费的秒数。
130 | *
131 | * @param int $nextVisibleTime 下次可消费时的微妙时间戳。
132 | *
133 | * @return int
134 | */
135 | private function fromNowToNextVisibleTime($nextVisibleTime)
136 | {
137 | $nowInMilliSeconds = 1000 * microtime(true);
138 | $fromNowToNextVisibleTime = $nextVisibleTime - $nowInMilliSeconds;
139 |
140 | return (int) ($fromNowToNextVisibleTime / 1000);
141 | }
142 |
143 | /**
144 | * Get the IoC container instance.
145 | *
146 | * @return \Illuminate\Container\Container
147 | */
148 | public function getContainer()
149 | {
150 | return $this->container;
151 | }
152 | }
153 |
--------------------------------------------------------------------------------
/tests/Jobs/MnsJobTest.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Test;
16 |
17 | use AliyunMNS\Responses\ReceiveMessageResponse;
18 | use Carbon\Carbon;
19 | use LaravelMns\MnsAdapter;
20 | use Mockery as m;
21 |
22 | class MnsJobTest extends AbstractTestCase
23 | {
24 | public function tearDown()
25 | {
26 | parent::tearDown(); // TODO: Change the autogenerated stub
27 | }
28 |
29 | public function setUp()
30 | {
31 | parent::setUp(); // TODO: Change the autogenerated stub
32 |
33 | $this->default = 'queue';
34 | $this->receiptHandle = 'ReceiptHandleXXXX';
35 | $this->delay = 3600;
36 |
37 | $this->mockedJob = 'job';
38 | $this->mockedData = ['data'];
39 | $this->mockedPayload = json_encode(['job' => $this->mockedJob, 'data' => $this->mockedData]);
40 |
41 | $this->mockedContainer = m::mock(\Illuminate\Container\Container::class);
42 | $this->mockedResponse = m::mock(ReceiveMessageResponse::class);
43 | $this->mockedAdapter = m::mock(MnsAdapter::class);
44 | }
45 |
46 | public function testFireProperlyCallJobHandler()
47 | {
48 | $job = $this->getJob();
49 | $job->getContainer()->shouldReceive('make')
50 | ->once()
51 | ->with('job')
52 | ->andReturn($handler = m::mock('stdClass'));
53 | $this->mockedResponse->shouldReceive('getMessageBody')
54 | ->andReturn($this->mockedPayload);
55 | $handler->shouldReceive('fire')
56 | ->once()
57 | ->with($job, ['data']);
58 | $job->fire();
59 | }
60 |
61 | public function testFireProperlyThrowWhenJobIsNotInsertByLaravel()
62 | {
63 | $this->mockedPayload = 'wrong payload.';
64 | $job = $this->getJob();
65 | $this->mockedResponse->shouldReceive('getMessageBody')
66 | ->andReturn($this->mockedPayload);
67 | $this->setExpectedException('InvalidArgumentException');
68 | $job->fire();
69 | }
70 |
71 | public function testDeleteProperlyRemovesFromMns()
72 | {
73 | $job = $this->getJob();
74 | $this->mockedResponse->shouldReceive('getReceiptHandle')
75 | ->once()
76 | ->andReturn($this->receiptHandle);
77 | $this->mockedAdapter->shouldReceive('deleteMessage')
78 | ->with($this->receiptHandle)
79 | ->andReturn('true');
80 | $job->delete($this->receiptHandle);
81 | $this->assertTrue($job->isDeleted());
82 | }
83 |
84 | public function testReleaseProperlySetVisibleTimeToMns()
85 | {
86 | $job = $this->getJob();
87 | $this->mockedResponse->shouldReceive('getReceiptHandle')
88 | ->twice()
89 | ->andReturn($this->receiptHandle);
90 | $this->mockedAdapter->shouldReceive('changeMessageVisibility')
91 | ->once()
92 | ->with($this->receiptHandle, $this->delay)
93 | ->andReturn('true');
94 | $job->release($this->delay);
95 | $this->mockedResponse->shouldReceive('getNextVisibleTime')->once();
96 | $this->mockedAdapter->shouldReceive('changeMessageVisibility')->once();
97 | $job->release();
98 | $this->assertTrue($job->isReleased());
99 | }
100 |
101 | public function testAttemptsCanGetDequeueCount()
102 | {
103 | $job = $this->getJob();
104 | $this->mockedResponse->shouldReceive('getDequeueCount')->andReturn(5);
105 | $attempts = $job->attempts();
106 | $this->assertEquals(5, $attempts);
107 | }
108 |
109 | private function getJob()
110 | {
111 | return new \LaravelMns\Jobs\MnsJob(
112 | $this->mockedContainer,
113 | $this->mockedAdapter,
114 | $this->default,
115 | $this->mockedResponse
116 | );
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/src/MnsQueue.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns;
16 |
17 | use AliyunMNS\Exception\MessageNotExistException;
18 | use AliyunMNS\Requests\SendMessageRequest;
19 | use Illuminate\Contracts\Queue\Queue as QueueContract;
20 | use Illuminate\Queue\Queue;
21 |
22 | class MnsQueue extends Queue implements QueueContract
23 | {
24 | /**
25 | * @var MnsAdapter
26 | */
27 | protected $mns;
28 |
29 | /**
30 | * Custom callable to handle jobs.
31 | *
32 | * @var callable
33 | */
34 | protected $jobCreator;
35 |
36 | /**
37 | * The name of default queue.
38 | *
39 | * @var string
40 | */
41 | protected $default;
42 |
43 | public function __construct(MnsAdapter $mns)
44 | {
45 | $this->mns = $mns;
46 |
47 | $this->default = $this->mns->getQueueName();
48 | }
49 |
50 | /**
51 | * Push a new job onto the queue.
52 | *
53 | * @param string $job
54 | * @param mixed $data
55 | * @param string $queue
56 | *
57 | * @return mixed
58 | */
59 | public function push($job, $data = '', $queue = null)
60 | {
61 | $payload = $this->createPayload($job, $data);
62 |
63 | return $this->pushRaw($payload, $queue);
64 | }
65 |
66 | /**
67 | * Push a raw payload onto the queue.
68 | *
69 | * @param string $payload
70 | * @param string $queue
71 | * @param array $options
72 | *
73 | * @return mixed
74 | */
75 | public function pushRaw($payload, $queue = null, array $options = [])
76 | {
77 | $message = new SendMessageRequest($payload);
78 | $response = $this->mns->setQueue($queue)->sendMessage($message);
79 |
80 | return $response->getMessageId();
81 | }
82 |
83 | /**
84 | * Push a new job onto the queue after a delay.
85 | *
86 | * @param \DateTime|int $delay
87 | * @param string $job
88 | * @param mixed $data
89 | * @param string $queue
90 | *
91 | * @return mixed
92 | */
93 | public function later($delay, $job, $data = '', $queue = null)
94 | {
95 | $seconds = $this->getSeconds($delay);
96 | $payload = $this->createPayload($job, $data);
97 | $message = new SendMessageRequest($payload, $seconds);
98 | $response = $this->mns->setQueue($queue)->sendMessage($message);
99 |
100 | return $response->getMessageId();
101 | }
102 |
103 | /**
104 | * Pop the next job off of the queue.
105 | *
106 | * @param string $queue
107 | *
108 | * @return \Illuminate\Queue\Jobs\Job|null
109 | */
110 | public function pop($queue = null)
111 | {
112 | $queue = $this->getDefaultIfNull($queue);
113 |
114 | try {
115 | $response = $this->mns->setQueue($queue)->receiveMessage();
116 | } catch (MessageNotExistException $e) {
117 | $response = null;
118 | }
119 |
120 | if ($response) {
121 | if ($this->jobCreator) {
122 | return call_user_func($this->jobCreator, $this->container, $queue, $response);
123 | } else {
124 | return new Jobs\MnsJob($this->container, $this->mns, $queue, $response);
125 | }
126 | }
127 |
128 | return null;
129 | }
130 |
131 | /**
132 | * 获取默认队列名(如果当前队列名为 null)。
133 | *
134 | * @param string|null $wanted
135 | *
136 | * @return string
137 | */
138 | public function getDefaultIfNull($wanted)
139 | {
140 | return $wanted ? $wanted : $this->default;
141 | }
142 |
143 | /**
144 | * 设置使用特定的回调函数处理 job。
145 | *
146 | * @param callable $callback
147 | *
148 | * @return $this
149 | */
150 | public function createJobsUsing(callable $callback)
151 | {
152 | $this->jobCreator = $callback;
153 |
154 | return $this;
155 | }
156 |
157 | /**
158 | * Get the size of the queue.
159 | *
160 | * @param string $queue
161 | * @return int
162 | */
163 | public function size($queue = null)
164 | {
165 | throw new NotImplementedException('size方法没有实现');
166 | }
167 | }
168 |
--------------------------------------------------------------------------------
/src/MnsAdapter.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns;
16 |
17 | use AliyunMNS\Client as MnsClient;
18 |
19 | /**
20 | * Class MnsAdapter.
21 | *
22 | * @method string getQueueName()
23 | * @method \AliyunMNS\Responses\SetQueueAttributeResponse setAttribute(\AliyunMNS\Model\QueueAttributes $attributes)
24 | * @method \AliyunMNS\Responses\MnsPromise setAttributeAsync(\AliyunMNS\Model\QueueAttributes $attributes, \AliyunMNS\AsyncCallback $callback = null)
25 | * @method \AliyunMNS\Responses\GetQueueAttributeResponse getAttribute(\AliyunMNS\Model\QueueAttributes $attributes)
26 | * @method \AliyunMNS\Responses\MnsPromise getAttributeAsync(\AliyunMNS\Model\QueueAttributes $attributes, \AliyunMNS\AsyncCallback $callback = null)
27 | * @method \AliyunMNS\Responses\SendMessageResponse sendMessage(\AliyunMNS\Requests\SendMessageRequest $request)
28 | * @method \AliyunMNS\Responses\MnsPromise sendMessageAsync(\AliyunMNS\Requests\SendMessageRequest $request, \AliyunMNS\AsyncCallback $callback = null)
29 | * @method \AliyunMNS\Responses\PeekMessageResponse peekMessage()
30 | * @method \AliyunMNS\Responses\MnsPromise peekMessageAsync(\AliyunMNS\AsyncCallback $callback = null)
31 | * @method \AliyunMNS\Responses\ReceiveMessageResponse receiveMessage()
32 | * @method \AliyunMNS\Responses\MnsPromise receiveMessageAsync(\AliyunMNS\AsyncCallback $callback = null)
33 | * @method \AliyunMNS\Responses\ReceiveMessageResponse deleteMessage(string $receiptHandle)
34 | * @method \AliyunMNS\Responses\MnsPromise deleteMessageAsync(string $receiptHandle, \AliyunMNS\AsyncCallback $callback = null)
35 | * @method \AliyunMNS\Responses\ChangeMessageVisibilityResponse changeMessageVisibility(string $receiptHandle, int $visibilityTimeout)
36 | * @method \AliyunMNS\Responses\BatchSendMessageResponse batchSendMessage(\AliyunMNS\Requests\BatchSendMessageRequest $request)
37 | * @method \AliyunMNS\Responses\MnsPromise batchSendMessageAsync(\AliyunMNS\Requests\BatchSendMessageRequest $request, \AliyunMNS\AsyncCallback $callback = null)
38 | * @method \AliyunMNS\Responses\BatchReceiveMessageResponse batchReceiveMessage(\AliyunMNS\Requests\BatchReceiveMessageRequest $request)
39 | * @method \AliyunMNS\Responses\MnsPromise batchReceiveMessageAsync(\AliyunMNS\Requests\BatchReceiveMessageRequest $request, \AliyunMNS\AsyncCallback $callback = null)
40 | * @method \AliyunMNS\Responses\BatchPeekMessageResponse batchPeekMessage(\AliyunMNS\Requests\BatchPeekMessageRequest $request)
41 | * @method \AliyunMNS\Responses\MnsPromise batchPeekMessageAsync(\AliyunMNS\Requests\BatchPeekMessageRequest $request, \AliyunMNS\AsyncCallback $callback = null)
42 | * @method \AliyunMNS\Responses\BatchDeleteMessageResponse batchDeleteMessage(\AliyunMNS\Requests\BatchDeleteMessageRequest $request)
43 | * @method \AliyunMNS\Responses\MnsPromise batchDeleteMessageAsync(\AliyunMNS\Requests\BatchDeleteMessageRequest $request, \AliyunMNS\AsyncCallback $callback = null)
44 | */
45 | class MnsAdapter
46 | {
47 | /**
48 | * @var string 适配的阿里云消息服务 SDK 版本,仅用作记录。
49 | *
50 | * @see https://help.aliyun.com/document_detail/mns/sdk/php-sdk.html
51 | */
52 | const ADAPTER_TO_ALIYUN_MNS_SDK_VERSION = '1.3.0@2016-02-25';
53 |
54 | /**
55 | * Aliyun MNS SDK Client.
56 | *
57 | * @var MnsClient
58 | */
59 | private $client;
60 |
61 | /**
62 | * Aliyun MNS SDK Queue.
63 | *
64 | * @var \AliyunMNS\Queue
65 | */
66 | private $queue;
67 |
68 | public function __construct(MnsClient $client, $queueName)
69 | {
70 | $this->client = $client;
71 | $this->setQueue($queueName);
72 | }
73 |
74 | /**
75 | * 转化 \AliyunMNS\Client 对象,
76 | * 可以通过本对象直接访问(而无需通过 \AliyunMNS\Client 对象构建)。
77 | *
78 | * @param $method
79 | * @param $parameters
80 | *
81 | * @return mixed
82 | */
83 | public function __call($method, $parameters)
84 | {
85 | return call_user_func_array([$this->queue, $method], $parameters);
86 | }
87 |
88 | /**
89 | * 将队列设定为特定队列。
90 | *
91 | * @param $queue
92 | *
93 | * @return self
94 | */
95 | public function setQueue($queue)
96 | {
97 | if (null !== $queue) {
98 | $this->queue = $this->client->getQueueRef($queue);
99 | }
100 |
101 | return $this;
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Responses/BatchSendMessageResponse.php:
--------------------------------------------------------------------------------
1 | sendMessageResponseItems = array();
22 | }
23 |
24 | public function getSendMessageResponseItems()
25 | {
26 | return $this->sendMessageResponseItems;
27 | }
28 |
29 | public function parseResponse($statusCode, $content)
30 | {
31 | $this->statusCode = $statusCode;
32 | if ($statusCode == 201) {
33 | $this->succeed = TRUE;
34 | } else {
35 | $this->parseErrorResponse($statusCode, $content);
36 | }
37 |
38 | $xmlReader = new \XMLReader();
39 | try {
40 | $xmlReader->XML($content);
41 | while ($xmlReader->read())
42 | {
43 | if ($xmlReader->nodeType == \XMLReader::ELEMENT && $xmlReader->name == 'Message') {
44 | $this->sendMessageResponseItems[] = SendMessageResponseItem::fromXML($xmlReader);
45 | }
46 | }
47 | } catch (\Exception $e) {
48 | throw new MnsException($statusCode, $e->getMessage(), $e);
49 | } catch (\Throwable $t) {
50 | throw new MnsException($statusCode, $t->getMessage());
51 | }
52 | }
53 |
54 | public function parseErrorResponse($statusCode, $content, MnsException $exception = NULL)
55 | {
56 | $this->succeed = FALSE;
57 | $xmlReader = new \XMLReader();
58 | try {
59 | $xmlReader->XML($content);
60 | while ($xmlReader->read())
61 | {
62 | if ($xmlReader->nodeType == \XMLReader::ELEMENT) {
63 | switch ($xmlReader->name) {
64 | case Constants::ERROR:
65 | $this->parseNormalErrorResponse($xmlReader);
66 | break;
67 | default: // case Constants::Messages
68 | $this->parseBatchSendErrorResponse($xmlReader);
69 | break;
70 | }
71 | }
72 | }
73 | } catch (\Exception $e) {
74 | if ($exception != NULL) {
75 | throw $exception;
76 | } elseif($e instanceof MnsException) {
77 | throw $e;
78 | } else {
79 | throw new MnsException($statusCode, $e->getMessage());
80 | }
81 | } catch (\Throwable $t) {
82 | throw new MnsException($statusCode, $t->getMessage());
83 | }
84 | }
85 |
86 | private function parseBatchSendErrorResponse($xmlReader)
87 | {
88 | $ex = new BatchSendFailException($this->statusCode, "BatchSendMessage Failed For Some Messages");
89 | while ($xmlReader->read())
90 | {
91 | if ($xmlReader->nodeType == \XMLReader::ELEMENT && $xmlReader->name == 'Message') {
92 | $ex->addSendMessageResponseItem( SendMessageResponseItem::fromXML($xmlReader));
93 | }
94 | }
95 | throw $ex;
96 | }
97 |
98 | private function parseNormalErrorResponse($xmlReader)
99 | {
100 | $result = XMLParser::parseNormalError($xmlReader);
101 | if ($result['Code'] == Constants::QUEUE_NOT_EXIST)
102 | {
103 | throw new QueueNotExistException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
104 | }
105 | if ($result['Code'] == Constants::INVALID_ARGUMENT)
106 | {
107 | throw new InvalidArgumentException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
108 | }
109 | if ($result['Code'] == Constants::MALFORMED_XML)
110 | {
111 | throw new MalformedXMLException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
112 | }
113 | throw new MnsException($statusCode, $result['Message'], $exception, $result['Code'], $result['RequestId'], $result['HostId']);
114 | }
115 | }
116 |
117 | ?>
118 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/TopicAttributes.php:
--------------------------------------------------------------------------------
1 | maximumMessageSize = $maximumMessageSize;
29 | $this->messageRetentionPeriod = $messageRetentionPeriod;
30 |
31 | $this->topicName = $topicName;
32 | $this->createTime = $createTime;
33 | $this->lastModifyTime = $lastModifyTime;
34 | }
35 |
36 | public function setMaximumMessageSize($maximumMessageSize)
37 | {
38 | $this->maximumMessageSize = $maximumMessageSize;
39 | }
40 |
41 | public function getMaximumMessageSize()
42 | {
43 | return $this->maximumMessageSize;
44 | }
45 |
46 | public function setMessageRetentionPeriod($messageRetentionPeriod)
47 | {
48 | $this->messageRetentionPeriod = $messageRetentionPeriod;
49 | }
50 |
51 | public function getMessageRetentionPeriod()
52 | {
53 | return $this->messageRetentionPeriod;
54 | }
55 |
56 | public function getTopicName()
57 | {
58 | return $this->topicName;
59 | }
60 |
61 | public function getCreateTime()
62 | {
63 | return $this->createTime;
64 | }
65 |
66 | public function getLastModifyTime()
67 | {
68 | return $this->lastModifyTime;
69 | }
70 |
71 | public function writeXML(\XMLWriter $xmlWriter)
72 | {
73 | if ($this->maximumMessageSize != NULL)
74 | {
75 | $xmlWriter->writeElement(Constants::MAXIMUM_MESSAGE_SIZE, $this->maximumMessageSize);
76 | }
77 | if ($this->messageRetentionPeriod != NULL)
78 | {
79 | $xmlWriter->writeElement(Constants::MESSAGE_RETENTION_PERIOD, $this->messageRetentionPeriod);
80 | }
81 | }
82 |
83 | static public function fromXML(\XMLReader $xmlReader)
84 | {
85 | $maximumMessageSize = NULL;
86 | $messageRetentionPeriod = NULL;
87 | $topicName = NULL;
88 | $createTime = NULL;
89 | $lastModifyTime = NULL;
90 |
91 | while ($xmlReader->read())
92 | {
93 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
94 | {
95 | switch ($xmlReader->name) {
96 | case 'MaximumMessageSize':
97 | $xmlReader->read();
98 | if ($xmlReader->nodeType == \XMLReader::TEXT)
99 | {
100 | $maximumMessageSize = $xmlReader->value;
101 | }
102 | break;
103 | case 'MessageRetentionPeriod':
104 | $xmlReader->read();
105 | if ($xmlReader->nodeType == \XMLReader::TEXT)
106 | {
107 | $messageRetentionPeriod = $xmlReader->value;
108 | }
109 | break;
110 | case 'TopicName':
111 | $xmlReader->read();
112 | if ($xmlReader->nodeType == \XMLReader::TEXT)
113 | {
114 | $topicName = $xmlReader->value;
115 | }
116 | break;
117 | case 'CreateTime':
118 | $xmlReader->read();
119 | if ($xmlReader->nodeType == \XMLReader::TEXT)
120 | {
121 | $createTime = $xmlReader->value;
122 | }
123 | break;
124 | case 'LastModifyTime':
125 | $xmlReader->read();
126 | if ($xmlReader->nodeType == \XMLReader::TEXT)
127 | {
128 | $lastModifyTime = $xmlReader->value;
129 | }
130 | break;
131 | }
132 | }
133 | }
134 |
135 | $attributes = new TopicAttributes(
136 | $maximumMessageSize,
137 | $messageRetentionPeriod,
138 | $topicName,
139 | $createTime,
140 | $lastModifyTime);
141 | return $attributes;
142 | }
143 | }
144 |
145 | ?>
146 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Http/HttpClient.php:
--------------------------------------------------------------------------------
1 | accessId = $accessId;
31 | $this->accessKey = $accessKey;
32 | $this->client = new \GuzzleHttp\Client([
33 | 'base_uri' => $endPoint,
34 | 'defaults' => [
35 | 'headers' => [
36 | 'Host' => $endPoint
37 | ],
38 | 'proxy' => $config->getProxy(),
39 | 'expect' => $config->getExpectContinue(),
40 | 'timeout' => $config->getRequestTimeout()
41 | ]
42 | ]);
43 | $this->securityToken = $securityToken;
44 | }
45 |
46 | private function addRequiredHeaders(BaseRequest &$request)
47 | {
48 | $body = $request->generateBody();
49 | $queryString = $request->generateQueryString();
50 |
51 | $request->setBody($body);
52 | $request->setQueryString($queryString);
53 |
54 | if ($body != NULL)
55 | {
56 | $request->setHeader(Constants::CONTENT_LENGTH, strlen($body));
57 | }
58 | $request->setHeader('Date', gmdate(Constants::GMT_DATE_FORMAT));
59 | if (!$request->isHeaderSet(Constants::CONTENT_TYPE))
60 | {
61 | $request->setHeader(Constants::CONTENT_TYPE, 'text/xml');
62 | }
63 | $request->setHeader(Constants::MNS_VERSION_HEADER, Constants::MNS_VERSION);
64 |
65 | if ($this->securityToken != NULL)
66 | {
67 | $request->setHeader(Constants::SECURITY_TOKEN, $this->securityToken);
68 | }
69 |
70 | $sign = Signature::SignRequest($this->accessKey, $request);
71 | $request->setHeader(Constants::AUTHORIZATION,
72 | Constants::MNS . " " . $this->accessId . ":" . $sign);
73 | }
74 |
75 | public function sendRequestAsync(BaseRequest $request,
76 | BaseResponse &$response, AsyncCallback $callback = NULL)
77 | {
78 | $promise = $this->sendRequestAsyncInternal($request, $response, $callback);
79 | return new MnsPromise($promise, $response);
80 | }
81 |
82 | public function sendRequest(BaseRequest $request, BaseResponse &$response)
83 | {
84 | $promise = $this->sendRequestAsync($request, $response);
85 | return $promise->wait();
86 | }
87 |
88 | private function sendRequestAsyncInternal(BaseRequest &$request, BaseResponse &$response, AsyncCallback $callback = NULL)
89 | {
90 | $this->addRequiredHeaders($request);
91 |
92 | $parameters = array('exceptions' => false, 'http_errors' => false);
93 | $queryString = $request->getQueryString();
94 | $body = $request->getBody();
95 | if ($queryString != NULL) {
96 | $parameters['query'] = $queryString;
97 | }
98 | if ($body != NULL) {
99 | $parameters['body'] = $body;
100 | }
101 |
102 | $request = new Request(strtoupper($request->getMethod()),
103 | $request->getResourcePath(), $request->getHeaders());
104 | try
105 | {
106 | if ($callback != NULL)
107 | {
108 | return $this->client->sendAsync($request, $parameters)->then(
109 | function ($res) use (&$response, $callback) {
110 | try {
111 | $response->parseResponse($res->getStatusCode(), $res->getBody());
112 | $callback->onSucceed($response);
113 | } catch (MnsException $e) {
114 | $callback->onFailed($e);
115 | }
116 | }
117 | );
118 | }
119 | else
120 | {
121 | return $this->client->sendAsync($request, $parameters);
122 | }
123 | }
124 | catch (TransferException $e)
125 | {
126 | $message = $e->getMessage();
127 | if ($e->hasResponse()) {
128 | $message = $e->getResponse()->getBody();
129 | }
130 | throw new MnsException($e->getCode(), $message, $e);
131 | }
132 | }
133 | }
134 |
135 | ?>
136 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/Message.php:
--------------------------------------------------------------------------------
1 | messageId = $messageId;
14 | $this->messageBodyMD5 = $messageBodyMD5;
15 | $this->messageBody = $messageBody;
16 | $this->enqueueTime = $enqueueTime;
17 | $this->nextVisibleTime = $nextVisibleTime;
18 | $this->firstDequeueTime = $firstDequeueTime;
19 | $this->dequeueCount = $dequeueCount;
20 | $this->priority = $priority;
21 | $this->receiptHandle = $receiptHandle;
22 | }
23 |
24 | static public function fromXML(\XMLReader $xmlReader, $base64)
25 | {
26 | $messageId = NULL;
27 | $messageBodyMD5 = NULL;
28 | $messageBody = NULL;
29 | $enqueueTime = NULL;
30 | $nextVisibleTime = NULL;
31 | $firstDequeueTime = NULL;
32 | $dequeueCount = NULL;
33 | $priority = NULL;
34 | $receiptHandle = NULL;
35 |
36 | while ($xmlReader->read())
37 | {
38 | switch ($xmlReader->nodeType)
39 | {
40 | case \XMLReader::ELEMENT:
41 | switch ($xmlReader->name) {
42 | case Constants::MESSAGE_ID:
43 | $xmlReader->read();
44 | if ($xmlReader->nodeType == \XMLReader::TEXT)
45 | {
46 | $messageId = $xmlReader->value;
47 | }
48 | break;
49 | case Constants::MESSAGE_BODY_MD5:
50 | $xmlReader->read();
51 | if ($xmlReader->nodeType == \XMLReader::TEXT)
52 | {
53 | $messageBodyMD5 = $xmlReader->value;
54 | }
55 | break;
56 | case Constants::MESSAGE_BODY:
57 | $xmlReader->read();
58 | if ($xmlReader->nodeType == \XMLReader::TEXT)
59 | {
60 | if ($base64 == TRUE) {
61 | $messageBody = base64_decode($xmlReader->value);
62 | } else {
63 | $messageBody = $xmlReader->value;
64 | }
65 | }
66 | break;
67 | case Constants::ENQUEUE_TIME:
68 | $xmlReader->read();
69 | if ($xmlReader->nodeType == \XMLReader::TEXT)
70 | {
71 | $enqueueTime = $xmlReader->value;
72 | }
73 | break;
74 | case Constants::NEXT_VISIBLE_TIME:
75 | $xmlReader->read();
76 | if ($xmlReader->nodeType == \XMLReader::TEXT)
77 | {
78 | $nextVisibleTime = $xmlReader->value;
79 | }
80 | break;
81 | case Constants::FIRST_DEQUEUE_TIME:
82 | $xmlReader->read();
83 | if ($xmlReader->nodeType == \XMLReader::TEXT)
84 | {
85 | $firstDequeueTime = $xmlReader->value;
86 | }
87 | break;
88 | case Constants::DEQUEUE_COUNT:
89 | $xmlReader->read();
90 | if ($xmlReader->nodeType == \XMLReader::TEXT)
91 | {
92 | $dequeueCount = $xmlReader->value;
93 | }
94 | break;
95 | case Constants::PRIORITY:
96 | $xmlReader->read();
97 | if ($xmlReader->nodeType == \XMLReader::TEXT)
98 | {
99 | $priority = $xmlReader->value;
100 | }
101 | break;
102 | case Constants::RECEIPT_HANDLE:
103 | $xmlReader->read();
104 | if ($xmlReader->nodeType == \XMLReader::TEXT)
105 | {
106 | $receiptHandle = $xmlReader->value;
107 | }
108 | break;
109 | }
110 | break;
111 | case \XMLReader::END_ELEMENT:
112 | if ($xmlReader->name == 'Message')
113 | {
114 | $message = new Message(
115 | $messageId,
116 | $messageBodyMD5,
117 | $messageBody,
118 | $enqueueTime,
119 | $nextVisibleTime,
120 | $firstDequeueTime,
121 | $dequeueCount,
122 | $priority,
123 | $receiptHandle);
124 | return $message;
125 | }
126 | break;
127 | }
128 | }
129 |
130 | $message = new Message(
131 | $messageId,
132 | $messageBodyMD5,
133 | $messageBody,
134 | $enqueueTime,
135 | $nextVisibleTime,
136 | $firstDequeueTime,
137 | $dequeueCount,
138 | $priority,
139 | $receiptHandle);
140 |
141 | return $message;
142 | }
143 | }
144 |
145 | ?>
146 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Model/SubscriptionAttributes.php:
--------------------------------------------------------------------------------
1 | endpoint = $endpoint;
32 | $this->strategy = $strategy;
33 | $this->contentFormat = $contentFormat;
34 | $this->subscriptionName = $subscriptionName;
35 |
36 | //cloud change in AliyunMNS\Topic
37 | $this->topicName = $topicName;
38 |
39 | $this->topicOwner = $topicOwner;
40 | $this->createTime = $createTime;
41 | $this->lastModifyTime = $lastModifyTime;
42 | }
43 |
44 | public function getEndpoint()
45 | {
46 | return $this->endpoint;
47 | }
48 |
49 | public function setEndpoint($endpoint)
50 | {
51 | $this->endpoint = $endpoint;
52 | }
53 |
54 | public function getStrategy()
55 | {
56 | return $this->strategy;
57 | }
58 |
59 | public function setStrategy($strategy)
60 | {
61 | $this->strategy = $strategy;
62 | }
63 |
64 | public function getContentFormat()
65 | {
66 | return $this->contentFormat;
67 | }
68 |
69 | public function setContentFormat($contentFormat)
70 | {
71 | $this->contentFormat = $contentFormat;
72 | }
73 |
74 | public function getTopicName()
75 | {
76 | return $this->topicName;
77 | }
78 |
79 | public function setTopicName($topicName)
80 | {
81 | $this->topicName = $topicName;
82 | }
83 |
84 | public function getTopicOwner()
85 | {
86 | return $this->topicOwner;
87 | }
88 |
89 | public function getSubscriptionName()
90 | {
91 | return $this->subscriptionName;
92 | }
93 |
94 | public function getCreateTime()
95 | {
96 | return $this->createTime;
97 | }
98 |
99 | public function getLastModifyTime()
100 | {
101 | return $this->lastModifyTime;
102 | }
103 |
104 | public function writeXML(\XMLWriter $xmlWriter)
105 | {
106 | if ($this->endpoint != NULL)
107 | {
108 | $xmlWriter->writeElement(Constants::ENDPOINT, $this->endpoint);
109 | }
110 | if ($this->strategy != NULL)
111 | {
112 | $xmlWriter->writeElement(Constants::STRATEGY, $this->strategy);
113 | }
114 | if ($this->contentFormat != NULL)
115 | {
116 | $xmlWriter->writeElement(Constants::CONTENT_FORMAT, $this->contentFormat);
117 | }
118 | }
119 |
120 | static public function fromXML(\XMLReader $xmlReader)
121 | {
122 | $endpoint = NULL;
123 | $strategy = NULL;
124 | $contentFormat = NULL;
125 | $topicOwner = NULL;
126 | $topicName = NULL;
127 | $createTime = NULL;
128 | $lastModifyTime = NULL;
129 |
130 | while ($xmlReader->read())
131 | {
132 | if ($xmlReader->nodeType == \XMLReader::ELEMENT)
133 | {
134 | switch ($xmlReader->name) {
135 | case 'TopicOwner':
136 | $xmlReader->read();
137 | if ($xmlReader->nodeType == \XMLReader::TEXT)
138 | {
139 | $topicOwner = $xmlReader->value;
140 | }
141 | break;
142 | case 'TopicName':
143 | $xmlReader->read();
144 | if ($xmlReader->nodeType == \XMLReader::TEXT)
145 | {
146 | $topicName = $xmlReader->value;
147 | }
148 | break;
149 | case 'SubscriptionName':
150 | $xmlReader->read();
151 | if ($xmlReader->nodeType == \XMLReader::TEXT)
152 | {
153 | $subscriptionName = $xmlReader->value;
154 | }
155 | case 'Endpoint':
156 | $xmlReader->read();
157 | if ($xmlReader->nodeType == \XMLReader::TEXT)
158 | {
159 | $subscriptionName = $xmlReader->value;
160 | }
161 | break;
162 | case 'NotifyStrategy':
163 | $xmlReader->read();
164 | if ($xmlReader->nodeType == \XMLReader::TEXT)
165 | {
166 | $strategy = $xmlReader->value;
167 | }
168 | break;
169 | case 'NotifyContentFormat':
170 | $xmlReader->read();
171 | if ($xmlReader->nodeType == \XMLReader::TEXT)
172 | {
173 | $contentFormat = $xmlReader->value;
174 | }
175 | break;
176 | case 'CreateTime':
177 | $xmlReader->read();
178 | if ($xmlReader->nodeType == \XMLReader::TEXT)
179 | {
180 | $createTime = $xmlReader->value;
181 | }
182 | break;
183 | case 'LastModifyTime':
184 | $xmlReader->read();
185 | if ($xmlReader->nodeType == \XMLReader::TEXT)
186 | {
187 | $lastModifyTime = $xmlReader->value;
188 | }
189 | break;
190 | }
191 | }
192 | }
193 |
194 | $attributes = new SubscriptionAttributes(
195 | $subscriptionName,
196 | $endpoint,
197 | $strategy,
198 | $contentFormat,
199 | $topicName,
200 | $topicOwner,
201 | $createTime,
202 | $lastModifyTime);
203 | return $attributes;
204 | }
205 | }
206 |
207 | ?>
208 |
--------------------------------------------------------------------------------
/lib/AliyunMNS/Client.php:
--------------------------------------------------------------------------------
1 | client = new HttpClient($endPoint, $accessId,
45 | $accessKey, $securityToken, $config);
46 | }
47 |
48 | /**
49 | * Returns a queue reference for operating on the queue
50 | * this function does not create the queue automatically.
51 | *
52 | * @param string $queueName: the queue name
53 | * @param bool $base64: whether the message in queue will be base64 encoded
54 | *
55 | * @return Queue $queue: the Queue instance
56 | */
57 | public function getQueueRef($queueName, $base64 = TRUE)
58 | {
59 | return new Queue($this->client, $queueName, $base64);
60 | }
61 |
62 | /**
63 | * Create Queue and Returns the Queue reference
64 | *
65 | * @param CreateQueueRequest $request: the QueueName and QueueAttributes
66 | *
67 | * @return CreateQueueResponse $response: the CreateQueueResponse
68 | *
69 | * @throws QueueAlreadyExistException if queue already exists
70 | * @throws InvalidArgumentException if any argument value is invalid
71 | * @throws MnsException if any other exception happends
72 | */
73 | public function createQueue(CreateQueueRequest $request)
74 | {
75 | $response = new CreateQueueResponse($request->getQueueName());
76 | return $this->client->sendRequest($request, $response);
77 | }
78 |
79 | /**
80 | * Create Queue and Returns the Queue reference
81 | * The request will not be sent until calling MnsPromise->wait();
82 | *
83 | * @param CreateQueueRequest $request: the QueueName and QueueAttributes
84 | * @param AsyncCallback $callback: the Callback when the request finishes
85 | *
86 | * @return MnsPromise $promise: the MnsPromise instance
87 | *
88 | * @throws MnsException if any exception happends
89 | */
90 | public function createQueueAsync(CreateQueueRequest $request,
91 | AsyncCallback $callback = NULL)
92 | {
93 | $response = new CreateQueueResponse($request->getQueueName());
94 | return $this->client->sendRequestAsync($request, $response, $callback);
95 | }
96 |
97 | /**
98 | * Query the queues created by current account
99 | *
100 | * @param ListQueueRequest $request: define filters for quering queues
101 | *
102 | * @return ListQueueResponse: the response containing queueNames
103 | */
104 | public function listQueue(ListQueueRequest $request)
105 | {
106 | $response = new ListQueueResponse();
107 | return $this->client->sendRequest($request, $response);
108 | }
109 |
110 | public function listQueueAsync(ListQueueRequest $request,
111 | AsyncCallback $callback = NULL)
112 | {
113 | $response = new ListQueueResponse();
114 | return $this->client->sendRequestAsync($request, $response, $callback);
115 | }
116 |
117 | /**
118 | * Delete the specified queue
119 | * the request will succeed even when the queue does not exist
120 | *
121 | * @param $queueName: the queueName
122 | *
123 | * @return DeleteQueueResponse
124 | */
125 | public function deleteQueue($queueName)
126 | {
127 | $request = new DeleteQueueRequest($queueName);
128 | $response = new DeleteQueueResponse();
129 | return $this->client->sendRequest($request, $response);
130 | }
131 |
132 | public function deleteQueueAsync($queueName,
133 | AsyncCallback $callback = NULL)
134 | {
135 | $request = new DeleteQueueRequest($queueName);
136 | $response = new DeleteQueueResponse();
137 | return $this->client->sendRequestAsync($request, $response, $callback);
138 | }
139 |
140 | // API for Topic
141 | /**
142 | * Returns a topic reference for operating on the topic
143 | * this function does not create the topic automatically.
144 | *
145 | * @param string $topicName: the topic name
146 | *
147 | * @return Topic $topic: the Topic instance
148 | */
149 | public function getTopicRef($topicName)
150 | {
151 | return new Topic($this->client, $topicName);
152 | }
153 |
154 | /**
155 | * Create Topic and Returns the Topic reference
156 | *
157 | * @param CreateTopicRequest $request: the TopicName and TopicAttributes
158 | *
159 | * @return CreateTopicResponse $response: the CreateTopicResponse
160 | *
161 | * @throws TopicAlreadyExistException if topic already exists
162 | * @throws InvalidArgumentException if any argument value is invalid
163 | * @throws MnsException if any other exception happends
164 | */
165 | public function createTopic(CreateTopicRequest $request)
166 | {
167 | $response = new CreateTopicResponse($request->getTopicName());
168 | return $this->client->sendRequest($request, $response);
169 | }
170 |
171 | /**
172 | * Delete the specified topic
173 | * the request will succeed even when the topic does not exist
174 | *
175 | * @param $topicName: the topicName
176 | *
177 | * @return DeleteTopicResponse
178 | */
179 | public function deleteTopic($topicName)
180 | {
181 | $request = new DeleteTopicRequest($topicName);
182 | $response = new DeleteTopicResponse();
183 | return $this->client->sendRequest($request, $response);
184 | }
185 |
186 | /**
187 | * Query the topics created by current account
188 | *
189 | * @param ListTopicRequest $request: define filters for quering topics
190 | *
191 | * @return ListTopicResponse: the response containing topicNames
192 | */
193 | public function listTopic(ListTopicRequest $request)
194 | {
195 | $response = new ListTopicResponse();
196 | return $this->client->sendRequest($request, $response);
197 | }
198 | }
199 |
200 | ?>
201 |
--------------------------------------------------------------------------------
/tests/MnsQueueTest.php:
--------------------------------------------------------------------------------
1 |
9 | * @link: https://github.com/abrahamgreyson/laravel-mns
10 | *
11 | * This source file is subject to the MIT license that is bundled
12 | * with this source code in the file LICENSE.
13 | */
14 |
15 | namespace LaravelMns\Test;
16 |
17 | use AliyunMNS\Requests\SendMessageRequest;
18 | use AliyunMNS\Responses\ReceiveMessageResponse;
19 | use AliyunMNS\Responses\SendMessageResponse;
20 | use Carbon\Carbon;
21 | use LaravelMns\MnsAdapter;
22 | use LaravelMns\MnsQueue;
23 | use Mockery as m;
24 |
25 | class MnsQueueTest extends AbstractTestCase
26 | {
27 | public function tearDown()
28 | {
29 | parent::tearDown();
30 | }
31 |
32 | public function setUp()
33 | {
34 | parent::setUp();
35 |
36 | $this->default = 'default';
37 | $this->delay = 100;
38 |
39 | $this->mockedJob = 'job';
40 | $this->mockedData = ['data'];
41 | $this->mockedPayload = json_encode([
42 | 'job' => $this->mockedJob,
43 | 'data' => $this->mockedData,
44 | ]);
45 | $this->mnsClient = m::mock(\AliyunMNS\Client::class);
46 | $this->queueClient = m::mock(\AliyunMNS\Queue::class);
47 | $this->request = new SendMessageRequest($this->mockedPayload);
48 | $this->response = m::mock(SendMessageResponse::class);
49 | $this->mnsClient
50 | ->shouldReceive('getQueueRef')
51 | ->with($this->default)
52 | ->andReturn($this->queueClient);
53 | $this->queueClient
54 | ->shouldReceive('getQueueName')
55 | ->once()
56 | ->andReturn($this->default);
57 | }
58 |
59 | public function testPushProperlyPushesJobsOntoMns()
60 | {
61 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
62 | $mnsQueue = m::mock(MnsQueue::class . '[createPayload]', [$mnsAdapter])
63 | ->shouldAllowMockingProtectedMethods();
64 | $mnsQueue->shouldReceive('createPayload')
65 | ->once()
66 | ->with($this->mockedJob, $this->mockedData)
67 | ->andReturn($this->mockedPayload);
68 |
69 | $this->queueClient
70 | ->shouldReceive('sendMessage')
71 | ->once()
72 | ->with(m::type(SendMessageRequest::class))
73 | ->andReturn($this->response);
74 | $this->response
75 | ->shouldReceive('getMessageId')
76 | ->withNoArgs()
77 | ->andReturn(123);
78 | $id = $mnsQueue->push($this->mockedJob, $this->mockedData, $this->default);
79 | $this->assertEquals(123, $id);
80 | }
81 |
82 | public function testLaterProperlyPushesDelayedOntoMns()
83 | {
84 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
85 | $mnsQueue = m::mock(MnsQueue::class . '[createPayload, getSeconds]', [$mnsAdapter])
86 | ->shouldAllowMockingProtectedMethods();
87 | $mnsQueue->shouldReceive('createPayload')
88 | ->once()
89 | ->with($this->mockedJob, $this->mockedData)
90 | ->andReturn($this->mockedPayload);
91 | $mnsQueue->shouldReceive('getSeconds')
92 | ->once()
93 | ->with($this->delay)
94 | ->andReturn($this->delay);
95 | $this->queueClient->shouldReceive('sendMessage')
96 | ->once()
97 | ->with(m::type(SendMessageRequest::class))
98 | ->andReturn($this->response);
99 | $this->response->shouldReceive('getMessageId')
100 | ->withNoArgs()
101 | ->andReturn(123);
102 | $id = $mnsQueue->later($this->delay, $this->mockedJob, $this->mockedData, $this->default);
103 | $this->assertEquals(123, $id);
104 | }
105 |
106 | public function testLaterProperlyPushesDelayedUsingDatetimeOntoMns()
107 | {
108 | $now = Carbon::now();
109 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
110 | $mnsQueue = m::mock(MnsQueue::class . '[createPayload, getSeconds]', [$mnsAdapter])
111 | ->shouldAllowMockingProtectedMethods();
112 | $mnsQueue->shouldReceive('createPayload')
113 | ->once()
114 | ->with($this->mockedJob, $this->mockedData)
115 | ->andReturn($this->mockedPayload);
116 | $mnsQueue->shouldReceive('getSeconds')
117 | ->once()
118 | ->with($now)
119 | ->andReturn(3600);
120 | $this->queueClient->shouldReceive('sendMessage')
121 | ->once()
122 | ->with(m::type(SendMessageRequest::class))
123 | ->andReturn($this->response);
124 | $this->response->shouldReceive('getMessageId')
125 | ->withNoArgs()
126 | ->andReturn(123);
127 | $id = $mnsQueue->later($now->addSeconds(3600), $this->mockedJob, $this->mockedData, $this->default);
128 | $this->assertEquals(123, $id);
129 | }
130 |
131 | public function testPopProperlyPopOffFromJobMns()
132 | {
133 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
134 | $response = m::mock(ReceiveMessageResponse::class);
135 | $mnsQueue = m::mock(MnsQueue::class, [$mnsAdapter])->makePartial();
136 | $mnsQueue->setContainer(m::mock(\Illuminate\Container\Container::class));
137 | $this->queueClient->shouldReceive('receiveMessage')
138 | ->once()
139 | ->withNoArgs()
140 | ->andReturn($response);
141 | $mnsQueue->pop($this->default);
142 | }
143 |
144 | public function testPopProperlyReturnsNullWhenMnsHasNoActivelyMessage()
145 | {
146 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
147 | $response = m::mock(ReceiveMessageResponse::class);
148 | $mnsQueue = m::mock(MnsQueue::class, [$mnsAdapter])->makePartial();
149 | $mnsQueue->setContainer(m::mock(\Illuminate\Container\Container::class));
150 | $this->queueClient->shouldReceive('receiveMessage')
151 | ->once()
152 | ->withNoArgs()
153 | ->andThrow(new \AliyunMNS\Exception\MessageNotExistException(404, 'No message can get.'));
154 | $result = $mnsQueue->pop($this->default);
155 | $this->assertNull($result);
156 | }
157 |
158 | public function testPopProperlyPopOffJobWithCustomCreator()
159 | {
160 | $mnsAdapter = new MnsAdapter($this->mnsClient, $this->default);
161 | $response = m::mock(ReceiveMessageResponse::class);
162 | $mnsQueue = m::mock(MnsQueue::class, [$mnsAdapter])->makePartial();
163 | $mnsQueue->createJobsUsing(function () {
164 | return 'job';
165 | });
166 | $mnsQueue->setContainer(m::mock(\Illuminate\Container\Container::class));
167 | $this->queueClient->shouldReceive('receiveMessage')
168 | ->once()
169 | ->withNoArgs()
170 | ->andReturn($response);
171 | $result = $mnsQueue->pop($this->default);
172 | $this->assertEquals('job', $result);
173 | }
174 |
175 | public function testGetDefaultIfNullCanResolveWantedQueueNameOrReturnDefault()
176 | {
177 | $msnQueue = new MnsQueue(
178 | new MnsAdapter($this->mnsClient, $this->default)
179 | );
180 | $this->assertEquals('default', $msnQueue->getDefaultIfNull(null));
181 | $this->assertEquals('somequeue', $msnQueue->getDefaultIfNull('somequeue'));
182 | }
183 | }
184 |
--------------------------------------------------------------------------------