All Downloads are FREE. Search and download functionalities are using the official Maven repository.

driven-adapter.async-event-bus.reactive-direct-async-gateway.mustache Maven / Gradle / Ivy

Go to download

Gradle plugin to create a clean application in Java that already works, It follows our best practices!

There is a newer version: 3.20.10
Show newest version
package {{package}}.events;

{{#lombok}}
import lombok.AllArgsConstructor;
import lombok.extern.java.Log;
{{/lombok}}
{{#eda}}
import org.reactivecommons.api.domain.Command;
import org.reactivecommons.async.api.AsyncQuery;
import org.reactivecommons.async.api.DirectAsyncGateway;
import org.reactivecommons.async.impl.config.annotations.EnableDirectAsyncGateway;
import reactor.core.publisher.Mono;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.builder.CloudEventBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

import java.util.UUID;
import java.net.URI;
import java.time.OffsetDateTime;
{{/eda}}
{{^eda}}
import org.reactivecommons.api.domain.Command;
import org.reactivecommons.async.api.AsyncQuery;
import org.reactivecommons.async.api.DirectAsyncGateway;
import org.reactivecommons.async.impl.config.annotations.EnableDirectAsyncGateway;
import reactor.core.publisher.Mono;

import java.util.UUID;
{{/eda}}
{{#lombok}}
import java.util.logging.Level;
{{/lombok}}

{{#lombok}}
@Log
@AllArgsConstructor
{{/lombok}}
@EnableDirectAsyncGateway
public class ReactiveDirectAsyncGateway /* implements Gateway from domain */ {
    public static final String TARGET_NAME = "cleanArchitecture";// refers to remote spring.application.name property
    public static final String SOME_COMMAND_NAME = "some.command.name";
    public static final String SOME_QUERY_NAME = "some.query.name";
    private final DirectAsyncGateway gateway;
    {{#eda}}
    private ObjectMapper om = new ObjectMapper();
    {{/eda}}

    {{^lombok}}
    public ReactiveDirectAsyncGateway(DirectAsyncGateway gateway) {
        this.gateway = gateway;
    }
    {{/lombok}}

    public Mono runRemoteJob(Object command/*change for proper model*/) {{#eda}}throws JsonProcessingException{{/eda}} {
        {{#lombok}}
        log.log(Level.INFO, "Sending command: {0}: {1}", new String[]{SOME_COMMAND_NAME, command.toString()});
        {{/lombok}}
        {{#eda}}
        CloudEvent commandCloudEvent = CloudEventBuilder.v1() //
                                .withId(UUID.randomUUID().toString()) //
                                .withSource(URI.create("https://spring.io/foos"))//
                                .withType(SOME_COMMAND_NAME) //
                                .withTime(OffsetDateTime.now())
                                .withData("application/json", om.writeValueAsBytes(command))
                                .build();

        return gateway.sendCommand(new Command(SOME_COMMAND_NAME, UUID.randomUUID().toString(), commandCloudEvent),
                TARGET_NAME);
        {{/eda}}
        {{^eda}}
        return gateway.sendCommand(new Command<>(SOME_COMMAND_NAME, UUID.randomUUID().toString(), command),
                        TARGET_NAME);
        {{/eda}}
    }

    public Mono requestForRemoteData(Object query/*change for proper model*/) {{#eda}}throws JsonProcessingException{{/eda}} {
        {{#lombok}}
        log.log(Level.INFO, "Sending query request: {0}: {1}", new String[]{SOME_QUERY_NAME, query.toString()});
        {{/lombok}}
        {{^eda}}
        return gateway.requestReply(new AsyncQuery<>(SOME_QUERY_NAME, query), TARGET_NAME, Object.class/*change for proper model*/);
        {{/eda}}
        {{#eda}}

        CloudEvent queryCloudEvent = CloudEventBuilder.v1() //
                        .withId(UUID.randomUUID().toString()) //
                        .withSource(URI.create("https://spring.io/foos"))//
                        .withType(SOME_QUERY_NAME) //
                        .withTime(OffsetDateTime.now())
                        .withData("application/json", om.writeValueAsBytes(query))
                        .build();

        return gateway.requestReply(new AsyncQuery(SOME_QUERY_NAME, queryCloudEvent), TARGET_NAME, Object.class/*change for proper model*/);
        {{/eda}}
    }
}