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

时间:2018-04-10 17:33:32

标签: osgi aem apache-felix

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

侦听器的第一行是日志行。如果它正在运行,那就很清楚了。这是听众的简化示例:

@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()));
    }
}

现在在您恐慌之前我还没有包含业务逻辑,请参阅下面的答案。主要的兴趣点是业务逻辑可能需要几秒钟。

1 个答案:

答案 0 :(得分:2)

在浏览Google搜索的第二页以找到答案时,我遇到了this article。一篇德国文章解释说,EventListeners需要超过5秒才能完成,但是AEM默默地隔离了没有输出。

恰好这个任务可能花费的时间超过5秒,因为它处理的数据最初非常小,但已经增长(这与其他症状一致)。

我进行了一项更改,使得侦听器更像是该文章中的那个 - 也就是说,它使用EventConsumer来使用pub / sub模型异步处理ReplicationEvent。这是新模型的简化版本(适用于AEM 6.3):

@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);
    }
}

您可以在此处看到EventListener传递ReplicationEvent中包含的Job,然后由JobConsumer处理,根据这篇神奇的文章,不受 5秒规则的约束。

这个时间限制中有一些official documentation。一旦我有了&#34; 5秒&#34;关键,我能够提供更多信息,herehere,它们也谈到了5秒的限制。第一篇文章使用了与上述类似的方法,第二篇文章展示了一种关闭这些时间限制的方法。

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