与往常一样,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()));
}
}
现在在您恐慌之前我还没有包含业务逻辑,请参阅下面的答案。主要的兴趣点是业务逻辑可能需要几秒钟。
答案 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;关键,我能够提供更多信息,here和here,它们也谈到了5秒的限制。第一篇文章使用了与上述类似的方法,第二篇文章展示了一种关闭这些时间限制的方法。
通过在 Apache Felix事件管理实施配置中将Timeout
属性设置为零,可以在configMgr中完全禁用(或增加)时间限制。