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

[5.2] dynservice на devicePortUpdate
http://forum.bitel.ru/viewtopic.php?f=44&t=10839
Страница 1 из 1

Автор:  linzmen [ 31 авг 2015, 13:06 ]
Заголовок сообщения:  [5.2] dynservice на devicePortUpdate

Добрый день уважаемые.
Прошу совета или подсказки в какую сторону смотреть.
Используя dynservice пытаюсь переопределить работу метода portUpdate
Нужно чтобы при создании очередного интерфейса на устройстве выполнялась проверка на наличие ранее созданного интерфейса с таким же названием. В случае если интерфейс с таким названием есть достаточно вывести сообщение об ошибке.
Нашёл нужный метод devicePortUpdate в ru.bitel.oss.systems.inventory.resource.common.DeviceInterfaceService. Использую dynservice для перегрузки своей реализацией метода.
Однако, результата никакого не получаю.
В журнале нет ни строчки о том, что новый метод был вызван.
В конфигурации сервера указано:
Код:
 
dynservice:ru.bitel.oss.systems.inventory.resource.common.DeviceInterfaceService=my.own.service.DeviceInterfaceServiceImpl

Код сервиса:
Код:
@WebService(endpointInterface = "ru.bitel.oss.systems.inventory.resource.common.DeviceInterfaceService")
public class DeviceInterfaceServiceImpl
        extends ru.bitel.oss.systems.inventory.resource.server.DeviceInterfaceServiceImpl
        implements DeviceInterfaceService {

    private static final Logger logger = Logger.getLogger(DeviceInterfaceServiceImpl.class);

    @Override
    public void devicePortUpdate(DeviceInterface port) throws BGException {
        logger.debug("devicePortUpdate MID: " + this.moduleId);
        try {
            /**
             * Проверить наличие интерфейса с таким title.
             * Если интерфейс найден, запретить его создавать.
             */
            Statement pst = this.getSlaveConnection().createStatement();
            String sql = "SELECT 1 FROM inv_device_port_" + this.moduleId + " WHERE title='" + port.getTitle() + "'";
            logger.debug("devicePortUpdate SQL: " + sql);
            ResultSet result = pst.executeQuery(sql);
            if (result.first()) {
                throw new BGException("Вы не можете зарезервировать интерфейс " + port.getSubscriberTitle() + ", так как такой интерфейс уже существует.");
            }
            super.devicePortUpdate(port);
        } catch (SQLException e) {
            logger.error(e.getMessage());
            throw new BGException(e);
        }
    }

}


ЗЫ
Да, понимаю что проверить наличие интерфейса в базе можно иначе, но мне, пока, достаточно сделать хотя-бы так.

