PRODUCTION_MODE) { define('AMQP_DEBUG', true); } /** Utilise pour le test de retour de requete curl */ define('HTTP_RESULT_OK', '200'); /** * Utilise curl pour faire POST a la service/messages d'ERP, et log le resultat * dans le fichier de log. * @param string $msg Objet de la classe AMQPMessage */ function postViaCurl($msg) { $data = $msg->body; global $ERP_URL_MESSAGES; // si l'url de resource services/messages d'ERP est vide, ne traite pas // le message recu if (empty($ERP_URL_MESSAGES)) { logger::instance()->cleanLog(); logger::instance()->log("Le URL de destination manque", EXTRA_VERBOSE_MODE); logger::instance()->writeLogToFile(); return; } // instanciation de messageSender $messageSender = new MessageSenderRest($ERP_URL_MESSAGES); // envoi requête REST $return = $messageSender->execute("POST", 'application/json', $data); // code retour $code = $messageSender->getResponseCode(); // log le retour de curl dans le fichier de log logger::instance()->cleanLog(); // si le code est vide on retourne une erreur if ($code == '') { logger::instance()->log(date('d/m/Y H:i'). ': curl_error : '. $messageSender->getErrorMessage(), EXTRA_VERBOSE_MODE); } // si le code retourné est différent de 200 if ($code != 200) { //message d'erreur extrait du HTML $error = $this->extractErrorFromHTML($return); // si le message d'erreur est vide if ($error === false) { $this->addToLog('', 'curl_error : '.$messageSender->getErrorMessage(), __FUNCTION__); logger::instance()->log(date('d/m/Y H:i'). ': curl_error : '. $messageSender->getErrorMessage(), EXTRA_VERBOSE_MODE); } else { logger::instance()->log(date('d/m/Y H:i'). ': '. $code . ' ' . $error.' Message: '. $data, EXTRA_VERBOSE_MODE); } logger::instance()->writeLogToFile(); } // si le resultat du curl est OK, fais une accuse d'acception pour le message if (isset($code) && $code == HTTP_RESULT_OK) { // accuse de reception du message $msg->delivery_info['channel']-> basic_ack($msg->delivery_info['delivery_tag']); } else { // le resultat de l'execution de curl indique un erreur // dors un peu avant de refuser le message sleep(2); // refuse le message $msg->delivery_info['channel']->basic_reject( $msg->delivery_info['delivery_tag'], true); } // envoie un message avec la chaine "quit" pour ce consumeur if ($msg->body === 'quit') { $msg->delivery_info['channel']-> basic_cancel($msg->delivery_info['consumer_tag']); } } // pour des besoins de log il faut set $_SERVER["REQUEST_URI"] if (!isset($_SERVER["REQUEST_URI"])) { $_SERVER["REQUEST_URI"] = __FILE__; } // si le $argv[1] manque on ne peut pas cree un tag unique pour le // consumeur et dans ce cas-la on termine l'execution $suffix = ''; if (!empty($argv) && count($argv) > 1) { $suffix = $argv[1]; } else { logger::instance()->log('Missing the command line argument used for tag suffix', EXTRA_VERBOSE_MODE); logger::instance()->writeLogToFile(); exit; } // un exchange fait le routage des messages vers les piles $exchange = 'routerRest'; // on va utiliser la pile $ERP_QUEUE $queueErp = $ERP_QUEUE; // l'identifiant unique de consumeur ; il est utilise par RabbitMQ $consumer_tag = 'consumerRest'.$suffix; // etablis une connexion avec RabbitMQ instance $conn = new AMQPConnection($RMQ_CONNECTION_HOST, $RMQ_CONNECTION_PORT, $RMQ_CONNECTION_USER, $RMQ_CONNECTION_PASSWORD, $RMQ_CONNECTION_VHOST); // obtiens un canal de la connexion $ch = $conn->channel(); // si le canal n'est pas disponible arretes l'execution if (is_null($ch)) { // probleme avec la connexion, log le fait et arrete l'execution logger::instance()->log('Probleme dans l\'etablisement de la connexion', EXTRA_VERBOSE_MODE); logger::instance()->writeLogToFile(); exit; } // declare une pile (la creer s'il faut) $ch->queue_declare($queueErp, false, true, false, false); // declare un exchange qui va diriger les messages $ch->exchange_declare($exchange, 'direct', false, true, false); // relier la pile d'ERP au exchange $ch->queue_bind($queueErp, $exchange); // registre le callback pour ce consumer aupres de RabbitMQ $ch->basic_consume($queueErp, $consumer_tag, false, false, false, false, 'postViaCurl'); // loop as long as the channel has callbacks registered while (count($ch->callbacks)) { $ch->wait(); } ?>