Вызов HTTP GET-запроса через MySQL путем выполнения команд собственной операционной системы, таких как curl
Я использую MySQL 5.6.11 под управлением 32-разрядной версии Microsoft Windows XP (профессиональная версия 2002 с пакетом обновления 3). Я установил MySQL sys_exec
UDF. Так как я работаю в 32-битной Windows, я использовал этот lib_mysqludf_sys.dll (находится под C:\Program Files\MySQL\MySQL Server 5.6\lib\plugin\
так как это установка по умолчанию).
После этого была выполнена следующая команда (после входа в уже созданную базу данных).
mysql> CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.dll';
Query OK, 0 rows affected (0.02 sec)
Я уже создал хранимую процедуру PL/SQL следующим образом.
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `country_push`()
BEGIN
SET @result=sys_exec('curl http://localhost:8080/ContextPath/push-update-country');
END
Предполагается, что эта процедура вызывается триггерами базы данных (что выполняется надлежащим образом), и, соответственно, она должна вызывать HTTP-запрос GET по указанному URL-адресу, но HTTP-запрос GET не вызывается по URL-адресу, когда эта хранимая процедура выполняется триггером. на определенное событие.
Выполнение процедуры в командной строке вручную также выполняется успешно, как описано ниже.
mysql> CALL country_push();
Query OK, 0 rows affected (0.08 sec)
sys_exec()
функция возвращает 1
следующим образом, который является флагом успеха.
mysql> SELECT sys_exec('curl http://localhost:8080/ContextPath/push-update-country')
AS result;
+--------+
| result |
+--------+
| 1 |
+--------+
1 row in set (0.06 sec)
На сервере приложений GlassFish (4.1) уже работает Java-сервлет, который должен прослушивать этот HTTP-запрос GET следующим образом.
@WebServlet(name = "PushCountry", urlPatterns = {"/push-update-country"})
public class PushCountry extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("PushCountry called.");
}
}
Линия System.out.println("PushCountry called.");
в doGet()
Метод не производит ничего на серверном терминале (потому что он не выполняется / не вызывается), когда вышеупомянутый материал MySQL применяется на практике.
Разве это не практично делать с использованием MySQL, я могу что-то упустить, или это старый EOL-динозавр: Windows XP?
Общая библиотека динамических ссылок, которую я использую, может не подойти. Пожалуйста, уточните, если это так, это не по мне.
РЕДАКТИРОВАТЬ:
При входе,
mysql> SELECT sys_eval('id');
MySQL завершает работу / вылетает со следующим сообщением об ошибке.
При закрытии этого диалога MySQL оставляет следующее сообщение об ошибке.
ОШИБКА 2013 (HY000): потеря соединения с сервером MySQL во время запроса
Не удается восстановить соединение, пока / или сама система не будет перезагружена.
Возможно, позже я подумаю о переустановке самой операционной системы.
1 ответ
Кажется, что 'id' - это команда Linux, не существующая под Windows... в любом случае, у меня также возникают проблемы с sys_exec() под окнами, которые возвращают число, но процесс не запускается. Для информации это хорошо работает под Linux.