我只是尝试添加我的自定义 ORMObjectListener 的实例和实现的注册,但它不起作用。我可以看到所有系统 ORMObjectListener-s 都在 Cartridge onReadyHook() 方法中注册,但我喜欢尝试使用组件框架注册它们。
我将以下内容添加到implementations.component:
<implementation name="ProductPODeleteListener" class="hr.a1.orm.product.internal.ProductPODeleteListener" start="start" stop="stop" factory="JavaBeanFactory"/>
下面是实例.组件:
<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 将在第一次访问时实例化所有定义的实例。”我认为不可能向组件框架注册监听器,因为这些监听器需要在服务器启动时注册。这是正确的吗?
感谢您的帮助!
最佳答案
你说得完全正确。我对此进行了测试,该组件从未在服务器启动时初始化。仅当其他代码请求您的组件时,它才会被初始化。全局或应用程序不会产生影响。
//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
关于components - 向组件框架注册 ORM 对象监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988412/