/** * Process message receiving * @return Xcom_Xfabric_Model_Endpoint */ public function receive() { $messageDataOptions = $this->_messageData->getOptions(); $messageOptions = array('body' => $messageDataOptions['body'], 'headers' => $messageDataOptions['headers'], 'topic' => $messageDataOptions['topic'], 'message_data' => $this->_encoder->decodeText($messageDataOptions['body'], $this->_schema->getRawSchema()), 'db_adapter' => Mage::getModel('xcom_xfabric/message_response'), 'direction' => Xcom_Xfabric_Model_Message::DIRECTION_INBOUND, 'status' => Xcom_Xfabric_Model_Message::MESSAGE_STATUS_RECEIVED); $this->_message = Mage::getModel('xcom_xfabric/message', $messageOptions); $this->validateAuthorizationHeader($this->getMessage()->getAuthorization()); $this->_message->save(); /* Notify callback logic that message is received, decoded and saved to database */ $this->getCallbackHandler()->invokeInboundReceived($this->getMessage()); /* Invoke callback logic which will validate the message */ $this->getCallbackHandler()->invokeInboundValidate($this->getMessage()); /* Invoke callback logic which will validate the message */ $this->getCallbackHandler()->invokeMessageValidated($this->getMessage()); /* Generic event common for all messages */ $this->getCallbackHandler()->invokeInboundProcessGeneric($this->getMessage()); if ($this->_message->getHeader(Xcom_Xfabric_Model_Message::PUBLISHER_PSEUDONYM_HEADER) == $this->_authorization->getBearerData(Xcom_Xfabric_Model_Authorization::PSEUDONYM)) { /* If the sender of the message is the same as receiver. Message is "looped back" Nobody will receive this message unless subscribed on it on purpose */ $this->getCallbackHandler()->invokeInboundLoopedProcess($this->getMessage()); } else { /* Notify callback logic that it's a time to process message with specified topic */ $this->getCallbackHandler()->invokeInboundProcessByTopic($this->getMessage()); } return $this; }
public function sendMessage(Xcom_Xfabric_Model_Message $message, array $options = array()) { $requestTopic = $message->getTopic(); $requestHeaders = serialize($message->getHeaders()); Mage::getSingleton('xcom_xfabric/debug')->start('Send Request [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, json_encode($message->getMessageData())); if (isset($options['synchronous'])) { try { $response = Mage::getModel('xcom_stub/message')->receive($message); if ($response && !is_null($response->getMessageId())) { Mage::dispatchEvent('response_message_received', array('message' => $response)); Mage::getSingleton('xcom_xfabric/debug')->stop('Receive Response [STUB] ' . $requestTopic, $response->getTopic(), $requestHeaders, serialize($response->getBody())); } else { //$response = Mage::helper('xcom_xfabric')->getMessage($requestTopic); Mage::getSingleton('xcom_xfabric/debug')->stop('No Response was received [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, ''); } return $response; } catch (Exception $e) { Mage::getSingleton('xcom_xfabric/debug')->stop('No Response was received [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, $e->getMessage()); } } else { Mage::getSingleton('xcom_xfabric/debug')->stop('No Response is been waiting [STUB] ' . $requestTopic, '', '', json_encode($message->getMessageData())); } }
public function sendMessage(Xcom_Xfabric_Model_Message $message, array $options = array()) { $url = $this->prepareUri($message->getTopic()); Mage::getSingleton('xcom_xfabric/debug')->start('Send Request to ' . $url->getUri(), $message->getTopic(), serialize($message->getHeaders()), isset($options['message_data']) ? $options['message_data'] : ''); $adapter = $this->_getAdapter(); $adapter->setConfig($this->_config); $adapter->write(Zend_Http_Client::POST, $url, '1.1', $this->_prepareHeaders($message->getHeaders()), $message->getBody()); $result = $adapter->read(); $error = ''; $httpCode = $adapter->getInfo(CURLINFO_HTTP_CODE); if ($adapter->getErrno()) { $error = $adapter->getError(); } if (!$result || $error) { Mage::getSingleton('xcom_xfabric/debug')->stop('Unable to complete the request.', $message->getTopic(), $result, 'Unable to complete the request. ' . $error); switch ($httpCode) { case '400': $errorText = 'Bad request. '; break; case '401': $errorText = 'Request is unauthorized. '; break; case '403': $errorText = 'Request is forbidden. '; break; case '404': $errorText = 'Not Found. '; break; case '413': $errorText = 'Message is too large'; break; default: $errorText = ''; break; } throw Mage::exception('Xcom_Xfabric', Mage::helper('xcom_xfabric')->__('Unable to complete the request. ') . $errorText . $error); } $zendHttpCode = Zend_Http_Response::extractCode($result); $zendHttpMessage = Zend_Http_Response::extractMessage($result); $zendHttpBody = Zend_Http_Response::extractBody($result); if ($zendHttpCode != '200') { Mage::getSingleton('xcom_xfabric/debug')->stop('Unable to complete the request.', $message->getTopic(), $result, $zendHttpMessage . ' ' . $zendHttpBody); throw Mage::exception('Xcom_Xfabric', $zendHttpMessage . ' ' . $zendHttpBody, $zendHttpCode); } if (!empty($options['synchronous']) && !$error) { $response = $this->_getResponseMessage($message->getCorrelationId()); if (!$response) { Mage::getSingleton('xcom_xfabric/debug')->stop('Response is not received', $message->getTopic(), $result, 'No Errors'); throw Mage::exception('Xcom_Xfabric', Mage::helper('xcom_xfabric')->__('Unable to complete the request. Please refer to the User Guide ' . 'to verify your settings and try again. If the error persists, contact your administrator.')); } return $response; } Mage::getSingleton('xcom_xfabric/debug')->stop('No Response is been waiting', $message->getTopic(), $result, $error); return true; }
/** * Called when sent message is received by the system * * @param $topic * @param $id * @param Xcom_Xfabric_Model_Message $message * @return Xcom_Xfabric_Model_Callback_Dispatcher */ public function invokeInboundLoopedProcess(Xcom_Xfabric_Model_Message $message) { $eventSuffix = Mage::helper('xcom_xfabric')->getEventSuffix($message->getTopic()); Mage::dispatchEvent('response_message_looped_process_' . $eventSuffix, array('message' => $message)); return $this; }