This is a minor release to facilitate chaining of Assembler instances. Below is an example from demo project illustrating Assembler chaining:
@RestController
public class VitalsMonitoringStreamController {
private final Assembler<HR, Vitals> vitalsAssembler;
private final Assembler<Vitals, AugmentedVitals> augmentedVitalsAssembler;
private final HeartRateStreamingService heartRateStreamingService;
VitalsMonitoringStreamController(
HeartRateStreamingService heartRateStreamingService,
DiagnosisAIService diagnosisAIService) {
vitalsAssembler = assemblerOf(Vitals.class)
.withCorrelationIdResolver(HR::patientId)
.withRules(
rule(Patient::id, oneToOne(cached(this::getPatients, caffeineCache()))),
rule(BP::patientId, oneToMany(BP::id, cachedMany(this::getBPs, caffeineCache()))),
Vitals::new)
.build();
augmentedVitalsAssembler = assemblerOf(AugmentedVitals.class)
.withCorrelationIdResolver(Vitals::patient, Patient::id)
.withRules(
rule(Diagnosis::patientId, oneToOne(diagnosisAIService::getDiagnosesFromLLM)),
AugmentedVitals::new)
.build();
this.heartRateStreamingService = heartRateStreamingService;
}
@SubscriptionMapping
@GetMapping(value = "/vitals/stream", produces = TEXT_EVENT_STREAM_VALUE)
Flux<AugmentedVitals> vitals() {
return heartRateStreamingService.stream()
.window(3)
.flatMap(vitalsAssembler::assembleStream)
.flatMap(augmentedVitalsAssembler::assemble);
}
}What's Changed
- Added overloaded
correlationIdResolver()methods to resolve ID using indirections - Adding
assembleStream()method toAssemblerinterface, to returnFlux<Stream<R>>instead ofFlux<R>and avoid unnecessary transformations when chaining multipleAssemblerinstances