Регистрация ORMObjectListener с компонентной структурой

Я только что попытался добавить регистрацию моего пользовательского ORMObjectListener с экземплярами и реализациями, но это не сработало. Я вижу, что все системные ORMObjectListener-ы зарегистрированы в методе картриджа onReadyHook(), но мне нравится пытаться зарегистрировать их с компонентным фреймворком.

Я добавил следующее в файл functions.component:

<implementation name="ProductPODeleteListener" class="hr.a1.orm.product.internal.ProductPODeleteListener" start="start" stop="stop" factory="JavaBeanFactory"/>

И после instance.component:

<instance name="ProductPODeleteListener" with="ProductPODeleteListener" scope="global"/>

Это метод запуска ProductPODeleteListener:

public synchronized void start() {
    productFactory.addObjectListener(this);
}

Но мой пользовательский слушатель не зарегистрирован (метод запуска никогда не вызывается). Я вижу в файле журнала, что реализация загружается при запуске:

"Adding implementation ProductPODeleteListener to configuration bc_a1_orm."

Я сделал что-то неправильно?

Может быть, не хватает вызова componentMgr.getGlobalComponentInstance("ProductPODeleteListener")? Как указано здесь: https://support.intershop.com/kb/index.php/Display/25G731#Concept-ComponentFramework-InGeneral -> «ComponentFW создаст экземпляры всех определенных экземпляров при первом доступе». Я не думаю, что возможно зарегистрировать слушателей с компонентной структурой, так как их необходимо зарегистрировать при запуске сервера. Это правильно?

Спасибо за помощь!


person Goran Petanjek    schedule 25.10.2018    source источник


Ответы (1)


Вы совершенно правы. Я проверил это, и компонент никогда не инициализируется при запуске сервера. Только если какой-либо другой код запрашивает ваш компонент, он когда-либо инициализируется. Глобальный или приложение не будет иметь значения.

//get instance 
NamingMgr.getManager(ComponentMgr.class).getGlobalComponentInstance("ProductPODeleteListener");
//after this component is init & listeren is up

Я предполагаю, что эта «ленивая загрузка» выполняется из соображений производительности.

Мне кажется, лучше всего загрузить слушателя методом onPostStartup в классе картриджа. Этот не устарел и, похоже, никогда не будет.

public class CustomCartridge extends Cartridge
{
    @Override
    public boolean onPostStartup()
    {
        System.out.println("starting customer cartridge listener");

        ProductPOFactory productFactory = (ProductPOFactory)NamingMgr.getInstance().lookupFactory(ProductPO.class);
        productFactory.addObjectListener(new ProductPODeleteListener());

        return super.onPostStartup();
    }

}

В файле свойств картриджа измените класс загрузки на свой

################################################################################
# cartridge properties for cartridge CustomCartridge
################################################################################

intershop.cartridges.CustomCartridge.classname=com.example.capi.CustomCartridge
person Willem Evertse    schedule 29.10.2018
comment
Да, в итоге я так и сделал. Благодарю вас! - person Goran Petanjek; 29.10.2018