Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
OperationProcessor.php
Go to the documentation of this file.
1 <?php
7 declare(strict_types=1);
8 
10 
19 use Psr\Log\LoggerInterface;
26 use Magento\Framework\Communication\ConfigInterface as CommunicationConfig;
27 
34 {
38  private $jsonHelper;
39 
43  private $operationManagement;
44 
48  private $messageEncoder;
49 
53  private $messageValidator;
54 
58  private $configuration;
59 
63  private $logger;
64 
68  private $serviceOutputProcessor;
69 
73  private $communicationConfig;
74 
87  public function __construct(
88  MessageValidator $messageValidator,
89  MessageEncoder $messageEncoder,
90  ConsumerConfigurationInterface $configuration,
91  Json $jsonHelper,
92  OperationManagementInterface $operationManagement,
93  ServiceOutputProcessor $serviceOutputProcessor,
94  CommunicationConfig $communicationConfig,
95  LoggerInterface $logger
96  ) {
97  $this->messageValidator = $messageValidator;
98  $this->messageEncoder = $messageEncoder;
99  $this->configuration = $configuration;
100  $this->jsonHelper = $jsonHelper;
101  $this->operationManagement = $operationManagement;
102  $this->logger = $logger;
103  $this->serviceOutputProcessor = $serviceOutputProcessor;
104  $this->communicationConfig = $communicationConfig;
105  }
106 
113  public function process(string $encodedMessage)
114  {
115  $operation = $this->messageEncoder->decode(AsyncConfig::SYSTEM_TOPIC_NAME, $encodedMessage);
116  $this->messageValidator->validate(AsyncConfig::SYSTEM_TOPIC_NAME, $operation);
117 
119  $errorCode = null;
120  $messages = [];
121  $topicName = $operation->getTopicName();
122  $handlers = $this->configuration->getHandlers($topicName);
123  try {
124  $data = $this->jsonHelper->unserialize($operation->getSerializedData());
125  $entityParams = $this->messageEncoder->decode($topicName, $data['meta_information']);
126  $this->messageValidator->validate($topicName, $entityParams);
127  } catch (\Exception $e) {
128  $this->logger->error($e->getMessage());
130  $errorCode = $e->getCode();
131  $messages[] = $e->getMessage();
132  }
133 
134  $outputData = null;
135  if ($errorCode === null) {
136  foreach ($handlers as $callback) {
137  $result = $this->executeHandler($callback, $entityParams);
138  $status = $result['status'];
139  $errorCode = $result['error_code'];
140  $messages = array_merge($messages, $result['messages']);
141  $outputData = $result['output_data'];
142  }
143  }
144 
145  if (isset($outputData)) {
146  try {
147  $communicationConfig = $this->communicationConfig->getTopic($topicName);
148  $asyncHandler =
149  $communicationConfig[CommunicationConfig::TOPIC_HANDLERS][AsyncConfig::DEFAULT_HANDLER_NAME];
150  $serviceClass = $asyncHandler[CommunicationConfig::HANDLER_TYPE];
151  $serviceMethod = $asyncHandler[CommunicationConfig::HANDLER_METHOD];
152  $outputData = $this->serviceOutputProcessor->process(
153  $outputData,
154  $serviceClass,
155  $serviceMethod
156  );
157  $outputData = $this->jsonHelper->serialize($outputData);
158  } catch (\Exception $e) {
159  $messages[] = $e->getMessage();
160  }
161  }
162 
163  $serializedData = (isset($errorCode)) ? $operation->getSerializedData() : null;
164  $this->operationManagement->changeOperationStatus(
165  $operation->getId(),
166  $status,
167  $errorCode,
168  implode('; ', $messages),
169  $serializedData,
170  $outputData
171  );
172  }
173 
181  private function executeHandler($callback, $entityParams)
182  {
183  $result = [
185  'error_code' => null,
186  'messages' => [],
187  'output_data' => null
188  ];
189  try {
190  $result['output_data'] = call_user_func_array($callback, $entityParams);
191  $result['messages'][] = sprintf('Service execution success %s::%s', get_class($callback[0]), $callback[1]);
192  } catch (\Zend_Db_Adapter_Exception $e) {
193  $this->logger->critical($e->getMessage());
194  if ($e instanceof LockWaitException
195  || $e instanceof DeadlockException
196  || $e instanceof ConnectionException
197  ) {
199  $result['error_code'] = $e->getCode();
200  $result['messages'][] = __($e->getMessage());
201  } else {
203  $result['error_code'] = $e->getCode();
204  $result['messages'][] =
205  __('Sorry, something went wrong during product prices update. Please see log for details.');
206  }
207  } catch (NoSuchEntityException $e) {
208  $this->logger->error($e->getMessage());
209  $result['status'] = ($e instanceof TemporaryStateExceptionInterface) ?
212  $result['error_code'] = $e->getCode();
213  $result['messages'][] = $e->getMessage();
214  } catch (LocalizedException $e) {
215  $this->logger->error($e->getMessage());
217  $result['error_code'] = $e->getCode();
218  $result['messages'][] = $e->getMessage();
219  } catch (\Exception $e) {
220  $this->logger->error($e->getMessage());
222  $result['error_code'] = $e->getCode();
223  $result['messages'][] = $e->getMessage();
224  }
225  return $result;
226  }
227 }
$jsonHelper
Definition: reset.phtml:14
$configuration
Definition: index.php:33
__()
Definition: __.php:13
$logger
__construct(MessageValidator $messageValidator, MessageEncoder $messageEncoder, ConsumerConfigurationInterface $configuration, Json $jsonHelper, OperationManagementInterface $operationManagement, ServiceOutputProcessor $serviceOutputProcessor, CommunicationConfig $communicationConfig, LoggerInterface $logger)
$status
Definition: order_status.php:8