|
33 | 33 | import java.time.Clock;
|
34 | 34 | import java.util.List;
|
35 | 35 | import java.util.Objects;
|
| 36 | +import java.util.concurrent.Executor; |
36 | 37 | import java.util.concurrent.ExecutorCompletionService;
|
37 | 38 | import java.util.concurrent.ExecutorService;
|
38 | 39 | import java.util.concurrent.Executors;
|
@@ -135,7 +136,42 @@ public Pipeline<? super Bytes> open(
|
135 | 136 | case subscribeBlockStream -> Pipelines
|
136 | 137 | .<SubscribeStreamRequest, SubscribeStreamResponseUnparsed>serverStreaming()
|
137 | 138 | .mapRequest(bytes -> parseSubscribeStreamRequest(bytes, options))
|
138 |
| - .method(this::subscribeBlockStream) |
| 139 | + .method((subscribeStreamRequest, helidonConsumerObserver) -> subscribeBlockStream( |
| 140 | + subscribeStreamRequest, helidonConsumerObserver, Executors.newSingleThreadExecutor())) |
| 141 | + .mapResponse(reply -> createSubscribeStreamResponse(reply, options)) |
| 142 | + .respondTo(replies) |
| 143 | + .build(); |
| 144 | + }; |
| 145 | + } catch (Exception e) { |
| 146 | + replies.onError(e); |
| 147 | + return Pipelines.noop(); |
| 148 | + } |
| 149 | + } |
| 150 | + |
| 151 | + @NonNull |
| 152 | + public Pipeline<? super Bytes> openWithSpecifiedExecutor( |
| 153 | + final @NonNull Method method, |
| 154 | + final @NonNull RequestOptions options, |
| 155 | + final @NonNull Pipeline<? super Bytes> replies, |
| 156 | + final @NonNull Executor executor) { |
| 157 | + |
| 158 | + final var m = (BlockStreamMethod) method; |
| 159 | + try { |
| 160 | + return switch (m) { |
| 161 | + case publishBlockStream -> { |
| 162 | + notifier.unsubscribeAllExpired(); |
| 163 | + yield Pipelines.<List<BlockItemUnparsed>, PublishStreamResponse>bidiStreaming() |
| 164 | + .mapRequest(bytes -> parsePublishStreamRequest(bytes, options)) |
| 165 | + .method(this::publishBlockStream) |
| 166 | + .mapResponse(bytes -> createPublishStreamResponse(bytes, options)) |
| 167 | + .respondTo(replies) |
| 168 | + .build(); |
| 169 | + } |
| 170 | + case subscribeBlockStream -> Pipelines |
| 171 | + .<SubscribeStreamRequest, SubscribeStreamResponseUnparsed>serverStreaming() |
| 172 | + .mapRequest(bytes -> parseSubscribeStreamRequest(bytes, options)) |
| 173 | + .method((subscribeStreamRequest, helidonConsumerObserver) -> |
| 174 | + subscribeBlockStream(subscribeStreamRequest, helidonConsumerObserver, executor)) |
139 | 175 | .mapResponse(reply -> createSubscribeStreamResponse(reply, options))
|
140 | 176 | .respondTo(replies)
|
141 | 177 | .build();
|
@@ -193,7 +229,8 @@ Pipeline<List<BlockItemUnparsed>> publishBlockStream(
|
193 | 229 | */
|
194 | 230 | void subscribeBlockStream(
|
195 | 231 | @NonNull final SubscribeStreamRequest subscribeStreamRequest,
|
196 |
| - @NonNull final Pipeline<? super SubscribeStreamResponseUnparsed> helidonConsumerObserver) { |
| 232 | + @NonNull final Pipeline<? super SubscribeStreamResponseUnparsed> helidonConsumerObserver, |
| 233 | + @NonNull final Executor executor) { |
197 | 234 |
|
198 | 235 | LOGGER.log(DEBUG, "Executing Server Streaming subscribeBlockStream gRPC method");
|
199 | 236 |
|
@@ -223,7 +260,7 @@ void subscribeBlockStream(
|
223 | 260 | // stream (endBlockNumber is 0)
|
224 | 261 | if (subscribeStreamRequest.endBlockNumber() == 0) {
|
225 | 262 | final var liveStreamEventHandler = LiveStreamEventHandlerBuilder.build(
|
226 |
| - new ExecutorCompletionService<>(Executors.newSingleThreadExecutor()), |
| 263 | + new ExecutorCompletionService<>(executor), |
227 | 264 | Clock.systemDefaultZone(),
|
228 | 265 | streamMediator,
|
229 | 266 | helidonConsumerObserver,
|
|
0 commit comments