- PUT /external-service. Выбирает услугу среди доступных вариантов. Допустим, варианты: A, B и C.
- POST /send. Отправляет данные в вышеупомянутую внешнюю службу.
Код: Выделить всё
@Singleton
public class ServiceProducer {
@Inject
ExternalServiceRepository externalServiceRepository;
@Inject
AService aService;
@Inject
BService bService;
@Inject
CService cService;
@Produces
@ApplicationScoped
public Uni getExternalService() {
return getEnabledServiceType()
.map(Unchecked.function(provider -> {
return switch(provider) {
case A -> awsService;
case B -> clickatellService;
case C -> twilioService;
default -> throw new IllegalStateException();
};
}));
}
private Uni getEnabledServiceType() {
return externalServiceRepository.listAll()
.map(externalServices ->
externalServices.stream()
.filter(ExternalService::isEnabled)
.findFirst()
.map(ExternalService::getServiceType)
.orElseThrow());
}
}
@ApplicationScoped
@Typed(AService.class)
public class AService implements ExternalService {
@Override
public Uni send() {
return Uni.createFrom().voidItem(); // we do not care about this
}
@Override
public ServiceType getServiceType() {
return Provider.A;
}
}
Код: Выделить всё
@Path("/")
@RequiredArgsConstructor
public class Resource {
private final ProviderService providerService;
private final Uni externalService;
@POST
@Path("send")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Uni send(Request request) {
return externalService.flatMap(ExternalService::send)
.map(ignored -> Response.ok().build())
.onFailure().recoverWithItem(failure -> Response.serverError().build());
}
@PUT
@Path("external-service")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Uni putExternalService(ServiceType serviceType) {
return providerService.updateExternalService(serviceType) // enables this external service, disabling the rest
.map(ignored -> Response.noContent().build())
.onFailure().recoverWithItem(failure -> Response.serverError().build());
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -stateless
Мобильная версия