Автор:  dimOn [ 31 авг 2015, 13:20 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

в доке/вики неспроста выделено жирным:
Цитата:
Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.

Цитата:
dynservice:<модуль>.<интерфейс_сервиса>=<дин.класс>

common там быть никак не может, <модуль> там наверное будет
Цитата:
ru.bitel.oss.systems.inventory.resource
, посмотрите в клиенте (в логе) какой используется для доступа к этому веб-сервису

так что будет НАВЕРНОЕ
Код:
dynservice:ru.bitel.oss.systems.inventory.resource.DeviceInterfaceService=my.own.service.DeviceInterfaceServiceImpl

но проверьте и уточните какой там модуль в нужном вам вызове

Автор:  linzmen [ 31 авг 2015, 14:12 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Благодарю за скорый ответ.
Вариант
Цитата:
dynservice:ru.bitel.oss.systems.inventory.resource.DeviceInterfaceService
я проверял. Не работает.

В журнале единственное что написано это:
Цитата:
AbstractJaxWsHandler - executing ru.bitel.oss.systems.inventory.resource.server.DeviceInterfaceServiceImpl.devicePortUpdate; time => 7 ms.


В общем, буду копать...

Автор:  dimOn [ 31 авг 2015, 15:02 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

не в журнале, а в логах клиента смотрите как вызывается нужный сервис (ну или экшен), зачем тут гадать то

Автор:  dimOn [ 31 авг 2015, 15:14 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

если в конфиге всё верно прописано то в логах сервера будет при вызове:
Цитата:
load dynservice class for <...>: <...>...


ещё сервер пробуйте перезагрузить в разных непонятных ситуациях (после смены конфига в данном случае), там бывает залипает в сложных ситуациях в кеше что-нибудь

Автор:  Phricker [ 31 авг 2015, 15:23 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Кстати да.
При смене стандартного сервиса на свой - работает после ребута сервера.

Автор:  linzmen [ 31 авг 2015, 15:32 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Phricker писал(а):
Кстати да.
При смене стандартного сервиса на свой - работает после ребута сервера.


Означает ли это то, что при изменении значения атрибута dynservice в настройках сервера нужно перезагружать сервер?

Автор:  Phricker [ 31 авг 2015, 16:17 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

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

Автор:  dimOn [ 31 авг 2015, 16:22 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

linzmen писал(а):
Phricker писал(а):
Кстати да.
При смене стандартного сервиса на свой - работает после ребута сервера.


Означает ли это то, что при изменении значения атрибута dynservice в настройках сервера нужно перезагружать сервер?

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

Автор:  dmitry_P [ 14 май 2016, 12:31 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Люди добрые! Поможите чем можете!
Вроде досконально изучил данную тему. Перепробовал все возможные и невозможные варианты, каждый раз перегружая сервер. Ничего не помогает.
Хочу переопределить сервис модуля Inet. По методе описанной здесь, смотрю в логе клиента его вызов:
хттп://IP:port/bgbilling/executer/ru.bitel.bgbilling.modules.inet.api/27/InetServService?wsdl -> {http://service.common.api.inet.modules.bgbilling.bitel.ru/}InetServService:inetServUpdate
27 - id экземпляра модуля
В конфе ставил:
dynservice:ru.bitel.bgbilling.modules.inet.api.InetServService =my.own.InetServServiceImpl
dynservice:ru.bitel.bgbilling.modules.inet.api.27.InetServService =my.own.InetServServiceImpl
dynservice:ru.bitel.bgbilling.modules.inet.api/27.InetServService =my.own.InetServServiceImpl
да что только не ставил!
Код никакой:

import javax.jws.WebService;

import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.common.BGMessageException;
import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServOption;

@WebService(endpointInterface = "ru.bitel.bgbilling.modules.inet.api.common.service.InetServService")

public class InetServServiceImpl
extends ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl
implements InetServService
{
@Override
public int inetServUpdate(InetServ inetServ, java.util.List<InetServOption> optionList, boolean generateLogin, boolean generatePassword, long saWaitTimeout)
throws BGException
{
throw new BGMessageException( "бла-бла-бла" );
}
}
компилится без ошибок. Но до него дело не доходит. Не перехватывается в общем. В логах сервера только выполнение родного класса.
Чего ему надо то?

Клиент: вер. 5.2 сборка 1237 от 14.12.2015 13:56:40
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.7.0_17
Сервер: вер. 5.2 сборка 1643 от 02.11.2015 16:37:29
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_31

Автор:  dimOn [ 14 май 2016, 14:56 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

dynservice:ru.bitel.bgbilling.modules.inet.api.InetServService =my.own.InetServServiceImpl
похож на правильный, возможно ещё, нет возможности проверить сейчас:
dynservice:ru.bitel.bgbilling.modules.inet.InetServService =my.own.InetServServiceImpl
цифр там никаких не должно быть.
не в конфиг модуля, надеюсь, это пишете?

Автор:  dmitry_P [ 15 май 2016, 13:05 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

dimOn писал(а):
не в конфиг модуля, надеюсь, это пишете?

Нет, конечно в общий конфиг. У меня уже есть несколько dynaction (с ними проще) и по вашему примеру из вики один dynservice для ContractStatusMonitorService. Все работает нормально. И вызов сервиса ContractStatusMonitorService я сравнивал с логом клиента, тут все без вопросов, совпадает. Меня смущает другое. Судя по доке в этой строке dynservice:<модуль>.<интерфейс_сервиса>=<дин.класс> фраза <модуль>, по идее, указывает на jar с классом интерфейса. Класс ContractStatusMonitorService и класс для порта девайса из начала темы (что-то там ru.bitel.oss.systems.inventory...) лежат в kernel.jar и, в этом случае, указатель на модуль вроде как не нужен. А нужный мне класс в inet.jar. Значит, по идее, должно быть что-то вроде:
dynservice:inet.ru.bitel.bgbilling.modules.inet.api.InetServService =my.own.InetServServiceImpl
Но я перепробовал все вариации и на эту тему. Ничего не помогает. Что-то как-то запутано все и до конца не разжевано нигде.
Help me if you can, I'm feeling down :(

Автор:  dimOn [ 16 май 2016, 00:44 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

нет, модуль - это то, что передаётся в качестве module при вызове сервиса (или экшена), название jar вообще никакого отношения не имеет к этому (не сразу даже сейчас придумал как его программно узнать можно). один из вариантов выше должен работать, я думаю

Автор:  dimOn [ 16 май 2016, 13:26 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Вот правильная настройка, проверил по коду:
Код:
dynservice:ru.bitel.bgbilling.modules.inet.api.InetServService=бла-бла

Проверяйте всё ещё раз. Ищите в логах по подстроке "dynservice class" про загрузку успешную или ошибку.
Проверьте что сервер перезагружается, т.к. настройки поиска endpoint class кешируются и следовательно пытается только первый раз для каждого вызова сервиса искать в конфиге что-то.

Автор:  dmitry_P [ 16 май 2016, 15:26 ]
Заголовок сообщения:  Re: [5.2] dynservice на devicePortUpdate

Хм, странно, но заработало. Спасибо. Вот только толку не будет :( и чего я сразу сюда https://forum.bitel.ru/viewtopic.php?f= ... %3A#p77973 не глянул

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