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

com.eventstore.dbclient.PersistentSubscription Maven / Gradle / Ivy

package com.eventstore.dbclient;

import com.eventstore.dbclient.proto.persistentsubscriptions.Persistent;
import com.eventstore.dbclient.proto.shared.Shared;
import com.google.protobuf.ByteString;
import io.grpc.stub.ClientCallStreamObserver;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class PersistentSubscription {
    private final ClientCallStreamObserver requestStream;
    private final String subscriptionId;

    @Deprecated
    public PersistentSubscription(ClientCallStreamObserver requestStream, String subscriptionId,
                                  String streamName, String groupName, int bufferSize,
                                  Persistent.ReadReq.Options.Builder options) {
        this.requestStream = requestStream;
        this.subscriptionId = subscriptionId;
    }

    public PersistentSubscription(ClientCallStreamObserver requestStream, String subscriptionId) {
        this.requestStream = requestStream;
        this.subscriptionId = subscriptionId;
    }

    public String getSubscriptionId() {
        return subscriptionId;
    }

    public void stop() {
        this.requestStream.cancel("user-initiated", null);
    }

    public void ack(ResolvedEvent ...events) {
        this.ack(Arrays.stream(events).iterator());
    }

    public void ack(Iterator events) {
        Persistent.ReadReq.Ack.Builder ackBuilder = Persistent.ReadReq.Ack.newBuilder()
                .setId(ByteString.copyFromUtf8(subscriptionId));

        while (events.hasNext()) {
            ResolvedEvent event = events.next();
            RecordedEvent record = event.getLink() != null ? event.getLink() : event.getEvent();
            Shared.UUID.Structured structured = Shared.UUID.Structured.newBuilder()
                    .setLeastSignificantBits(record.getEventId().getLeastSignificantBits())
                    .setMostSignificantBits(record.getEventId().getMostSignificantBits())
                    .build();

            Shared.UUID uuid = Shared.UUID.newBuilder().setStructured(structured).build();
            ackBuilder.addIds(uuid);
        }

        Persistent.ReadReq.Ack ack = ackBuilder.build();
        Persistent.ReadReq req = Persistent.ReadReq.newBuilder()
                .setAck(ack)
                .build();

        requestStream.onNext(req);
    }

    public void nack(NackAction action, String reason, ResolvedEvent...events) {
        this.nack(action, reason, Arrays.stream(events).iterator());
    }

    public void nack(NackAction action, String reason, Iterator events) {
        Persistent.ReadReq.Nack.Builder nackBuilder = Persistent.ReadReq.Nack.newBuilder()
                .setId(ByteString.copyFromUtf8(subscriptionId));

        while (events.hasNext()) {
            ResolvedEvent event = events.next();
            RecordedEvent record = event.getLink() != null ? event.getLink() : event.getEvent();
            Shared.UUID.Structured structured = Shared.UUID.Structured.newBuilder()
                    .setLeastSignificantBits(record.getEventId().getLeastSignificantBits())
                    .setMostSignificantBits(record.getEventId().getMostSignificantBits())
                    .build();

            Shared.UUID uuid = Shared.UUID.newBuilder().setStructured(structured).build();
            nackBuilder.addIds(uuid);
        }

        nackBuilder.setReason(reason);
        switch (action) {
            case Park:
                nackBuilder.setAction(Persistent.ReadReq.Nack.Action.Park);
                break;
            case Retry:
                nackBuilder.setAction(Persistent.ReadReq.Nack.Action.Retry);
                break;
            case Skip:
                nackBuilder.setAction(Persistent.ReadReq.Nack.Action.Skip);
                break;
            case Stop:
                nackBuilder.setAction(Persistent.ReadReq.Nack.Action.Stop);
                break;
        }

        Persistent.ReadReq req = Persistent.ReadReq.newBuilder()
                .setNack(nackBuilder)
                .build();

        requestStream.onNext(req);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy