Skip to content

Commit badc8db

Browse files
committed
HTM-2016: Create a separate SseEventBus bean for the viewer so viewers don't get aministrative braodcasts
1 parent 3ef963f commit badc8db

3 files changed

Lines changed: 57 additions & 2 deletions

File tree

src/main/java/org/tailormap/api/configuration/TailormapConfig.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,23 @@
55
*/
66
package org.tailormap.api.configuration;
77

8+
import ch.rasc.sse.eventbus.DataObjectConverter;
9+
import ch.rasc.sse.eventbus.DefaultDataObjectConverter;
10+
import ch.rasc.sse.eventbus.DefaultSubscriptionRegistry;
11+
import ch.rasc.sse.eventbus.DistributedEventBus;
12+
import ch.rasc.sse.eventbus.JacksonDataObjectConverter;
13+
import ch.rasc.sse.eventbus.ReplayStore;
14+
import ch.rasc.sse.eventbus.SseEventBus;
15+
import ch.rasc.sse.eventbus.SubscriptionRegistry;
816
import ch.rasc.sse.eventbus.config.EnableSseEventBus;
17+
import ch.rasc.sse.eventbus.config.SseEventBusConfigurer;
18+
import ch.rasc.sse.eventbus.observation.SseEventBusObservationConvention;
19+
import io.micrometer.observation.ObservationRegistry;
20+
import java.util.ArrayList;
21+
import java.util.List;
922
import java.util.Locale;
23+
import org.jspecify.annotations.Nullable;
24+
import org.springframework.beans.factory.annotation.Autowired;
1025
import org.springframework.beans.factory.annotation.Value;
1126
import org.springframework.boot.context.properties.ConfigurationProperties;
1227
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -15,6 +30,7 @@
1530
import org.springframework.scheduling.annotation.EnableScheduling;
1631
import org.springframework.web.servlet.LocaleResolver;
1732
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
33+
import tools.jackson.databind.ObjectMapper;
1834

1935
@Configuration
2036
@EnableConfigurationProperties
@@ -42,4 +58,39 @@ public LocaleResolver localeResolver() {
4258
resolver.setDefaultLocale(Locale.of(defaultLanguage));
4359
return resolver;
4460
}
61+
62+
// New viewer SseEventBus bean for viewer-specific SSE traffic.
63+
@Bean("viewerSseEventBus")
64+
public SseEventBus viewerSseEventBus(
65+
@Autowired(required = false) @Nullable SseEventBusConfigurer configurer,
66+
@Autowired(required = false) @Nullable ObjectMapper objectMapper,
67+
@Autowired(required = false) @Nullable List<DataObjectConverter> dataObjectConverters,
68+
@Autowired(required = false) @Nullable SubscriptionRegistry subscriptionRegistry,
69+
@Autowired(required = false) @Nullable ReplayStore replayStore,
70+
@Autowired(required = false) @Nullable ObservationRegistry observationRegistry,
71+
@Autowired(required = false) @Nullable SseEventBusObservationConvention observationConvention,
72+
@Autowired(required = false) @Nullable DistributedEventBus distributedEventBus) {
73+
74+
// Apply same defaults as DefaultSseEventBusConfiguration
75+
SseEventBusConfigurer config = configurer != null
76+
? configurer
77+
: new SseEventBusConfigurer() {
78+
/* defaults */
79+
};
80+
81+
SubscriptionRegistry registry =
82+
subscriptionRegistry != null ? subscriptionRegistry : new DefaultSubscriptionRegistry();
83+
84+
ReplayStore store = replayStore != null ? replayStore : config.replayStore();
85+
86+
List<DataObjectConverter> converters = dataObjectConverters != null ? dataObjectConverters : new ArrayList<>();
87+
if (objectMapper != null) {
88+
converters.add(new JacksonDataObjectConverter(objectMapper));
89+
} else {
90+
converters.add(new DefaultDataObjectConverter());
91+
}
92+
93+
return new SseEventBus(
94+
config, registry, converters, store, observationRegistry, observationConvention, distributedEventBus);
95+
}
4596
}

src/main/java/org/tailormap/api/controller/ServerSentEventsController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.lang.invoke.MethodHandles;
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
15+
import org.springframework.beans.factory.annotation.Qualifier;
1516
import org.springframework.http.HttpStatus;
1617
import org.springframework.scheduling.annotation.Scheduled;
1718
import org.springframework.web.bind.annotation.GetMapping;
@@ -33,7 +34,7 @@ public class ServerSentEventsController {
3334

3435
private final JsonMapper jsonMapper;
3536

36-
public ServerSentEventsController(SseEventBus eventBus, JsonMapper jsonMapper) {
37+
public ServerSentEventsController(@Qualifier("viewerSseEventBus") SseEventBus eventBus, JsonMapper jsonMapper) {
3738
this.eventBus = eventBus;
3839
// force unindented/single line output for SSE messages, because we may have set
3940
// spring.jackson.serialization.indent_output=true for debugging/development/test

src/main/java/org/tailormap/api/service/CreateLayerExtractService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.jspecify.annotations.Nullable;
4949
import org.slf4j.Logger;
5050
import org.slf4j.LoggerFactory;
51+
import org.springframework.beans.factory.annotation.Qualifier;
5152
import org.springframework.beans.factory.annotation.Value;
5253
import org.springframework.scheduling.annotation.Async;
5354
import org.springframework.scheduling.annotation.Scheduled;
@@ -89,7 +90,9 @@ public class CreateLayerExtractService {
8990
private boolean exactWfsCounts;
9091

9192
public CreateLayerExtractService(
92-
SseEventBus eventBus, JsonMapper jsonMapper, FeatureSourceFactoryHelper featureSourceFactoryHelper) {
93+
@Qualifier("viewerSseEventBus") SseEventBus eventBus,
94+
JsonMapper jsonMapper,
95+
FeatureSourceFactoryHelper featureSourceFactoryHelper) {
9396
this.eventBus = eventBus;
9497
this.featureSourceFactoryHelper = featureSourceFactoryHelper;
9598
// force unindented/single line output for SSE messages, because we may have set

0 commit comments

Comments
 (0)