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 и т.д.)
.....


Если Вас не затруднит, вкратце, крупными мазками - как сиим чудом пользоваться ? :o

Автор:  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] за развёрнутый ответ.

Я пока еще зелёный :) Не хотят меня вместо Димона брать, я всё же иногда работаю :D

В документацию, кстати, добавили.
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/