BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: 15 сен 2015, 17:44 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
На изменение тарифного плана повесил динамический код, который добавляет персональный тарифный план и делает перерасчет для договора. По коду сначала устанавливается ПТ и после этого запускается Calculator. После установки ПТ бросаются события:
Код:
ep = EventProcessor.getInstance();

ep.publish(new ContractTariffChangedEvent(contractId));
ep.publish(new PersonalTariffUpdateEvent(userId, contractId, subTariffId));


После события вызывается Calculator, но он почему-то не учитывает только что сделанные изменения с тарифом. Если персональный тариф добавился скриптом, то Calculator считает, что никакого персонального тарифа нет вовсе.

Вместо publish пробовал publishAfterCommit, но результат тот же. Думаю, что нужно вызвать commit принудительно перед перерасчётом, но не знаю как это сделать.

Может кто-нибудь посоветовать, как правильно вызвать Calculator сразу после изменения персонального тарифа?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 сен 2015, 18:36 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Там надо сделать оповестить об изменениях.

Код:
 List<TariffTreeModifiedEvent> events = new ArrayList<TariffTreeModifiedEvent>();
       new TariffTreeBuilder( con ).getMtreeModifiedEvents( mtreeId, userID, events );
      
       for( TariffTreeModifiedEvent event : events )
       {
          EventProcessor.getInstance().publish( event );
       }


А так сложно нужно делать, если у вас используется наследование деревьев.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 сен 2015, 18:56 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Приведённый код у меня уже есть, но с ним не работает.

Кстати, да. Перерасчёт выполняется неправильно только при изменении дерева персонального тарифа с одного на другое. При добавлении и удалении ПТ перерасчёт даёт правильные результаты.

И да, там используется наследование от глобальных тарифов. Что делать, если есть наследование?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


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

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
vkulakov писал(а):
Приведённый код у меня уже есть, но с ним не работает.

Кстати, да. Перерасчёт выполняется неправильно только при изменении дерева персонального тарифа с одного на другое. При добавлении и удалении ПТ перерасчёт даёт правильные результаты.

И да, там используется наследование от глобальных тарифов. Что делать, если есть наследование?


Если вручную изменить персональный тариф и оповестить об изменениях, то переобсчет работает ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 сен 2015, 21:31 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Так ведь в стандартной комплектации пересчёт никогда не делается при изменении тарифов?

Если вы имеете в виду мой скрипт, то он начинает правильно считать даже если просто сразу пересохранить тариф. Т. е. поменял тариф на договоре на другой, сработал скрипт изменения ПТ и Calculator показал неправильное значение. Открываю тариф, жму ОК, опять срабатывает скрипт и Calculator уже показывает правильные значения.

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 14:02 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Такое ощущение, что информация о дереве персонального тарифа сохранена где-то в кеше потока, и при изменении дерева этот кеш в текущем потоке никак не обновляется. При пересохранении тарифа вызывается новое события, которое обрабатывается в новом потоке с уже новым кешем и всё работает как положено.

Правильно ли я думаю? Можно ли принудительно обновить этот кеш?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 14:11 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
При изменении дерева персонального тарифа добавил события:
Код:
ep.publish(new ContractTariffChangedEvent(contractId));
ep.publish(new PersonalTariffUpdateEvent(userId, contractId, subTariffId));
ep.publish(new PersonalTariffTreeUpdateEvent(userId, contractId, subTariffId));

и начались чудеса: после изменения тарифа на договоре сначала появляется правильная наработка от текущего тарифа, потом она меняется на неправильную наработку от предыдущего тарифа.

Всё это очень странно...

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 17:25 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Может кто-нибудь помочь мне с описанной проблемой?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 17:54 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
А попробуйте все события вызывать publishAfterCommit .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 18:01 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Переделал всё на publishAfterCommit. Результат тот же - сначала неправильно, после пересохранения правильно.

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 18:08 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
пробовать надо и разбираться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 сен 2015, 18:19 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
А костыль временный можете посоветовать?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 сен 2015, 23:02 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Вроде стало понятнее. Сейчас для изменения дерева персонального тарифа использую такой код:
Код:
ttb.createMtree(subTreeId, NPAY_MID, parentTreeId);
try {
   ttb.getMtreeModifiedEvents(subModuleTreeId, userId, events);
   for(TariffTreeModifiedEvent event : events) {
      ep.publish(event);
   }
} catch(BGException e) {
   error("Ошибка получения событий: " + e.getMessage());
}

ep.publish(event) нужен для того, чтобы после изменения дерева для персонального тарифа в кеше обновилась соответствующая информация о дереве. Но обработка этого события происходит асинхронно и до вызова калькулятора информация о дереве ещё не успевает обновиться.

Для решения проблемы можно бросить события в асинхронном режиме, но я не знаю как. Может кто-нибудь подсказать, есть ли возможность бросить события в синхронном режиме?

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 сен 2015, 14:54 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
На свежую голову, наконец-то, придумал нормальное решение.

Вместо изменение родителя поддерева модуля персонального тарифа и публикации событий TariffTreeModifiedEvent я теперь целиком удаляю дерево персонального тарифа и создаю новое. В этом случае в кеше поддерева модуля ещё нет и при перерасчёте данные берутся не из кеша, а напрямую из базы.

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

Думаю, так и оставлю.

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 1


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

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