forum.bitel.ru http://forum.bitel.ru/ |
|
Обработка событий внешними скриптами http://forum.bitel.ru/viewtopic.php?f=22&t=13239 |
Страница 1 из 1 |
Автор: | ok-2004 [ 01 мар 2019, 18:17 ] |
Заголовок сообщения: | Обработка событий внешними скриптами |
Добрый день! Наткнулся в https://bgbilling.ru/v7.2/download/kernel/fixed : Код: .... 960 26.02.2019 13:14:28 ДОБАВЛЕНО Kernel: Обработка событий внешними скриптами (Php, Perl, Bash и т.д.) ..... Если Вас не затруднит, вкратце, крупными мазками - как сиим чудом пользоваться ? |
Автор: | Phricker [ 01 мар 2019, 19:30 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
Код: package ru.bitel.bgbilling.kernel.script.server.dev;
import ru.bitel.bgbilling.kernel.event.*; import org.json.*; import ru.bitel.common.*; import java.io.*; import java.util.*; import java.math.*; import java.lang.reflect.*; public abstract class EventScriptBase<E extends Event> implements EventScript<E> { protected PrintStream out; protected PrintStream err; public void setOutputStream(final PrintStream out) { this.out = out; } public void setErrorStream(final PrintStream err) { this.err = err; } protected void print(final Object message) { this.out.println(message); } protected void error(final Object message) { this.err.println(message); } protected void doExternalScript(final E event, final List<String> command) { try { final ProcessBuilder processBuilder = new ProcessBuilder(command); final Process process = processBuilder.start(); final JSONObject eventJsonObject = new JSONObject((Object)event); final OutputStream outputStream = process.getOutputStream(); outputStream.write(eventJsonObject.toString().getBytes("UTF-8")); final ByteArrayOutputStream processOutputStream = new ByteArrayOutputStream(); Utils.flush(process.getInputStream(), processOutputStream); final String result = new String(processOutputStream.toByteArray(), "UTF-8"); this.print("result = " + result); if (result != null) { for (final String line : result.split("\n")) { if (line.startsWith("R:")) { final String[] tokens = line.substring(2).split("\t"); for (final Method method : event.getClass().getMethods()) { if (method.getName().equals(tokens[0]) && method.getParameterCount() == tokens.length - 1) { int index = 1; final List<Object> args = new ArrayList<Object>(); for (final Parameter parameter : method.getParameters()) { final Class<?> clazz = parameter.getType(); if (clazz.equals(String.class)) { args.add(String.valueOf(tokens[index])); } else if (clazz.equals(Integer.TYPE)) { args.add(Integer.parseInt(tokens[index])); } else if (clazz.equals(BigDecimal.class)) { args.add(new BigDecimal(tokens[index])); } ++index; } method.invoke(event, args.toArray()); break; } } } } } } catch (Exception ex) { ex.printStackTrace(this.err); } } } |
Автор: | Phricker [ 01 мар 2019, 19:31 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
Код: public class TestCreateContract extends EventScriptBase<ContractCreatedEvent> { @Override public void onEvent(ContractCreatedEvent event, Setup setup, ConnectionSet connectionSet) throws Exception { List<String> commands = new ArrayList<>(); commands.add("/opt/ping.sh"); this.doExternalScript(event, commands); } } Код: # cat ./ping.sh #!/bin/sh touch /opt/event.txt |
Автор: | Phricker [ 01 мар 2019, 19:48 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
Отсюда Цитата: Alexander Yakunin, [01.03.19 16:42]
Эм. Я так в пустоту спрошу Код: protected void doExternalScript(E event, List<String> command) { .... String result = new String(processOutputStream.toByteArray(), "UTF-8"); this.print("result = " + result); if (result != null) {blablablabla Alexander Yakunin, [01.03.19 16:42] Почему бы result не возвращать в методе. А мы с ним сами разберемся? Alexander Yakunin, [01.03.19 16:43] Или не было в ТЗ по доработке? ) Кирилл Сергеев, [01.03.19 16:43] Скрипт может вызвать методы события Alexander Yakunin, [01.03.19 16:45] угу понял Если в результе есть Код: if (line.startsWith("R:")) { то следующая за ним строка вызывает метод с таким же именем из этого класса? Кирилл Сергеев, [01.03.19 16:45] Да Кирилл Сергеев, [01.03.19 16:46] Возврат строки добавлю Кирилл Сергеев, [01.03.19 16:47] В принципе это больше рассчитано на тех кто не знает яву и хочет обрабатывать события внешними скриптами, а им возврат не сильно нужен... |
Автор: | ok-2004 [ 01 мар 2019, 20:46 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
Большое спасибо уважаемый [b]Phricker[/b] за развёрнутый ответ. В принципе вот здесь : Цитата: Кирилл Сергеев, [01.03.19 16:47] В принципе это больше рассчитано на тех кто не знает яву и хочет обрабатывать события внешними скриптами, а им возврат не сильно нужен... правильно угадывается мой нездоровый интерес к этой фиче. |
Автор: | Phricker [ 02 мар 2019, 00:56 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
ok-2004 писал(а): Большое спасибо уважаемый [b]Phricker[/b] за развёрнутый ответ. Я пока еще зелёный Не хотят меня вместо Димона брать, я всё же иногда работаю В документацию, кстати, добавили. https://docs.bitel.ru/pages/viewpage.ac ... =174882826 |
Автор: | ok-2004 [ 02 мар 2019, 11:43 ] |
Заголовок сообщения: | Re: Обработка событий внешними скриптами |
Для меня Вы всегда будете красным не смотря ни на какие правила и каноны. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |