1717package io .axoniq .axonserver .connector .event .impl ;
1818
1919import com .google .protobuf .Empty ;
20+ import io .axoniq .axonserver .connector .AxonServerException ;
21+ import io .axoniq .axonserver .connector .ErrorCategory ;
2022import io .axoniq .axonserver .connector .ResultStream ;
2123import io .axoniq .axonserver .connector .event .DcbEventChannel ;
2224import io .axoniq .axonserver .connector .impl .AbstractAxonServerChannel ;
2325import io .axoniq .axonserver .connector .impl .AbstractBufferedStream ;
2426import io .axoniq .axonserver .connector .impl .AxonServerManagedChannel ;
2527import io .axoniq .axonserver .connector .impl .FutureStreamObserver ;
2628import io .axoniq .axonserver .grpc .FlowControl ;
29+ import io .axoniq .axonserver .grpc .InstructionAck ;
2730import io .axoniq .axonserver .grpc .control .ClientIdentification ;
2831import io .axoniq .axonserver .grpc .event .dcb .AddTagsRequest ;
2932import io .axoniq .axonserver .grpc .event .dcb .AddTagsResponse ;
3033import io .axoniq .axonserver .grpc .event .dcb .AppendEventsRequest ;
3134import io .axoniq .axonserver .grpc .event .dcb .AppendEventsResponse ;
35+ import io .axoniq .axonserver .grpc .event .dcb .CancelScheduledEventRequest ;
3236import io .axoniq .axonserver .grpc .event .dcb .ConsistencyCondition ;
37+ import io .axoniq .axonserver .grpc .event .dcb .DcbEventSchedulerGrpc ;
3338import io .axoniq .axonserver .grpc .event .dcb .DcbEventStoreGrpc ;
39+ import io .axoniq .axonserver .grpc .event .dcb .Event ;
3440import io .axoniq .axonserver .grpc .event .dcb .GetHeadRequest ;
3541import io .axoniq .axonserver .grpc .event .dcb .GetHeadResponse ;
3642import io .axoniq .axonserver .grpc .event .dcb .GetSequenceAtRequest ;
4147import io .axoniq .axonserver .grpc .event .dcb .GetTailResponse ;
4248import io .axoniq .axonserver .grpc .event .dcb .RemoveTagsRequest ;
4349import io .axoniq .axonserver .grpc .event .dcb .RemoveTagsResponse ;
50+ import io .axoniq .axonserver .grpc .event .dcb .RescheduleEventRequest ;
51+ import io .axoniq .axonserver .grpc .event .dcb .ScheduleEventRequest ;
52+ import io .axoniq .axonserver .grpc .event .dcb .ScheduleToken ;
4453import io .axoniq .axonserver .grpc .event .dcb .SourceEventsRequest ;
4554import io .axoniq .axonserver .grpc .event .dcb .SourceEventsResponse ;
4655import io .axoniq .axonserver .grpc .event .dcb .StreamEventsRequest ;
5059import io .grpc .Status ;
5160import io .grpc .StatusRuntimeException ;
5261import io .grpc .stub .StreamObserver ;
53- import org .slf4j .Logger ;
54- import org .slf4j .LoggerFactory ;
5562
5663import java .time .Instant ;
5764import java .util .Collection ;
6067import java .util .concurrent .ConcurrentHashMap ;
6168import java .util .concurrent .ScheduledExecutorService ;
6269import java .util .concurrent .atomic .AtomicBoolean ;
70+ import javax .annotation .Nullable ;
6371
6472/**
6573 * {@link DcbEventChannel} implementation, serving as the event connection between Axon Server and a client
7078 */
7179public class DcbEventChannelImpl extends AbstractAxonServerChannel <Void > implements DcbEventChannel {
7280
73- private static final Logger LOGGER = LoggerFactory .getLogger (DcbEventChannelImpl .class );
74-
7581 private static final int BUFFER_SIZE = 512 ;
7682 private static final int REFILL_BATCH = 16 ;
7783 private final DcbEventStoreGrpc .DcbEventStoreStub eventStore ;
84+ private final DcbEventSchedulerGrpc .DcbEventSchedulerStub eventScheduler ;
7885 private final ClientIdentification clientIdentification ;
7986 private final Set <ResultStream <StreamEventsResponse >> buffers = ConcurrentHashMap .newKeySet ();
8087
@@ -90,6 +97,7 @@ public DcbEventChannelImpl(ClientIdentification clientIdentification,
9097 AxonServerManagedChannel axonServerManagedChannel ) {
9198 super (clientIdentification , executor , axonServerManagedChannel );
9299 this .eventStore = DcbEventStoreGrpc .newStub (axonServerManagedChannel );
100+ this .eventScheduler = DcbEventSchedulerGrpc .newStub (axonServerManagedChannel );
93101 this .clientIdentification = clientIdentification ;
94102 }
95103
@@ -236,6 +244,53 @@ public CompletableFuture<RemoveTagsResponse> removeTags(long sequence, Collectio
236244 return future ;
237245 }
238246
247+ @ Override
248+ public CompletableFuture <String > scheduleEvent (Instant scheduleTime , Event event ) {
249+ FutureStreamObserver <ScheduleToken >responseObserver = new FutureStreamObserver <>(new AxonServerException (
250+ ErrorCategory .INSTRUCTION_ACK_ERROR ,
251+ "An unknown error occurred while scheduling an Event. No response received from Server." ,
252+ ""
253+ ));
254+
255+ eventScheduler .scheduleEvent (ScheduleEventRequest .newBuilder ()
256+ .setEvent (event )
257+ .setInstant (scheduleTime .toEpochMilli ())
258+ .build (), responseObserver );
259+ return responseObserver .thenApply (ScheduleToken ::getToken );
260+ }
261+
262+ @ Override
263+ public CompletableFuture <InstructionAck > cancelSchedule (String token ) {
264+ FutureStreamObserver <InstructionAck > responseObserver = new FutureStreamObserver <>(new AxonServerException (
265+ ErrorCategory .INSTRUCTION_ACK_ERROR ,
266+ "An unknown error occurred while cancelling a scheduled Event. No response received from Server." ,
267+ ""
268+ ));
269+
270+ eventScheduler .cancelScheduledEvent (CancelScheduledEventRequest .newBuilder ().setToken (token ).build (),
271+ responseObserver );
272+ return responseObserver ;
273+ }
274+
275+ @ Override
276+ public CompletableFuture <String > reschedule (String scheduleToken , Instant scheduleTime , @ Nullable Event event ) {
277+ FutureStreamObserver <ScheduleToken >responseObserver = new FutureStreamObserver <>(new AxonServerException (
278+ ErrorCategory .INSTRUCTION_ACK_ERROR ,
279+ "An unknown error occurred while rescheduling Event. No response received from Server." ,
280+ ""
281+ ));
282+
283+ RescheduleEventRequest .Builder builder = RescheduleEventRequest .newBuilder ()
284+ .setToken (scheduleToken )
285+ .setInstant (scheduleTime .toEpochMilli ());
286+ if (event != null ) {
287+ builder .setEvent (event );
288+ }
289+ eventScheduler .rescheduleEvent (builder .build (), responseObserver );
290+ return responseObserver .thenApply (ScheduleToken ::getToken );
291+ }
292+
293+
239294 private static class AppendEventsTransactionImpl implements AppendEventsTransaction {
240295
241296 private final StreamObserver <AppendEventsRequest > stream ;
0 commit comments