updated spring boot
removed HomeController started to decouple status ingress and feed egress
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user