Biblioteca del Cliente

Módulo del cliente que invoca Dynamic Processing Settings debe importar dynamic-processing-settings-client-port y utilizar las interfaces proporcionadas por ClientPort para invocar DPS lógica.

Siguiente Maven dependency debe ser añadido a pom.xml:

<dependency>
    <groupId>com.iconsolutions.ipf.core.dynamicsettings.v2</groupId>
    <artifactId>dynamic-processing-settings-client-port</artifactId>
    <version>${dynamic-processing-settings-api.version}</version>
</dependency>
Dynamic processing Settings Actualmente soporta la implementación de conectores y de interfaces de puerto de cliente de forma directa.

Implementación del Conector

Siguiente Maven dependency debe ser añadido a pom.xml:

<dependency>
    <groupId>com.iconsolutions.ipf.core.dynamicsettings.v2</groupId>
    <artifactId>dynamic-processing-settings-client-connector</artifactId>
    <version>${dynamic-processing-settings-api.version}</version>
</dependency>

Implementación Directa

Siguiente Maven dependency debe ser añadido a pom.xml:

<dependency>
    <groupId>com.iconsolutions.ipf.core.dynamicsettings.v2</groupId>
    <artifactId>dynamic-processing-settings-client-direct</artifactId>
    <version>${dynamic-processing-settings-api.version}</version>
</dependency>

Cómo utilizar la biblioteca del cliente con la implementación del conector

Un ejemplo de cómo se puede utilizar el puerto del cliente:

package com.iconsolutions.ipf.dynamicsettings.v2.client.connector;

import com.iconsolutions.ipf.core.connector.api.Response;
import com.iconsolutions.ipf.core.connector.api.SendingConnector;
import com.iconsolutions.ipf.core.shared.domain.context.ProcessingContext;
import com.iconsolutions.ipf.core.shared.domain.context.SupportingContext;
import com.iconsolutions.ipf.dynamicsettings.v2.client.connector.request.approvals.ApproveSettingRequest;
import com.iconsolutions.ipf.dynamicsettings.v2.client.connector.request.approvals.GetApprovalsRequest;
import com.iconsolutions.ipf.dynamicsettings.v2.client.connector.request.approvals.RejectSettingRequest;
import com.iconsolutions.ipf.dynamicsettings.v2.client.port.DpsApprovalClientPort;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.ApprovalSettingsDTO;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.ApproveSetting;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.RejectSetting;
import com.iconsolutions.ipf.dynamicsettings.v2.domain.SettingId;
import com.iconsolutions.ipf.dynamicsettings.v2.domain.SettingType;
import lombok.RequiredArgsConstructor;

import java.util.concurrent.CompletionStage;

//tag::approvalsClientConnector[]
@RequiredArgsConstructor
public class DpsApprovalClientConnector implements DpsApprovalClientPort {

    private final SendingConnector<ApproveSettingRequest, Response<String>> approveSettingConnector;
    private final SendingConnector<GetApprovalsRequest, Response<ApprovalSettingsDTO<Object>>> getApprovalsSettingConnector;
    private final SendingConnector<RejectSettingRequest, Response<String>> rejectSettingsConnector;

    @Override
    public CompletionStage<Response<ApprovalSettingsDTO<Object>>> getApprovalsSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, SettingId settingId) {
        return getApprovalsSettingConnector.send(processingContext,
                GetApprovalsRequest.builder()
                        .settingId(settingId)
                        .settingType(settingType)
                        .build(),
                supportingContext);
    }

    @Override
    public CompletionStage<Response<String>> approveSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, ApproveSetting approveSetting, SettingId settingId) {
        return approveSettingConnector.send(processingContext,
                ApproveSettingRequest.builder()
                        .settingType(settingType)
                        .approveSetting(approveSetting)
                        .settingId(settingId)
                        .build(),
                supportingContext);
    }

    @Override
    public CompletionStage<Response<String>> rejectSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, SettingId settingId, RejectSetting rejectSetting) {
        return rejectSettingsConnector.send(processingContext,
                RejectSettingRequest.builder()
                        .settingType(settingType)
                        .rejectSetting(rejectSetting)
                        .settingId(settingId)
                        .build(),
                supportingContext);
    }
}

