【问题标题】:Why OSGI event handler is not called always为什么不总是调用 OSGI 事件处理程序
【发布时间】:2020-03-06 07:21:00
【问题描述】:

我有简单的 OSGI 事件监听器类

@Component(immediate = true)
@Service(value = { EventHandler.class, JobConsumer.class })
@Properties(value = {
@Property(name = JobConsumer.PROPERTY_TOPICS, value = { 
TestEventHandler.JOB_TOPICS }),
@Property(name = EventConstants.EVENT_TOPIC, value = { PageEvent.EVENT_TOPIC }) })
public class TestEventHandler implements EventHandler, JobConsumer {

    @Override
    public void handleEvent(final org.osgi.service.event.Event event) 
    {
        // Create job based on some complex condition
        jobManager.createJob(JOB_TOPICS).properties(properties).add();
    }

    @Override
    public JobResult process(Job job) {
        // Process job based on parameter in handleEvent function
    }
}

handleEvent 事件有时会被调用,但并非总是如此。它突然停止监听事件,如果我在 Felix 控制台中再次重新启动服务,它就会再次开始工作。还有其他自定义的 OSGI 事件监听器没有这个问题,只有这个监听器有问题。

你能告诉我吗

1) 发生这种情况是因为在 Felix 事件管理 OSGI 配置中将线程池大小设置为 20 还是其他原因?

2) 我是否需要增加线程大小、异步/同步线程池比率和超时,如果是,我如何确定这些数字?

【问题讨论】:

    标签: osgi aem sling


    【解决方案1】:

    如果 EventHandler 花费的时间过长,它就会被列入黑名单,然后将不再接收任何事件。

    http://felix.apache.org/documentation/subprojects/apache-felix-event-admin.html

    可以配置甚至关闭超时。除此之外,使用执行器来运行长时间运行的任务是一种很好的做法。

    【讨论】:

    • 感谢您的帮助,如果我理解正确,如果 Eventhandler 花费的时间比指定的超时时间长,那么它是否被视为列入黑名单?如果我将其关闭,那么它会对 AEM 系统产生其他影响吗?您是否建议不要更改默认线程大小?
    • 还有一个问题,在执行器服务的情况下 Executors.newFixedThreadPool(? ); 的大小可能是多少它应该与 Felix Event Admin 中指定的相同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多