BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 мар 2024, 18:52

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 01 мар 2019, 18:17 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Добрый день!
Наткнулся в https://bgbilling.ru/v7.2/download/kernel/fixed :

Код:
....
960   26.02.2019 13:14:28   ДОБАВЛЕНО   Kernel: Обработка событий внешними скриптами (Php, Perl, Bash и т.д.)
.....


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

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 мар 2019, 19:30 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Код:
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);
        }
    }
}

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 мар 2019, 19:31 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Код:
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



Изображение

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 мар 2019, 19:48 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Отсюда

Цитата:
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]
В принципе это больше рассчитано на тех кто не знает яву и хочет обрабатывать события внешними скриптами, а им возврат не сильно нужен...

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 мар 2019, 20:46 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Большое спасибо уважаемый [b]Phricker[/b] за развёрнутый ответ.

В принципе вот здесь :
Цитата:
Кирилл Сергеев, [01.03.19 16:47]
В принципе это больше рассчитано на тех кто не знает яву и хочет обрабатывать события внешними скриптами, а им возврат не сильно нужен...

правильно угадывается мой нездоровый интерес к этой фиче.

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 мар 2019, 00:56 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
ok-2004 писал(а):
Большое спасибо уважаемый [b]Phricker[/b] за развёрнутый ответ.

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

В документацию, кстати, добавили.
https://docs.bitel.ru/pages/viewpage.ac ... =174882826

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 мар 2019, 11:43 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Для меня Вы всегда будете красным не смотря ни на какие правила и каноны.

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.077s | 32 Queries | GZIP : On ]