//end::approvalsClientConnector[]

Cómo utilizar la biblioteca del cliente con la Implementación Directa

Un ejemplo de cómo se puede utilizar el puerto del cliente:

package com.iconsolutions.ipf.dynamicsettings.v2.client.direct;

import com.iconsolutions.ipf.core.connector.api.Response;
import com.iconsolutions.ipf.core.shared.domain.context.ProcessingContext;
import com.iconsolutions.ipf.core.shared.domain.context.SupportingContext;
import com.iconsolutions.ipf.dynamicsettings.v2.api.DpsApprovalService;
import com.iconsolutions.ipf.dynamicsettings.v2.client.port.DpsApprovalClientPort;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.ApprovalSettingsDTO;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.ApproveSetting;
import com.iconsolutions.ipf.dynamicsettings.v2.dto.RejectSetting;
import com.iconsolutions.ipf.dynamicsettings.v2.domain.SettingId;
import com.iconsolutions.ipf.dynamicsettings.v2.domain.SettingType;
import lombok.RequiredArgsConstructor;

import java.util.concurrent.CompletionStage;

//tag::approvalsClientDirect[]
@RequiredArgsConstructor
public class DpsApprovalClientDirect implements DpsApprovalClientPort {

    private final DpsApprovalService service;


    @Override
    public CompletionStage<Response<ApprovalSettingsDTO<Object>>> getApprovalsSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, SettingId settingId) {
        return service.getApprovals(settingType)
                .collectList()
                .map(ApprovalSettingsDTO::new)
                .map(approvalSettingsDTO -> new Response<>(processingContext, approvalSettingsDTO))
                .toFuture();
    }

    @Override
    public CompletionStage<Response<String>> approveSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, ApproveSetting approveSetting, SettingId settingId) {
        return service.approveSetting(settingType, settingId, approveSetting)
                .toFuture()
                .thenApply(res -> new Response<>(processingContext, ""));
    }

    @Override
    public CompletionStage<Response<String>> rejectSetting(ProcessingContext processingContext, SupportingContext supportingContext, SettingType settingType, SettingId settingId, RejectSetting rejectSetting) {
        return service.rejectSetting(settingType, settingId, rejectSetting)
                .toFuture()
                .thenApply(res -> new Response<>(processingContext, ""));
    }
}
//end::approvalsClientDirect[]

Cómo configurar la biblioteca del cliente

Cada API El conector puede configurarse de manera independiente, pero también proporcionamos una configuración de conector predeterminada.

HTTP configuración del cliente:

Implementación del Conector

//tag::approvalsClientConnectorConfig[]
ipf.dps-api {
    client-type = "connector"
    http {
        client {
            host = "localhost"
            endpoint-url = "/settings-objects/"
            port = 8080
        }
    }

    connector {
        create-setting = ${ipf.dps-api.default-connector}
        update-setting = ${ipf.dps-api.default-connector}
        delete-setting = ${ipf.dps-api.default-connector}
        get-setting = ${ipf.dps-api.default-connector}
        search-setting = ${ipf.dps-api.default-connector}
        search-ids-setting = ${ipf.dps-api.default-connector}
        search-request-setting = ${ipf.dps-api.default-connector}
        setting-schemas = ${ipf.dps-api.default-connector}
        history-settings = ${ipf.dps-api.default-connector}
        approve-settings = ${ipf.dps-api.default-connector}
        get-approvals-setting = ${ipf.dps-api.default-connector}
        reject-setting = ${ipf.dps-api.default-connector}
    }

    default-connector {
        resiliency-settings {
            # Determines the maximum number of retries to be made. Note that this includes the first failed attempt.
            max-attempts = 2
            # Retry if HTTP error code is in the list
            retryable-status-codes = [500, 503]
            # Determines the minimum number of calls (within a sliding window period) that need to be made before the circuit breaker can calculate the error rate to determine the transport health.
            minimum-number-of-calls = 10
        }
    }
}
//end::approvalsClientConnectorConfig[]

Implementación Directa

//tag::approvalsClientDirectConfig[]
ipf.dps-api.client-type = "direct"
//end::approvalsClientDirectConfig[]