1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
Initializer.php
См. документацию.
1<?php
2
3namespace Bitrix\Im\V2\Recent;
4
5use Bitrix\Im\Model\RecentTable;
6use Bitrix\Im\V2\Common\PeriodAgentTrait;
7use Bitrix\Im\V2\Entity\User\User;
8use Bitrix\Im\V2\Entity\User\UserCollection;
9use Bitrix\Im\V2\Logger;
10use Bitrix\Im\V2\Recent\Initializer\BaseSource;
11use Bitrix\Im\V2\Recent\Initializer\InitialiazerResult;
12use Bitrix\Im\V2\Recent\Initializer\Queue\DequeueResult;
13use Bitrix\Im\V2\Recent\Initializer\Queue\QueueItem;
14use Bitrix\Im\V2\Recent\Initializer\QueueService;
15use Bitrix\Im\V2\Recent\Initializer\Source;
16use Bitrix\Im\V2\Recent\Initializer\SourceType;
17use Bitrix\Im\V2\Result;
18
20{
21 use PeriodAgentTrait;
22
23 protected const AGENT_SHORT_PERIOD = 5;
24 protected const AGENT_LONG_PERIOD = 300;
25 protected const SELECTED_ITEM_LIMIT = 50;
26 protected const INSERTED_ITEM_LIMIT = 50;
27 private const INSERT_PARAMS = ['DEADLOCK_SAFE' => true, 'UNIQUE_FIELDS' => ['USER_ID', 'ITEM_TYPE', 'ITEM_ID']];
28
29 protected static int $selectedItemLimitCounter = 0;
30 protected static int $insertedItemLimitCounter = 0;
31 protected static array $instances = [];
32
33 protected int $targetId;
34 protected Source $source;
35
36 protected function __construct(int $targetId, Source $source)
37 {
38 $this->targetId = $targetId;
39 $this->source = $source;
40 }
41
42 protected static function getInstance(QueueItem $queueItem): static
43 {
44 $instanceKey = "{$queueItem->userId}_{$queueItem->stageType->value}_{$queueItem->sourceType->value}_{$queueItem->sourceId}";
45 if (isset(self::$instances[$instanceKey]))
46 {
47 return self::$instances[$instanceKey];
48 }
49
51
52 self::$instances[$instanceKey] = new static($queueItem->userId, $source);
53
54 return self::$instances[$instanceKey];
55 }
56
57 public static function onAfterUsersAddToCollab(array $users, int $chatCollabId): Result
58 {
59 return self::addMulti($users, SourceType::Collab, $chatCollabId);
60 }
61
62 public static function onAfterUserAcceptInvite(int $userId): Result
63 {
64 return self::add($userId, SourceType::Collabs, null, true);
65 }
66
67 public static function executeAgent(): string
68 {
69 while (!self::isLimitsExceeded())
70 {
71 $result = self::executeAgentIteration();
72
73 if (!$result->hasMore())
74 {
75 break;
76 }
77
78 $queueItem = $result->getQueueItem();
79
80 QueueService::getInstance()->save($queueItem);
81 }
82
83 self::calculateAndSetPeriod(true);
84
85 return self::getAgentName();
86 }
87
88 protected static function executeAgentIteration(): DequeueResult
89 {
90 $dequeueResult = new DequeueResult();
91
92 $queueItem = QueueService::getInstance()->getFirst();
93 if (!$queueItem)
94 {
95 return $dequeueResult->setHasMore(false);
96 }
97
98 try
99 {
100 $result = static::doSteps($queueItem);
101 $queueItem = $result->getQueueItem();
102
103 return $dequeueResult->setQueueItem($queueItem?->unlock());
104 }
105 catch (\Throwable $exception)
106 {
107 (new Logger('imRecentInitializer'))->logThrowable($exception);
108
109 return $dequeueResult->setQueueItem($queueItem->unlock());
110 }
111 }
112
113 protected static function doSteps(QueueItem $queueItem): InitialiazerResult
114 {
115 $result = (new InitialiazerResult())->setQueueItem($queueItem);
116
117 while (!self::isLimitsExceeded())
118 {
119 if (!$queueItem)
120 {
121 break;
122 }
123
124 $initializer = static::getInstance($queueItem);
125 $result = $initializer->doStep($queueItem);
126 $queueItem = $result->getQueueItem();
127 }
128
129 return $result;
130 }
131
132 protected function doStep(QueueItem $queueItem): InitialiazerResult
133 {
134 $result = $this->source->getItems($queueItem->pointer, self::SELECTED_ITEM_LIMIT);
135 if (!$result->isSuccess())
136 {
137 return $result;
138 }
139
140 $items = $result->getItems();
141 $this->insert($items);
142 $this->source->getStage()->sendPullAfterInsert($items);
143 $queueItem = $this->updateQueueItem($queueItem, $result);
145
146 return $result->setQueueItem($queueItem);
147 }
148
149 protected static function addMulti(array $users, SourceType $sourceType, ?int $sourceId = null): Result
150 {
151 $users = self::filterInvitedUsers($users);
152 $lastQueueItem = null;
153 $queueItems = [];
154 foreach ($users as $user)
155 {
156 if (!self::isLimitsExceeded())
157 {
158 $firstStep = QueueItem::createFirstStep($user, $sourceType, $sourceId);
159 $result = static::doSteps($firstStep);
160 $lastQueueItem = $result->getQueueItem();
161 }
162 else
163 {
164 $queueItems[] = QueueItem::createFirstStep($user, $sourceType, $sourceId);
165 }
166 }
167
168 if ($lastQueueItem)
169 {
170 array_unshift($queueItems, $lastQueueItem);
171 }
172
173 if (!empty($queueItems))
174 {
175 QueueService::getInstance()->addMulti($queueItems);
176 }
177
178 self::calculateAndSetPeriod(false);
179
180 return new Result();
181 }
182
183 protected static function add(int $targetId, SourceType $sourceType, ?int $sourceId = null, bool $isFirstInit = false): Result
184 {
185 if (self::isUserInvited($targetId))
186 {
187 return new Result();
188 }
189
190 $firstStep = QueueItem::createFirstStep($targetId, $sourceType, $sourceId, $isFirstInit);
191 $result = static::doSteps($firstStep);
192 $queueItem = $result->getQueueItem();
193 $queueItem = QueueService::getInstance()->save($queueItem);
194 self::calculateAndSetPeriod(false);
195
196 return $result->setQueueItem($queueItem);
197 }
198
200 {
201 if (!$result->isSuccess())
202 {
203 return $queueItem->setErrorStatus();
204 }
205
206 if (!$result->hasNextStep())
207 {
208 $nextStage = $queueItem->stageType->getNext();
209 if ($nextStage === null)
210 {
211 return $this->finalize($queueItem);
212 }
213
214 return $queueItem->updatePointer('', $nextStage);
215 }
216
217 return $queueItem->updatePointer($result->getNextPointer());
218 }
219
220 protected function finalize(QueueItem $queueItem): ?QueueItem
221 {
222 QueueService::getInstance()->delete($queueItem);
223
224 return null;
225 }
226
228 {
229 self::$insertedItemLimitCounter += count($result->getItems());
230 self::$selectedItemLimitCounter += $result->getSelectedItemsCount();
231 }
232
233 protected static function isLimitsExceeded(): bool
234 {
235 return
236 self::$selectedItemLimitCounter >= self::SELECTED_ITEM_LIMIT
237 || self::$insertedItemLimitCounter >= self::INSERTED_ITEM_LIMIT
238 ;
239 }
240
241 protected static function filterInvitedUsers(array $users): array
242 {
243 $userCollection = new UserCollection($users);
244 $userCollection->fillOnlineData();
245
246 return array_filter($users, static fn (int $userId) => !self::isUserInvited($userId));
247 }
248
249 protected static function isUserInvited(int $userId): bool
250 {
251 return User::getInstance($userId)->getLastActivityDate() === null;
252 }
253
254 protected function insert(array $fields): void
255 {
256 RecentTable::multiplyInsertWithoutDuplicate($fields, self::INSERT_PARAMS);
257 }
258
259 protected static function getAgentName(): string
260 {
261 return '\Bitrix\Im\V2\Recent\Initializer::executeAgent();';
262 }
263
264 protected static function calculateAndSetPeriod(bool $fromAgent): void
265 {
266 self::setPeriodByName($fromAgent, self::getAgentName(), self::getNewAgentPeriodGetter());
267 }
268
269 protected static function getNewAgentPeriodGetter(): callable
270 {
271 return static fn () => QueueService::getInstance()->isQueueEmpty() ? self::AGENT_LONG_PERIOD : self::AGENT_SHORT_PERIOD;
272 }
273
274 protected static function isAgentPeriodShort(int $newPeriod): bool
275 {
276 return $newPeriod === self::AGENT_SHORT_PERIOD;
277 }
278}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getInstance($userId=null)
Определения user.php:45
static createFromQueueItem(QueueItem $queueItem)
Определения BaseSource.php:53
updatePointer(string $pointer, ?StageType $stage=null)
Определения QueueItem.php:89
static addMulti(array $users, SourceType $sourceType, ?int $sourceId=null)
Определения Initializer.php:149
finalize(QueueItem $queueItem)
Определения Initializer.php:220
updateQueueItem(QueueItem $queueItem, InitialiazerResult $result)
Определения Initializer.php:199
const SELECTED_ITEM_LIMIT
Определения Initializer.php:25
const INSERTED_ITEM_LIMIT
Определения Initializer.php:26
static isUserInvited(int $userId)
Определения Initializer.php:249
static int $insertedItemLimitCounter
Определения Initializer.php:30
insert(array $fields)
Определения Initializer.php:254
static executeAgentIteration()
Определения Initializer.php:88
static isLimitsExceeded()
Определения Initializer.php:233
static getAgentName()
Определения Initializer.php:259
static getInstance(QueueItem $queueItem)
Определения Initializer.php:42
static doSteps(QueueItem $queueItem)
Определения Initializer.php:113
static executeAgent()
Определения Initializer.php:67
static calculateAndSetPeriod(bool $fromAgent)
Определения Initializer.php:264
static array $instances
Определения Initializer.php:31
incrementLimitCounters(InitialiazerResult $result)
Определения Initializer.php:227
static onAfterUsersAddToCollab(array $users, int $chatCollabId)
Определения Initializer.php:57
static onAfterUserAcceptInvite(int $userId)
Определения Initializer.php:62
static isAgentPeriodShort(int $newPeriod)
Определения Initializer.php:274
static add(int $targetId, SourceType $sourceType, ?int $sourceId=null, bool $isFirstInit=false)
Определения Initializer.php:183
static filterInvitedUsers(array $users)
Определения Initializer.php:241
static getNewAgentPeriodGetter()
Определения Initializer.php:269
const AGENT_SHORT_PERIOD
Определения Initializer.php:23
static int $selectedItemLimitCounter
Определения Initializer.php:29
__construct(int $targetId, Source $source)
Определения Initializer.php:36
const AGENT_LONG_PERIOD
Определения Initializer.php:24
doStep(QueueItem $queueItem)
Определения Initializer.php:132
Определения result.php:20
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
if($ar_profile["DEFAULT_PROFILE"] !='Y') $firstStep
Определения cron_frame.php:80
$user
Определения mysql_to_pgsql.php:33
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$items
Определения template.php:224
$fields
Определения yandex_run.php:501