BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 апр 2024, 23:02

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 07 июн 2016, 16:54 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Здравствуйте

Используем BGbilling 6.0
Добавили код рассылки писем по событию прихода платежа.
Для этого повесил в "Функции скриптов поведения" Класс Java на событие "Приход платежа"
Он содержит примерно следующий код:
Код:
   public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 )
      throws Exception
   {
      // Оповещение клиента о пополнении
      if(event1 instanceof PaymentEvent)
      {
         PaymentEvent p_event = (PaymentEvent)event1;
         Payment p = p_event.getPayment();
               ...
// Посылаем письмо с использованием ru.bitel.bgbilling.plugins.dispatch.server.sender.EmailSender
      Сontact c = new Contact();
      c.setContractId(contr.getId());
      c.setContactTypeId(1);
      EmailSender m_sender = new EmailSender();
      ArrayList<String> managerMails; // Содержит список почт
      for(String mail : managerMails)
      {
         c.setValue(mail);
         m_sender.send(c,"Пополнение баланса","Тело", new ArrayList<javax.activation.DataSource>());
      }
   }
}


События платежа так же генерируется в другом java коде:
Код:
// Занесение платежа в систему
EventProcessor.getInstance().publishAfterCommit( new PaymentEvent( contract_id, payment ) );


Код работает нормально до поры до времени.
Иногда по какой то причине(Которую я пытаюсь найти) приходят очень много оповещений об одном и том же платеже.
Например: При 1 платеже должно быть одно оповещение, а приходят больше одного, при этом кол-во оповещений разное.

Ошибок в server.error.log и в scheduler.error.log во время прихода оповещений нет.
Точнее логи содержали Exception-ы но они относились к другому коду.(Могут ли исключения которые выкидываются в другой части биллинга как то влиять на отработку события отправки письма?)

Может кто может подсказать в какую сторону смотреть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 июн 2016, 19:53 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
добавьте в ваш код какую нибудь отладочную инфу, например текущую дату, какой договор какой платеж и т.д.

потом лог выложите сюда... будет хоть какая то инфа для анализа


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 11:05 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Так и сделал, лог кода в котором вызывается событие прихода платежа:
Код:
2016-06-08 03:00:10 | Add event about payment contract id = 9671 sum: 15
2016-06-08 03:00:10 | Add event about payment contract id = 9675 sum: 400
2016-06-08 03:00:10 | Add event about payment contract id = 9677 sum: 10
2016-06-08 03:00:10 | Add event about payment contract id = 9680 sum: 10


И получается письма пришли только по поводу contract id 9680. При чем 4 штуки.

Так же нашел 3 Exception-а.
Код:
java.util.concurrent.ExecutionException: java.lang.Exception: java.lang.NullPointerException
        at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:232)
        at java.util.concurrent.FutureTask.get(FutureTask.java:91)
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener$ThreadedScriptEventListener.runScriptImpl(DynamicScriptEventListener.java:267)
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener.runScript(DynamicScriptEventListener.java:149)
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener.notify(DynamicScriptEventListener.java:117)
        at ru.bitel.bgbilling.kernel.event.AbstractConsumer.notify(AbstractConsumer.java:344)
        at ru.bitel.bgbilling.kernel.event.Consumer.notify(Consumer.java:1)
        at ru.bitel.bgbilling.kernel.event.Consumer.onMessage0(Consumer.java:112)
        at ru.bitel.bgbilling.kernel.event.Consumer$EventListenerRunnable.runImpl(Consumer.java:51)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)
Caused by: java.lang.Exception: java.lang.NullPointerException
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener.runScriptImpl(DynamicScriptEventListener.java:200)
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener$ThreadedScriptEventListener.access$0(DynamicScriptEventListener.java:1)
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener$ThreadedScriptEventListener$1.call(DynamicScriptEventListener.java:254)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        ... 4 more
Caused by: java.lang.NullPointerException
        at api.ru.customservice.bgbilling.bean.Status.getStatus(Status.java:58)
        at StatusWorker.onEvent(StatusWorker.java:74)  <-------------Этот код находится ниже отправки письма
        at ru.bitel.bgbilling.kernel.script.server.DynamicScriptEventListener.runScriptImpl(DynamicScriptEventListener.java:196)
        ... 8 more


