forum.bitel.ru
http://forum.bitel.ru/

Сброс сервисов при блокировке договоров
http://forum.bitel.ru/viewtopic.php?f=19&t=12431
Страница 1 из 1

Автор:  spectrum [ 07 май 2017, 23:58 ]
Заголовок сообщения:  Сброс сервисов при блокировке договоров

Добрый день!

Вопрос следующий. При блокировке договоров:
Код:
         ContractStatus status = new ContractStatus();
         status.setContractId(contractId);
         status.setStatus(3);
         status.setComment("Недостаточно средств для начисления абонплаты");
         status.setDateFrom(new Date());
         status.setDateTo(null);
         ContractStatusManager contractStatusManager = new ContractStatusManager(con);
         contractStatusManager.changeStatus(status, 0);         
         con.commit();   


Не происходит сразу сброс состояний сервисов выделенных линий и текущих подключений абонентов.
Т.е. договор блокируется. Статус договора становится соответствующий, но при этом абонент подключен и продолжает работать. Т.е. сессия не сбрасывается. Так продолжается до тех пор, пока не закончит работу API-скрипт.
Дело в том, что мы пытаемся реализовать плавное отключение абонентов по балансу 1-го числа месяца. Т.е. не всех сразу, а постепенно. Таким образом предполагается работа скрипта несколько часов.
Блокировка договоров и начисление абонплат работает как положено. Но, как написал выше, не происходит сброс сессий абонентов и абонент остается активным. Каким образом можно принудительно установить соответствующее состояние сервиса "Отключен" и, соответственно, сбросить сессии?

Автор:  Phricker [ 08 май 2017, 10:47 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Либо воспользоваться в ContractStatusManager
Код:
changeStatus(ContractStatus newStatus, java.lang.Integer userId, boolean processEvent)
Смена статуса договора.

и boolean ProcessEvent выставить в true, чтобы бросилось событие
либо вручную после смены статуса бросить событие
Код:
EventProcessor eventProcessor = EventProcessor.getInstance();
EventProcessor.getInstance().publish( new ContractStatusChangedEvent(status, 0) );
EventProcessor.getInstance().publish( new ContractStatusChangedTopicEvent(status, 0) );

Автор:  Phricker [ 08 май 2017, 11:39 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Третий вариант - воспользоваться ContractStatusService

Код:
        ServerContext context = ServerContext.get();
        ContractStatusService contractStatusService = context.getService(ContractStatusService.class, 0);
        contractStatusService.contractStatusChange(cid, status, false);


Единственное НО, в ContractStatusService нельзя указывать пользователя.
Статус будет сменен под тем пользователем под которым запускался скрипт (если через планировщик - значит User.USER_SERVER)

Автор:  spectrum [ 08 май 2017, 12:02 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Спасибо большое!
Еще вопрос. Предположим выбрал вариант
Код:
changeStatus(ContractStatus newStatus, java.lang.Integer userId, boolean processEvent)

Не получится ли такой ситуации, произошла блокировка абонента, соответствующее состояние сервиса установилось, сессия сбросилась.
После этого абонент производит оплату, договор открывается. Абонент переподключается и работает.
При этом скрипт еще не закончил свою работу. При окончании работы скрипта не получится ли такой ситуации, что сервис переключится в состояние "Отключен"? Т.е. не будет ли заново запущено событие отключения на сервисе?

Автор:  Phricker [ 08 май 2017, 23:33 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Не должно.
Конечно если только у вас скрипт не выбрал кучу договоров на отключение, в цикле начал перебирать договора и у вас в цикле же стоит задержка.
В таком случае абонент может оплатить, а потом до него в цикле дойдет задание на приостановку и его выключит.

Автор:  spectrum [ 09 май 2017, 17:28 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Нет, Там оценка текущего баланса, блокировка договора и начисление абонплаты идут друг за другом без задержки. Задержка вставляется между договорами.
Кстати, получается 2-ой и 3-ий наверно не подходят. Потому как статус на данный момент ты установишь вручную, но потом, по окончании работы скрипта, состояние сервисов опять установится в "отключен", даже если абонент уже оплатил.

Автор:  spectrum [ 15 май 2017, 09:51 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

К сожалению все 3 способа оказались не рабочие.
1 способ. Там true - означает посылать событие, а false означает не посылать его вовсе. Т.е. при false даже после окончания работы скрипта не происходит отключения абонентской сессии.
2 способ. Он как будто вообще ни на что не влияет. Если в методе changeStatus выставишь processEvent в true, то отключение срабатывает после окончания работы скрипта. Если false, то отключение абонента не происходит вовсе.
3 способ. Блокировка также происходит только после окончания работы скрипта.

Уважаемые разработчики, посоветуйте что-нибудь.

Автор:  spectrum [ 16 май 2017, 12:43 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Уважаемые разработчики, прокомментируйте, плиз, ситуацию. Можно ли как-то принудительно отправить событие или может по-другому решить проблему? Почему она вообще возникает?

Автор:  stark [ 21 июл 2017, 18:01 ]
Заголовок сообщения:  Re: Сброс сервисов при блокировке договоров

Вам нужно делать 3-м способом и взывать commit у context-а,а не у connection. Тогда скорее всего будет работать. События отправляются после commit-а context-а.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/