Osgi 长期运行的AEM EventListener工作不一致-被列入黑名单?

Osgi 长期运行的AEM EventListener工作不一致-被列入黑名单?,osgi,aem,apache-felix,Osgi,Aem,Apache Felix,和往常一样,AEM给我的生活带来了新的挑战。这一次,我遇到了一个问题,侦听ReplicationEvent的EventListener有时会工作,通常只是在服务重新启动后的最初几次。之后,它将完全停止运行 侦听器的第一行是日志行。如果它正在运行,就会很清楚。下面是侦听器的简化示例: @Component(immediate = true, metatype = false) @Service(value = EventHandler.class) @Property( name="eve

和往常一样,AEM给我的生活带来了新的挑战。这一次,我遇到了一个问题,侦听
ReplicationEvent
EventListener
有时会工作,通常只是在服务重新启动后的最初几次。之后,它将完全停止运行

侦听器的第一行是日志行。如果它正在运行,就会很清楚。下面是侦听器的简化示例:

@Component(immediate = true, metatype = false)
@Service(value = EventHandler.class)
@Property(
    name="event.topics",  value = ReplicationEvent.EVENT_TOPIC
)
public class MyActivityReplicationListener implements EventHandler {

    @Reference
    private SlingRepository repository;

    @Reference
    private OnboardingInterface onboardingService;

    @Reference
    private QueryInterface queryInterface;

    private Logger log = LoggerFactory.getLogger(this.getClass());
    private Session session;

    @Override
    public void handleEvent(Event ev) {
        log.info(String.format("Starting %s", this.getClass()));
        // Business logic
        log.info(String.format("Finished %s", this.getClass()));
    }
}

现在,在您担心我没有包括业务逻辑之前,请参阅下面我的答案。有趣的是,业务逻辑可能需要几秒钟的时间。

当我在谷歌搜索的第二个页面上爬行寻找答案时,我遇到了一个问题。一篇德国文章解释说,需要5秒以上才能完成的
EventListeners
被AEM默默隔离,没有输出

碰巧这个任务可能需要5秒以上的时间,因为它处理的数据本来很小,但已经增加了(这与其他症状一致)

我在中做了一个更改,使侦听器更像那篇文章中的侦听器-即,它使用
EventConsumer
使用发布/订阅模型异步处理
ReplicationEvent
。以下是新模型的简化版本(适用于AEM 6.3):

@组件(立即数=true,属性={
EventConstants.EVENT_主题+“=”+ReplicationEvent.EVENT_主题,
JobConsumer.PROPERTY_主题+“=”+AsyncReplicationListener.JOB_主题
})
公共类AsyncReplicationListener实现EventHandler、JobConsumer{
私有静态最终字符串属性\u EVENT=“EVENT”;
静态最终字符串JOB\u TOPIC=ReplicationEvent.EVENT\u TOPIC;
@参考文献
私人职业经理人职业经理人;
@凌驾
public JobConsumer.JobResult过程(作业){
试一试{
ReplicationEvent事件=(ReplicationEvent)job.getProperty(PROPERTY\u事件);
//缓慢的业务逻辑(>5秒)
}捕获(例外e){
返回JobResult.0失败;
}
返回JobResult.OK;
}
@凌驾
公共无效handleEvent(事件){
最终映射有效负载=新HashMap();
payload.put(PROPERTY_事件,ReplicationEvent.fromEvent(事件));
最终作业addJobResult=jobManager.addJob(作业主题,有效负载);
}
}
您可以在这里看到,
EventListener
传递了包装在
作业中的
ReplicationEvent
,然后由
作业消费者处理,根据这篇神奇的文章,它不受5秒规则的约束

这里有一些关于这个时间限制的建议。一旦我有了“5秒”键,我就能够获得更多的信息,这也就是5秒的限制。第一篇文章使用了与上面类似的方法,第二篇文章展示了关闭这些时间限制的方法


通过在Apache Felix事件管理实现配置中将
Timeout
属性设置为零,可以在configMgr中完全禁用(或增加)时间限制。

在搜索Google搜索的第二页以查找答案时,我发现。一篇德国文章解释说,需要5秒以上才能完成的
EventListeners
被AEM默默隔离,没有输出

碰巧这个任务可能需要5秒以上的时间,因为它处理的数据本来很小,但已经增加了(这与其他症状一致)

我在中做了一个更改,使侦听器更像那篇文章中的侦听器-即,它使用
EventConsumer
使用发布/订阅模型异步处理
ReplicationEvent
。以下是新模型的简化版本(适用于AEM 6.3):

@组件(立即数=true,属性={
EventConstants.EVENT_主题+“=”+ReplicationEvent.EVENT_主题,
JobConsumer.PROPERTY_主题+“=”+AsyncReplicationListener.JOB_主题
})
公共类AsyncReplicationListener实现EventHandler、JobConsumer{
私有静态最终字符串属性\u EVENT=“EVENT”;
静态最终字符串JOB\u TOPIC=ReplicationEvent.EVENT\u TOPIC;
@参考文献
私人职业经理人职业经理人;
@凌驾
public JobConsumer.JobResult过程(作业){
试一试{
ReplicationEvent事件=(ReplicationEvent)job.getProperty(PROPERTY\u事件);
//缓慢的业务逻辑(>5秒)
}捕获(例外e){
返回JobResult.0失败;
}
返回JobResult.OK;
}
@凌驾
公共无效handleEvent(事件){
最终映射有效负载=新HashMap();
payload.put(PROPERTY_事件,ReplicationEvent.fromEvent(事件));
最终作业addJobResult=jobManager.addJob(作业主题,有效负载);
}
}
您可以在这里看到,
EventListener
传递了包装在
作业中的
ReplicationEvent
,然后由
作业消费者处理,根据这篇神奇的文章,它不受5秒规则的约束

这里有一些关于这个时间限制的建议。一旦我有了“5秒”键,我就能够获得更多的信息,这也就是5秒的限制。第一篇文章使用了与上面类似的方法,第二篇文章展示了关闭这些时间限制的方法


通过在Apache Felix事件管理实现配置中将
Timeout
属性设置为零,可以在configMgr中完全禁用(或增加)时间限制。

典型的解决方案是启动处理事件的新线程。所以你可以确保你很快回来。几句评论。EventAdmin将处理程序列入黑名单的决定应已记录。。。确保安装了一个工作日志服务。第二个poi
@Component(immediate = true, property = {
        EventConstants.EVENT_TOPIC + "=" + ReplicationEvent.EVENT_TOPIC,
        JobConsumer.PROPERTY_TOPICS + "=" + AsyncReplicationListener.JOB_TOPIC
})
public class AsyncReplicationListener implements EventHandler, JobConsumer {

    private static final String PROPERTY_EVENT = "event";
    static final String JOB_TOPIC = ReplicationEvent.EVENT_TOPIC;

    @Reference
    private JobManager jobManager;

    @Override
    public JobConsumer.JobResult process (Job job) {
        try {
            ReplicationEvent event = (ReplicationEvent)job.getProperty(PROPERTY_EVENT);

            // Slow business logic (>5 seconds)

        } catch (Exception e) {
            return JobResult.FAILED;
        }
        return JobResult.OK ;
    }

    @Override
    public void handleEvent(Event event) {
        final Map <String, Object> payload = new HashMap<>();
        payload.put(PROPERTY_EVENT, ReplicationEvent.fromEvent(event));

        final Job addJobResult = jobManager.addJob(JOB_TOPIC , payload);
    }
}