PRODUCTION_MODE) { define('AMQP_DEBUG', true); } /** Utilise pour le test de retour de requete curl */ define('HTTP_RESULT_OK', '200'); /** * Méthode permettant d'envoyer des messages SOAP. * @param string $msg message a envoyer */ function postViaSOAP($msg) { global $ARRETE_WSDL; global $ARRETE_LOGIN; global $ARRETE_PASS; $data = $msg->body; $data = json_decode($data); // Verification que l'url du WSDL est définie if (empty($ARRETE_WSDL)) { logger::instance()->cleanLog(); logger::instance()->log("L'URL de fichier WSDL", EXTRA_VERBOSE_MODE); logger::instance()->writeLogToFile(); return; } // Instance de la classe permettant d'envoyer des requête SOAP $messageSender = new MessageSenderSoap($ARRETE_WSDL, $ARRETE_LOGIN, $ARRETE_PASS); $error = 0; //On lance la requête SOAP $execute = $messageSender->execute("ws_Send_Chronos_Arret", $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 = $messageSender->getErrorMessage(); // si le message d'erreur est vide if ($error === false) { sleep(2); // refuse le message $msg->delivery_info['channel']->basic_reject( $msg->delivery_info['delivery_tag'], true ); logger::instance()->log(date('d/m/Y H:i'). ': curl_error : '. $messageSender->getErrorMessage(), EXTRA_VERBOSE_MODE); } else { // accuse de reception du message $msg->delivery_info['channel']->basic_ack( $msg->delivery_info['delivery_tag'] ); logger::instance()->log(date('d/m/Y H:i'). ': '. $code . ' ' . $error.' Message envoye : '. $data, EXTRA_VERBOSE_MODE); } logger::instance()->writeLogToFile(); } // 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']); } // Retour de la méthode ws_Send_Chronos_Arret (à utiliser si besoin) // $info->ws_DA_Out_4D_vError // $info->ws_DA_Out_Chrono_Arret_ADS // $info->ws_DA_Out_N_Doss_ADS } // 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 = 'routerSoap'; // on va utiliser la pile $ARRETE_QUEUE $queueArrete = $ARRETE_QUEUE; // l'identifiant unique de consumeur ; il est utilise par RabbitMQ $consumer_tag = 'consumerSoap'.$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($queueArrete, false, true, false, false); // declare un exchange qui va diriger les messages $ch->exchange_declare($exchange, 'direct', false, true, false); // relier la pile d'arrete au exchange $ch->queue_bind($queueArrete, $exchange); // registre le callback pour ce consumer aupres de RabbitMQ $ch->basic_consume( $queueArrete, $consumer_tag, false, false, false, false, 'postViaSOAP' ); // loop as long as the channel has callbacks registered while (count($ch->callbacks)) { $ch->wait(); } ?>