use of io.smallrye.mutiny.Uni in project smallrye-mutiny by smallrye.
the class MultiFromResourceFromUniTest method testThatFinalizerIsNotCalledWhenResourceSupplierThrowsAnException.
@Test
public void testThatFinalizerIsNotCalledWhenResourceSupplierThrowsAnException() {
AssertSubscriber<Integer> subscriber = AssertSubscriber.create(1);
Supplier<Uni<Integer>> supplier = () -> {
throw new IllegalArgumentException("boom");
};
AtomicInteger cleanup = new AtomicInteger();
Multi.createFrom().resourceFromUni(supplier, r -> Multi.createFrom().<Integer>emitter(e -> e.emit(1).emit(2).fail(new IOException("boom")))).withFinalizer(cleanup::set).subscribe(subscriber);
subscriber.assertFailedWith(IllegalArgumentException.class, "boom");
assertThat(cleanup).hasValue(0);
}
use of io.smallrye.mutiny.Uni in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class AWSVaultServiceImpl method get.
@Override
public Uni<EventBridgeSecret> get(String name) {
if (CACHE.containsKey(name)) {
LOGGER.debug("Secret '{}' found in the cache.", name);
return Uni.createFrom().item(CACHE.get(name));
}
return Uni.createFrom().future(asyncClient.getSecretValue(GetSecretValueRequest.builder().secretId(name).build())).onFailure(e -> !(e instanceof ResourceNotFoundException)).retry().withJitter(DEFAULT_JITTER).withBackOff(DEFAULT_BACKOFF).atMost(MAX_RETRIES).onFailure().transform(e -> new VaultException("Secret '%s' not found in AWS Vault", e)).flatMap(x -> {
LOGGER.debug("Secret '{}' found in AWS Vault", name);
EventBridgeSecret secret = new EventBridgeSecret().setId(name).setValues(Json.decodeValue(x.secretString(), Map.class));
CACHE.put(name, secret);
return Uni.createFrom().item(secret);
});
}
use of io.smallrye.mutiny.Uni in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class AWSVaultServiceImpl method replaceSecret.
private Uni<Void> replaceSecret(EventBridgeSecret secret) {
LOGGER.debug("Secret '{}' already exists in AWS Vault. Replacing..", secret.getId());
PutSecretValueRequest putSecretValueRequest = PutSecretValueRequest.builder().secretId(secret.getId()).secretString(Json.encode(secret.getValues())).build();
return Uni.createFrom().future(asyncClient.putSecretValue(putSecretValueRequest)).replaceWithVoid().onFailure().retry().withJitter(DEFAULT_JITTER).withBackOff(DEFAULT_BACKOFF).atMost(MAX_RETRIES).onFailure().transform(e -> new VaultException("Could not replace secret '%s' in AWS Vault", e)).invoke(() -> LOGGER.debug("Secret '{}' replaced", secret.getId()));
}
use of io.smallrye.mutiny.Uni in project reactive-systems-in-java by cescoffier.
the class UserService method createUser.
public Uni<Long> createUser(String name) {
UserProfile user = new UserProfile();
user.name = name;
return Panache.withTransaction(() -> user.persist().onItem().transform(u -> ((UserProfile) u).id));
}
use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.
the class RabbitMQConnector method getSubscriberBuilder.
/**
* Creates a <em>channel</em> for the given configuration. The channel's configuration is associated with a
* specific {@code connector}, using the {@link Connector} qualifier's parameter indicating a key to
* which {@link org.eclipse.microprofile.reactive.messaging.Outgoing} to use.
* <p>
* Note that the connection to the <em>transport</em> or <em>broker</em> is generally postponed until the
* subscription.
*
* @param config the configuration, never {@code null}, must contain the {@link #CHANNEL_NAME_ATTRIBUTE}
* attribute.
* @return the created {@link SubscriberBuilder}, must not be {@code null}.
* @throws IllegalArgumentException if the configuration is invalid.
* @throws NoSuchElementException if the configuration does not contain an expected attribute.
*/
@Override
public SubscriberBuilder<? extends Message<?>, Void> getSubscriberBuilder(final Config config) {
final RabbitMQConnectorOutgoingConfiguration oc = new RabbitMQConnectorOutgoingConfiguration(config);
outgoingChannelStatus.put(oc.getChannel(), ChannelStatus.INITIALISING);
// Create a client
final RabbitMQClient client = RabbitMQClientHelper.createClient(this, oc, clientOptions, credentialsProviders);
final ConnectionHolder holder = new ConnectionHolder(client, oc, getVertx());
final Uni<RabbitMQPublisher> getSender = holder.getOrEstablishConnection().onItem().call(connection -> establishExchange(connection, oc)).onItem().transformToUni(connection -> Uni.createFrom().item(RabbitMQPublisher.create(getVertx(), connection, new RabbitMQPublisherOptions().setReconnectAttempts(oc.getReconnectAttempts()).setReconnectInterval(ofSeconds(oc.getReconnectInterval()).toMillis()).setMaxInternalQueueSize(oc.getMaxOutgoingInternalQueueSize().orElse(Integer.MAX_VALUE))))).onItem().call(RabbitMQPublisher::start).invoke(s -> {
// Add the channel in the opened state
outgoingChannelStatus.put(oc.getChannel(), ChannelStatus.CONNECTED);
}).onFailure().invoke(t -> outgoingChannelStatus.put(oc.getChannel(), ChannelStatus.NOT_CONNECTED)).onFailure().recoverWithNull().memoize().indefinitely().onCancellation().invoke(() -> outgoingChannelStatus.put(oc.getChannel(), ChannelStatus.NOT_CONNECTED));
// Set up a sender based on the publisher we established above
final RabbitMQMessageSender processor = new RabbitMQMessageSender(oc, getSender);
subscriptions.add(processor);
// Return a SubscriberBuilder
return ReactiveStreams.<Message<?>>builder().via(processor).onError(t -> {
log.error(oc.getChannel(), t);
outgoingChannelStatus.put(oc.getChannel(), ChannelStatus.NOT_CONNECTED);
}).ignore();
}
Aggregations