Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initialize schemes before refreshing application context #5032

Merged
merged 1 commit into from
Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import run.halo.app.extension.DefaultSchemeManager;
import run.halo.app.extension.DefaultSchemeWatcherManager;
import run.halo.app.extension.ExtensionClient;
import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.SchemeManager;
Expand All @@ -19,18 +17,8 @@ public class ExtensionConfiguration {

@Bean
RouterFunction<ServerResponse> extensionsRouterFunction(ReactiveExtensionClient client,
SchemeWatcherManager watcherManager) {
return new ExtensionCompositeRouterFunction(client, watcherManager);
}

@Bean
SchemeManager schemeManager(SchemeWatcherManager watcherManager) {
return new DefaultSchemeManager(watcherManager);
}

@Bean
SchemeWatcherManager schemeWatcherManager() {
return new DefaultSchemeWatcherManager();
SchemeWatcherManager watcherManager, SchemeManager schemeManager) {
return new ExtensionCompositeRouterFunction(client, watcherManager, schemeManager);
}

@Configuration(proxyBeanMethods = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.concurrent.locks.StampedLock;
import java.util.function.BiConsumer;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
Expand All @@ -19,7 +20,6 @@
import run.halo.app.extension.Unstructured;
import run.halo.app.extension.Watcher;
import run.halo.app.extension.controller.RequestSynchronizer;
import run.halo.app.infra.SchemeInitializedEvent;

/**
* <p>Monitor changes to {@link Post} resources and establish a local, in-memory cache in an
Expand All @@ -33,7 +33,7 @@
* @since 2.0.0
*/
@Component
public class PostIndexInformer implements ApplicationListener<SchemeInitializedEvent>,
public class PostIndexInformer implements ApplicationListener<ApplicationStartedEvent>,
DisposableBean {
public static final String TAG_POST_INDEXER = "tag-post-indexer";
public static final String LABEL_INDEXER_NAME = "post-label-indexer";
Expand Down Expand Up @@ -71,10 +71,6 @@ private DefaultIndexer.IndexFunc<Post> labelIndexFunc() {
};
}

public Set<String> getByIndex(String indexName, String indexKey) {
return postIndexer.getByIndex(indexName, indexKey);
}

public Set<String> getByTagName(String tagName) {
return postIndexer.getByIndex(TAG_POST_INDEXER, tagName);
}
Expand Down Expand Up @@ -104,10 +100,6 @@ String labelKey(String labelName, String labelValue) {
return labelName + "=" + labelValue;
}

public Set<String> getByLabel(String labelName, String labelValue) {
return postIndexer.getByIndex(LABEL_INDEXER_NAME, labelKey(labelName, labelValue));
}

@Override
public void destroy() throws Exception {
if (postWatcher != null) {
Expand All @@ -119,7 +111,7 @@ public void destroy() throws Exception {
}

@Override
public void onApplicationEvent(@NonNull SchemeInitializedEvent event) {
public void onApplicationEvent(@NonNull ApplicationStartedEvent event) {
if (!synchronizer.isStarted()) {
synchronizer.start();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunction;
Expand All @@ -13,23 +16,31 @@
import reactor.core.publisher.Mono;
import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.Scheme;
import run.halo.app.extension.SchemeManager;
import run.halo.app.extension.SchemeWatcherManager;
import run.halo.app.extension.SchemeWatcherManager.SchemeWatcher;

public class ExtensionCompositeRouterFunction implements
RouterFunction<ServerResponse>, SchemeWatcher {
RouterFunction<ServerResponse>,
SchemeWatcher,
InitializingBean,
ApplicationListener<ApplicationStartedEvent> {

private final Map<Scheme, RouterFunction<ServerResponse>> schemeRouterFuncMapper;

private final ReactiveExtensionClient client;

private final SchemeManager schemeManager;

private final SchemeWatcherManager watcherManager;

public ExtensionCompositeRouterFunction(ReactiveExtensionClient client,
SchemeWatcherManager watcherManager) {
SchemeWatcherManager watcherManager,
SchemeManager schemeManager) {
this.client = client;
this.schemeManager = schemeManager;
this.watcherManager = watcherManager;
schemeRouterFuncMapper = new ConcurrentHashMap<>();
if (watcherManager != null) {
watcherManager.register(this);
}
}

@Override
Expand Down Expand Up @@ -60,4 +71,17 @@ public void onChange(SchemeWatcherManager.ChangeEvent event) {
this.schemeRouterFuncMapper.remove(unregisteredEvent.getDeletedScheme());
}
}

@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
schemeManager.schemes().forEach(scheme -> {
var factory = new ExtensionRouterFunctionFactory(scheme, client);
this.schemeRouterFuncMapper.put(scheme, factory.create());
});
}

@Override
public void afterPropertiesSet() {
watcherManager.register(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.io.IOException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.io.UrlResource;
import org.springframework.core.io.buffer.DataBufferUtils;
Expand All @@ -16,7 +17,7 @@

@Slf4j
@Component
public class DefaultThemeInitializer implements ApplicationListener<SchemeInitializedEvent> {
public class DefaultThemeInitializer implements ApplicationListener<ApplicationStartedEvent> {

private final ThemeService themeService;

Expand All @@ -32,7 +33,7 @@ public DefaultThemeInitializer(ThemeService themeService, ThemeRootGetter themeR
}

@Override
public void onApplicationEvent(SchemeInitializedEvent event) {
public void onApplicationEvent(ApplicationStartedEvent event) {
if (themeProps.getInitializer().isDisabled()) {
log.debug("Skipped initializing default theme due to disabled");
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package run.halo.app.infra;

import java.io.IOException;
import java.time.Duration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.context.ApplicationListener;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;
Expand All @@ -28,7 +30,7 @@
*/
@Slf4j
@Component
public class ExtensionResourceInitializer {
public class ExtensionResourceInitializer implements ApplicationListener<ApplicationStartedEvent> {

public static final Set<String> REQUIRED_EXTENSION_LOCATIONS =
Set.of("classpath:/extensions/*.yaml", "classpath:/extensions/*.yml");
Expand All @@ -45,8 +47,7 @@ public ExtensionResourceInitializer(HaloProperties haloProperties,
this.eventPublisher = eventPublisher;
}

@EventListener(SchemeInitializedEvent.class)
public Mono<Void> initialize(SchemeInitializedEvent initializedEvent) {
public void onApplicationEvent(ApplicationStartedEvent initializedEvent) {
var locations = new HashSet<String>();
if (!haloProperties.isRequiredExtensionDisabled()) {
locations.addAll(REQUIRED_EXTENSION_LOCATIONS);
Expand All @@ -55,10 +56,10 @@ public Mono<Void> initialize(SchemeInitializedEvent initializedEvent) {
locations.addAll(haloProperties.getInitialExtensionLocations());
}
if (CollectionUtils.isEmpty(locations)) {
return Mono.empty();
return;
}

return Flux.fromIterable(locations)
Flux.fromIterable(locations)
.doOnNext(location ->
log.debug("Trying to initialize extension resources from location: {}", location))
.map(this::listResources)
Expand All @@ -82,7 +83,8 @@ public Mono<Void> initialize(SchemeInitializedEvent initializedEvent) {
}
})
.then(Mono.fromRunnable(
() -> eventPublisher.publishEvent(new ExtensionInitializedEvent(this))));
() -> eventPublisher.publishEvent(new ExtensionInitializedEvent(this))))
.block(Duration.ofMinutes(1));
}

private Mono<Unstructured> createOrUpdate(Unstructured extension) {
Expand Down

This file was deleted.

27 changes: 11 additions & 16 deletions application/src/main/java/run/halo/app/infra/SchemeInitializer.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package run.halo.app.infra;

import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -36,7 +35,8 @@
import run.halo.app.core.extension.notification.ReasonType;
import run.halo.app.core.extension.notification.Subscription;
import run.halo.app.extension.ConfigMap;
import run.halo.app.extension.SchemeManager;
import run.halo.app.extension.DefaultSchemeManager;
import run.halo.app.extension.DefaultSchemeWatcherManager;
import run.halo.app.extension.Secret;
import run.halo.app.migration.Backup;
import run.halo.app.plugin.extensionpoint.ExtensionDefinition;
Expand All @@ -45,20 +45,17 @@
import run.halo.app.security.PersonalAccessToken;

@Component
public class SchemeInitializer implements ApplicationListener<ApplicationStartedEvent> {
public class SchemeInitializer implements ApplicationListener<ApplicationContextInitializedEvent> {

private final SchemeManager schemeManager;

private final ApplicationEventPublisher eventPublisher;
@Override
public void onApplicationEvent(@NonNull ApplicationContextInitializedEvent event) {
var watcherManager = new DefaultSchemeWatcherManager();
var schemeManager = new DefaultSchemeManager(watcherManager);

public SchemeInitializer(SchemeManager schemeManager,
ApplicationEventPublisher eventPublisher) {
this.schemeManager = schemeManager;
this.eventPublisher = eventPublisher;
}
var beanFactory = event.getApplicationContext().getBeanFactory();
beanFactory.registerSingleton("schemeWatcherManager", watcherManager);
beanFactory.registerSingleton("schemeManager", schemeManager);

@Override
public void onApplicationEvent(@NonNull ApplicationStartedEvent event) {
schemeManager.register(Role.class);

// plugin.halo.run
Expand Down Expand Up @@ -108,7 +105,5 @@ public void onApplicationEvent(@NonNull ApplicationStartedEvent event) {
schemeManager.register(Subscription.class);
schemeManager.register(NotifierDescriptor.class);
schemeManager.register(Notification.class);

eventPublisher.publishEvent(new SchemeInitializedEvent(this));
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package run.halo.app.search;

import java.util.concurrent.CountDownLatch;
import java.time.Duration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import run.halo.app.infra.SchemeInitializedEvent;

@Slf4j
@Component
Expand All @@ -19,17 +19,12 @@ public IndicesInitializer(IndicesService indicesService) {
}

@Async
@EventListener(SchemeInitializedEvent.class)
public void whenSchemeInitialized(SchemeInitializedEvent event) throws InterruptedException {
var latch = new CountDownLatch(1);
@EventListener
public void whenSchemeInitialized(ApplicationStartedEvent event) {
log.info("Initialize post indices...");
var watch = new StopWatch("PostIndicesWatch");
watch.start("rebuild");
indicesService.rebuildPostIndices()
.doFinally(signalType -> latch.countDown())
.subscribe();
latch.await();
watch.stop();
indicesService.rebuildPostIndices().block(Duration.ofMinutes(5));
log.info("Initialized post indices. Usage: {}", watch);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEvent;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
Expand All @@ -15,7 +15,6 @@
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import run.halo.app.infra.SchemeInitializedEvent;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemSetting;
import run.halo.app.theme.DefaultTemplateEnum;
Expand Down Expand Up @@ -90,10 +89,15 @@ private RouterFunction<ServerResponse> createRouterFunction(RoutePattern routePa
/**
* Refresh the {@link #cachedRouters} when the permalink rule is changed.
*
* @param event {@link SchemeInitializedEvent} or {@link PermalinkRuleChangedEvent}
* @param event {@link PermalinkRuleChangedEvent}
*/
@EventListener({SchemeInitializedEvent.class, PermalinkRuleChangedEvent.class})
public void onSchemeInitializedEvent(@NonNull ApplicationEvent event) {
@EventListener
public void onPermalinkRuleChanged(PermalinkRuleChangedEvent event) {
this.cachedRouters = routerFunctions();
}

@EventListener
public void onApplicationStarted(ApplicationStartedEvent event) {
this.cachedRouters = routerFunctions();
}

Expand Down
1 change: 1 addition & 0 deletions application/src/main/resources/META-INF/spring.factories
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.springframework.context.ApplicationListener=run.halo.app.infra.SchemeInitializer
Loading
Loading