Предположение то что использую не тот метод для вызова события платежа.(или не правильно использую)
Код:
for(...)
{
 // Занесение платежа в систему
 EventProcessor.getInstance().publishAfterCommit( new PaymentEvent( contract_id, payment ) );
}

Видимо надо использовать метод:
Код:
public final void publish(Event e)
                   throws ru.bitel.bgbilling.common.BGException

Правильно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 11:53 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
вообще непонятно зачем вы откуда-то руками посылаете событие по приходу платежа (откуда? откуда-то из дин кода). а потом его же где-то ловите (скрипт на дин коде?). вы до этого платёж добавляете или что или как?

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 12:16 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Почему сделано так:
В начале была необходимость: отсылать письма по приходу платежей через платежную систему.
Появился класс который при событии платежа отправляет письмо.

Далее появилась необходимость: по информации из 3 системы раз в сутки генерировать платежи.
Вот и пришли к такой реализации.

Код:
for(...)
{
 // <--- Добавляется платеж в контракт
 // Занесение платежа в систему
 EventProcessor.getInstance().publishAfterCommit( new PaymentEvent( contract_id, payment ) );
}


Все делается в дин коде.
Если есть система событий, почему ее не использовать?


Последний раз редактировалось Antonavt 08 июн 2016, 12:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 12:22 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
а платёж как добавляется?

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 12:33 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Вот так выглядит код:
Код:
Payment p = new Payment();
PaymentManager pm = new PaymentManager(connectionSet2.getConnection());
BalanceUtils bu = new BalanceUtils(connectionSet2.getConnection());
for(int i = 0; i < payment_list.size(); ++i)
{
   BigDecimal sum = getSumm(payment_list.get(i));//получаем платеж
   p.setSumma(sum);
   p.setContractId(payment_list.get(i).getContractId());
   p.setComment("Коммент ");
   p.setTypeId(6);
   p.setId(-1);
   p.setPaymentDate(date);
   p.setTimeChange(date.toString());
   p.setTypeTitle("Бонусы");
   p.setUserId(12);
   pm.updatePayment(p);
   EventProcessor.getInstance().publishAfterCommit( new PaymentEvent( payment_list.get(i).getContractId(), p ) );
   bu.updateBalance(date, p.getContractId());
}

Платежи все корректно добавляются, сбоев не было.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2016, 14:19 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
первый аргумент PaymentEvent - не ContractId, а userId, хотя не уверен что относится к проблеме

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июн 2016, 10:44 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Цитата:
первый аргумент PaymentEvent - не ContractId, а userId, хотя не уверен что относится к проблеме

Проверил, Изменение на фиксированный user_id никак не повлияло на проблему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июн 2016, 11:07 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Antonavt писал(а):
Так и сделал, лог кода в котором вызывается событие прихода платежа:
Код:
2016-06-08 03:00:10 | Add event about payment contract id = 9671 sum: 15
2016-06-08 03:00:10 | Add event about payment contract id = 9675 sum: 400
2016-06-08 03:00:10 | Add event about payment contract id = 9677 sum: 10
2016-06-08 03:00:10 | Add event about payment contract id = 9680 sum: 10


И получается письма пришли только по поводу contract id 9680. При чем 4 штуки.


Вот у вас 4 отправки евента и пришло 4 письма, но не вполне корректно, причём для последнего, и вас это не натолкнуло ни на какую мысль?
А всё потому что вы 4 раза сделали отправку события, куда передали один и тот же инстанс (p). Просто в цикле 4 раза перетёрли ему параметры, естественно, к моменту отправки (что происходит after commit) его состояние было то, каким вы его сделали на 4й раз, потому все 4 события отправили для одного и того же объекта (Payment p, четвёртого состояния).

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июн 2016, 11:08 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Ну, решение, очевидно, new Payment() делать для каждой отправки отдельно.

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июн 2016, 11:56 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Да, вы правы, давно не писал на Java.
При передаче параметров копируется ссылка на объект а не значение объекта...
Большое спасибо за помощь.


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

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


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

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


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

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