updated spring boot

removed HomeController
started to decouple status ingress and feed egress
This commit is contained in:
2021-05-08 12:32:08 +00:00
parent 92ab88eca7
commit 56bd0d4df0
5 changed files with 71 additions and 34 deletions
+2 -2
View File
@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<version>2.4.5</version>
<relativePath />
<!-- lookup parent from repository -->
</parent>
@@ -34,7 +34,7 @@
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
<artifactId>spring-integration-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
@@ -1,14 +0,0 @@
package io.dietz.ed.companion.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String index(final Model model) {
return "index";
}
}
@@ -11,8 +11,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.dietz.ed.companion.domain.State;
import io.dietz.ed.companion.models.UpdateFeedItem;
import io.dietz.ed.companion.models.UpdateStatusResponse;
import io.dietz.ed.companion.service.StateHandlerService;
import io.dietz.ed.companion.service.UpdateFeedsService;
import reactor.core.publisher.Mono;
@@ -23,6 +23,9 @@ public class StatusController {
@Autowired
private UpdateFeedsService updateChannelsService;
@Autowired
private StateHandlerService stateHandlerService;
@Autowired
private ObjectMapper objectMapper;
@@ -31,17 +34,21 @@ public class StatusController {
System.out.println(rawPayload);
return Mono.create(sink -> {
if (updateChannelsService.hasActiveFeed(feedId)) {
UpdateFeedItem updateFeedItem = new UpdateFeedItem(feedId, "credits");
State payload;
try {
payload = objectMapper.readValue(rawPayload, State.class);
updateFeedItem.setContent(Long.valueOf(payload.getCredits()));
updateChannelsService.sendFeedUpdate(updateFeedItem);
} catch (JsonProcessingException e) {
e.printStackTrace();
State payload = handlePayload(rawPayload);
if (payload != null) {
stateHandlerService.handleState(feedId, payload);
}
}
sink.success(new UpdateStatusResponse());
});
}
private State handlePayload(String payload) {
try {
return objectMapper.readValue(payload, State.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,44 @@
package io.dietz.ed.companion.service;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.dsl.MessageChannels;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;
import io.dietz.ed.companion.domain.State;
import io.dietz.ed.companion.models.UpdateFeedItem;
@Service
public class StateHandlerService {
@Autowired
private UpdateFeedsService updateFeedsService;
private SubscribableChannel channel = MessageChannels.publishSubscribe().get();
public StateHandlerService() {
MessageHandler stateHandler = message -> {
String feedId = message.getHeaders().get("feedId").toString();
System.out.println("state of '" + feedId + "' received");
State state = State.class.cast(message.getPayload());
UpdateFeedItem updateFeedItem = new UpdateFeedItem(feedId, "credits");
updateFeedItem.setContent(Long.valueOf(state.getCredits()));
updateFeedsService.sendFeedUpdate(updateFeedItem);
};
channel.subscribe(stateHandler);
}
public void handleState(String feedId, State state) {
Message<State> message = new GenericMessage<State>(state, Map.of("feedId", feedId));
channel.send(message);
}
}
@@ -47,6 +47,15 @@ public class UpdateFeedsService {
return wrap(flux);
}
public boolean hasActiveFeed(String feedId) {
return activeFeeds.containsKey(feedId);
}
public void sendFeedUpdate(UpdateFeedItem updateFeedItem) {
Message<UpdateFeedItem> message = new GenericMessage<>(updateFeedItem);
channel.send(message);
}
private <T> Flux<ServerSentEvent<T>> wrap(Flux<T> fluxToWrap) {
return Flux.merge(fluxToWrap.map(t -> ServerSentEvent.builder(t).build()), Flux.interval(Duration.ofSeconds(15)).map(aLong -> ServerSentEvent.<T>builder().comment("keep alive").build()));
}
@@ -65,13 +74,4 @@ public class UpdateFeedsService {
}
}
public boolean hasActiveFeed(String feedId) {
return activeFeeds.containsKey(feedId);
}
public void sendFeedUpdate(UpdateFeedItem updateFeedItem) {
Message<UpdateFeedItem> message = new GenericMessage<>(updateFeedItem);
channel.send(message);
}
}