Skip to content

Commit 69ee1f1

Browse files
committed
Implement Filesystem transport
0 parents  commit 69ee1f1

27 files changed

+2875
-0
lines changed

.gitignore

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

.travis.yml

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

Client/FsDriver.php

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
<?php
2+
3+
namespace Enqueue\Fs\Client;
4+
5+
use Enqueue\Client\Config;
6+
use Enqueue\Client\DriverInterface;
7+
use Enqueue\Client\Message;
8+
use Enqueue\Client\MessagePriority;
9+
use Enqueue\Client\Meta\QueueMetaRegistry;
10+
use Enqueue\Fs\FsContext;
11+
use Enqueue\Fs\FsDestination;
12+
use Enqueue\Fs\FsMessage;
13+
use Enqueue\Psr\Message as TransportMessage;
14+
use Psr\Log\LoggerInterface;
15+
use Psr\Log\NullLogger;
16+
17+
class FsDriver implements DriverInterface
18+
{
19+
/**
20+
* @var FsContext
21+
*/
22+
private $context;
23+
24+
/**
25+
* @var Config
26+
*/
27+
private $config;
28+
29+
/**
30+
* @var QueueMetaRegistry
31+
*/
32+
private $queueMetaRegistry;
33+
34+
/**
35+
* @param FsContext $context
36+
* @param Config $config
37+
* @param QueueMetaRegistry $queueMetaRegistry
38+
*/
39+
public function __construct(FsContext $context, Config $config, QueueMetaRegistry $queueMetaRegistry)
40+
{
41+
$this->context = $context;
42+
$this->config = $config;
43+
$this->queueMetaRegistry = $queueMetaRegistry;
44+
}
45+
46+
/**
47+
* {@inheritdoc}
48+
*/
49+
public function sendToRouter(Message $message)
50+
{
51+
if (false == $message->getProperty(Config::PARAMETER_TOPIC_NAME)) {
52+
throw new \LogicException('Topic name parameter is required but is not set');
53+
}
54+
55+
$topic = $this->createRouterTopic();
56+
$transportMessage = $this->createTransportMessage($message);
57+
58+
$this->context->createProducer()->send($topic, $transportMessage);
59+
}
60+
61+
/**
62+
* {@inheritdoc}
63+
*/
64+
public function sendToProcessor(Message $message)
65+
{
66+
if (false == $message->getProperty(Config::PARAMETER_PROCESSOR_NAME)) {
67+
throw new \LogicException('Processor name parameter is required but is not set');
68+
}
69+
70+
if (false == $queueName = $message->getProperty(Config::PARAMETER_PROCESSOR_QUEUE_NAME)) {
71+
throw new \LogicException('Queue name parameter is required but is not set');
72+
}
73+
74+
$transportMessage = $this->createTransportMessage($message);
75+
$destination = $this->createQueue($queueName);
76+
77+
$this->context->createProducer()->send($destination, $transportMessage);
78+
}
79+
80+
/**
81+
* {@inheritdoc}
82+
*/
83+
public function setupBroker(LoggerInterface $logger = null)
84+
{
85+
$logger = $logger ?: new NullLogger();
86+
$log = function ($text, ...$args) use ($logger) {
87+
$logger->debug(sprintf('[FsDriver] '.$text, ...$args));
88+
};
89+
90+
// setup router
91+
$routerTopic = $this->createRouterTopic();
92+
$routerQueue = $this->createQueue($this->config->getRouterQueueName());
93+
94+
$log('Declare router exchange "%s" file: %s', $routerTopic->getTopicName(), $routerTopic->getFileInfo());
95+
$this->context->declareDestination($routerTopic);
96+
97+
$log('Declare router queue "%s" file: %s', $routerQueue->getQueueName(), $routerTopic->getFileInfo());
98+
$this->context->declareDestination($routerQueue);
99+
100+
// setup queues
101+
foreach ($this->queueMetaRegistry->getQueuesMeta() as $meta) {
102+
$queue = $this->createQueue($meta->getClientName());
103+
104+
$log('Declare processor queue "%s" file: %s', $queue->getQueueName(), $queue->getFileInfo());
105+
$this->context->declareDestination($queue);
106+
}
107+
}
108+
109+
/**
110+
* {@inheritdoc}
111+
*
112+
* @return FsDestination
113+
*/
114+
public function createQueue($queueName)
115+
{
116+
return $this->context->createQueue($this->config->createTransportQueueName($queueName));
117+
}
118+
119+
/**
120+
* {@inheritdoc}
121+
*
122+
* @return FsMessage
123+
*/
124+
public function createTransportMessage(Message $message)
125+
{
126+
$properties = $message->getProperties();
127+
128+
$headers = $message->getHeaders();
129+
$headers['content_type'] = $message->getContentType();
130+
131+
$transportMessage = $this->context->createMessage();
132+
$transportMessage->setBody($message->getBody());
133+
$transportMessage->setHeaders($headers);
134+
$transportMessage->setProperties($properties);
135+
$transportMessage->setMessageId($message->getMessageId());
136+
$transportMessage->setTimestamp($message->getTimestamp());
137+
138+
return $transportMessage;
139+
}
140+
141+
/**
142+
* @param FsMessage $message
143+
*
144+
* {@inheritdoc}
145+
*/
146+
public function createClientMessage(TransportMessage $message)
147+
{
148+
$clientMessage = new Message();
149+
150+
$clientMessage->setBody($message->getBody());
151+
$clientMessage->setHeaders($message->getHeaders());
152+
$clientMessage->setProperties($message->getProperties());
153+
154+
$clientMessage->setContentType($message->getHeader('content_type'));
155+
$clientMessage->setMessageId($message->getMessageId());
156+
$clientMessage->setTimestamp($message->getTimestamp());
157+
$clientMessage->setPriority(MessagePriority::NORMAL);
158+
159+
return $clientMessage;
160+
}
161+
162+
/**
163+
* @return Config
164+
*/
165+
public function getConfig()
166+
{
167+
return $this->config;
168+
}
169+
170+
/**
171+
* @return FsDestination
172+
*/
173+
private function createRouterTopic()
174+
{
175+
return $this->context->createTopic(
176+
$this->config->createTransportRouterTopicName($this->config->getRouterTopicName())
177+
);
178+
}
179+
}

FsConnectionFactory.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Enqueue\Fs;
4+
5+
use Enqueue\Psr\ConnectionFactory;
6+
7+
class FsConnectionFactory implements ConnectionFactory
8+
{
9+
/**
10+
* @var string
11+
*/
12+
private $config;
13+
14+
/**
15+
* @param array $config
16+
*/
17+
public function __construct(array $config)
18+
{
19+
$this->config = array_replace([
20+
'store_dir' => null,
21+
'pre_fetch_count' => 1,
22+
'chmod' => 0600,
23+
], $config);
24+
}
25+
26+
/**
27+
* {@inheritdoc}
28+
*
29+
* @return FsContext
30+
*/
31+
public function createContext()
32+
{
33+
return new FsContext($this->config['store_dir'], $this->config['pre_fetch_count'], $this->config['chmod']);
34+
}
35+
}

0 commit comments

Comments
 (0)