Регистрация ORMObjectListener с компонентным каркасом - PullRequest
0 голосов
/ 25 октября 2018

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

Я добавил следующее к реализациям.component:

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

И следующее для instances.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 будет создавать экземпляры всех определенных экземпляров при первом доступе».Я не думаю, что можно зарегистрировать слушателей с помощью компонентной инфраструктуры, так как они должны быть зарегистрированы при запуске сервера.Это правильно?

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

1 Ответ

0 голосов
/ 29 октября 2018

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

//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
...