1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
rulemaster.php
См. документацию.
1<?php
2
4
18use Generator;
19use Throwable;
20
22{
23 public const ON_QUEUE_PUSHED_EVENT_NAME = 'OnPushToTargetQueue';
24
25 private const PACK_SIZE = 100;
26
27 private const LAST_PROCESSED_OPTION_NAME = 'queue_last_processed_id';
28
29 private Logger $logger;
30
31 private MessageMapper $messageMapper;
32
33 private HandledMessageMapper $handledMessageMapper;
34
35 private Map $routedQueues;
36
37 private Mutex $mutex;
38
39 public function __construct(Logger $logger = null)
40 {
41 $this->logger = $logger ?? new Logger();
42 }
43
47 public function run()
48 {
49 if ($this->getMutex()->lock())
50 {
51 try
52 {
53 $this->handleMessages();
54
55 $this->sendSystemEvents();
56 }
57 catch(Throwable $exception)
58 {
59 $this->logger->log($exception);
60 }
61 finally
62 {
63 $this->getMutex()->unlock();
64 }
65 }
66 }
67
74 private function getMessages(): Generator
75 {
76 do
77 {
78 $messages = $this->getMessageMapper()->getMap(
79 [
80 '>ID' => $this->getLastProcessedId(),
81 ],
82 self::PACK_SIZE,
83 [
84 'ID' => 'ASC',
85 ],
86 );
88 foreach ($messages as $message)
89 {
90 yield $message;
91 $this->setLastProcessedId($message->getId());
92 }
93 }
94
95 while($messages->count());
96 }
97
103 private function routeMessage(Message $message): bool
104 {
105 $rules = Registry::getInstance()->getRules();
106 $isRouted = false;
107 foreach ($rules as $rule)
108 {
109 try
110 {
111 if ($handledMessage = $rule->route($message))
112 {
114 $handledMessage = $this->getHandledMessageMapper()->create($handledMessage);
115 $this->getRoutedQueues()->add($handledMessage->getQueue());
116 $isRouted = true;
117 }
118 }
119 catch(Throwable $exception)
120 {
121 $this->logger->log($exception);
122 }
123 }
124
125 return $isRouted;
126 }
127
131 private function getLastProcessedId(): int
132 {
133 return \COption::GetOptionInt("calendar", self::LAST_PROCESSED_OPTION_NAME, 0);
134 }
135
141 private function setLastProcessedId(int $id = 0)
142 {
143 \COption::SetOptionInt("calendar", self::LAST_PROCESSED_OPTION_NAME, $id);
144 }
145
149 public function sendSystemEvents(): void
150 {
151 // TODO: move it to right place
153
154 foreach ($this->getRoutedQueues() as $queue)
155 {
156 $event = new Event(
157 "calendar",
158 self::ON_QUEUE_PUSHED_EVENT_NAME,
159 [
160 'queue' => $queue,
161 ],
162 );
164 }
165 }
166
170 private function getMessageMapper(): MessageMapper
171 {
172 if (empty($this->messageMapper))
173 {
174 $this->messageMapper = new MessageMapper();
175 }
176
177 return $this->messageMapper;
178 }
179
183 private function getHandledMessageMapper(): HandledMessageMapper
184 {
185 if (empty($this->handledMessageMapper))
186 {
187 $this->handledMessageMapper = new HandledMessageMapper();
188 }
189
190 return $this->handledMessageMapper;
191 }
192
196 public function getRoutedQueues(): Map
197 {
198 if (empty($this->routedQueues))
199 {
200 $this->routedQueues = new EntityMap();
201 }
202
203 return $this->routedQueues;
204 }
205
209 private function getMutex(): Mutex
210 {
211 if (empty($this->mutex))
212 {
213 $this->mutex = new Mutex(self::class);
214 }
215
216 return $this->mutex;
217 }
218
225 public function handleMessages(): void
226 {
228 foreach ($this->getMessages() as $message)
229 {
230 $isRouted = $this->routeMessage($message);
231 if (!$isRouted)
232 {
233 $this->getMessageMapper()->delete($message);
234 }
235 }
236 }
237}
__construct(Logger $logger=null)
Определения rulemaster.php:39
Определения event.php:5
static getInstance()
Определения eventmanager.php:31
$message
Определения payment.php:8
$event
Определения prolog_after.php:141
$messages
Определения template.php:8