@Bean public PluginProxyClient rpcClient(NotificationHandler notificationHandler, WebSocketKafkaProxyConfig proxyConfig, RequestResponseMatcher requestResponseMatcher, Gson gson) { WebSocketKafkaProxyClient proxyClient = new WebSocketKafkaProxyClient(notificationHandler); proxyClient.setWebSocketKafkaProxyConfig(proxyConfig); PluginProxyClient client = new PluginProxyClient(REQUEST_TOPIC, RESPONSE_TOPIC, proxyClient, requestResponseMatcher, gson); client.start(); return client; } }
@Override public void start() { client.start(); createTopic(Arrays.asList(requestTopic, replyToTopic)); subscribeToTopic(replyToTopic); pingServer(); }
@Bean public MessageDispatcher messageDispatcher(Gson gson, WebSocketKafkaProxyConfig proxyConfig) { return new ProxyMessageDispatcher(gson, proxyConfig); }
@Override public void start() { client.start(); client.push(ProxyMessageBuilder.create(new TopicsPayload(Arrays.asList(requestTopic, replyToTopic)))).join(); UUID uuid = UUID.randomUUID(); Executor executionPool = Executors.newFixedThreadPool(proxyConfig.getWorkerThreads()); for (int i = 0; i < proxyConfig.getWorkerThreads(); i++) { executionPool.execute(() -> { WebSocketKafkaProxyClient client = new WebSocketKafkaProxyClient(notificationHandler); client.setWebSocketKafkaProxyConfig(proxyConfig); client.start(); client.push(ProxyMessageBuilder.subscribe(new SubscribePayload(replyToTopic, uuid.toString()))).join(); }); } pingServer(); }
@Bean public AuthProxyClient rpcClient(NotificationHandler notificationHandler, WebSocketKafkaProxyConfig proxyConfig, RequestResponseMatcher requestResponseMatcher, Gson gson) { WebSocketKafkaProxyClient proxyClient = new WebSocketKafkaProxyClient(notificationHandler); proxyClient.setWebSocketKafkaProxyConfig(proxyConfig); AuthProxyClient client = new AuthProxyClient(REQUEST_TOPIC, RESPONSE_TOPIC, proxyClient, requestResponseMatcher, gson); client.start(); return client; } }
@Override public void onEvent(ServerEvent serverEvent) throws Exception { final Request request = serverEvent.get(); final String replyTo = request.getReplyTo(); Response response; switch (request.getType()) { case clientRequest: logger.debug("Client request received {}", request); response = handleClientRequest(request); break; case ping: logger.info("Ping request received from {}", replyTo); response = Response.newBuilder().buildSuccess(); break; default: logger.warn("Unknown type of request received {} from client with topic {}, correlationId = {}", request.getType(), replyTo, request.getCorrelationId()); response = Response.newBuilder() .buildFailed(404); } // set correlationId explicitly to prevent missing it in request response.setCorrelationId(request.getCorrelationId()); ProxyMessage responseMessage = ProxyMessageBuilder.notification(new NotificationCreatePayload(replyTo, gson.toJson(response))); proxyClient.push(responseMessage); }
logger.debug("Request callback added for request: {}, correlationId: {}", request.getBody(), request.getCorrelationId()); client.push(ProxyMessageBuilder.notification(new NotificationCreatePayload(requestTopic, gson.toJson(request)))); // toDo: use request partition key break; } else { shutdown();
logger.debug("Request callback added for request: {}, correlationId: {}", request.getBody(), request.getCorrelationId()); client.push(ProxyMessageBuilder.notification(new NotificationCreatePayload(requestTopic, gson.toJson(request)))); // toDo: use request partition key break; } else { shutdown();
@Bean public WorkerPool<ServerEvent> workerPool(Gson gson, RequestResponseMatcher requestResponseMatcher, WebSocketKafkaProxyConfig proxyConfig) { final ProxyResponseHandler[] workHandlers = new ProxyResponseHandler[proxyConfig.getWorkerThreads()]; IntStream.range(0, proxyConfig.getWorkerThreads()).forEach( nbr -> { ProxyResponseHandler handler = new ProxyResponseHandler(gson, REQUEST_TOPIC, RESPONSE_TOPIC, proxyConfig, requestResponseMatcher); handler.start(); workHandlers[nbr] = handler; } ); final RingBuffer<ServerEvent> ringBuffer = RingBuffer.createMultiProducer(ServerEvent::new, proxyConfig.getBufferSize(), getWaitStrategy(proxyConfig.getWaitStrategy())); final SequenceBarrier barrier = ringBuffer.newBarrier(); WorkerPool<ServerEvent> workerPool = new WorkerPool<>(ringBuffer, barrier, new FatalExceptionHandler(), workHandlers); ringBuffer.addGatingSequences(workerPool.getWorkerSequences()); return workerPool; }
@Override public void start() { client.start(); createTopic(Arrays.asList(requestTopic, replyToTopic)); subscribeToTopic(replyToTopic); pingServer(); }
logger.debug("Request callback added for request: {}, correlationId: {}", request.getBody(), request.getCorrelationId()); client.push(ProxyMessageBuilder.notification( new NotificationCreatePayload(requestTopic, gson.toJson(request), request.getPartitionKey()))); break; } else { shutdown();
@Bean public NotificationHandler notificationHandler(Gson gson, RequestResponseMatcher requestResponseMatcher, WebSocketKafkaProxyConfig proxyConfig) { return new ProxyResponseHandler(gson, REQUEST_TOPIC, RESPONSE_TOPIC, proxyConfig, requestResponseMatcher); }
@Bean public WorkerPool<ServerEvent> workerPool(Gson gson, WebSocketKafkaProxyConfig proxyConfig, HandlersMapper requestHandlersMapper) { final ProxyServerEventHandler[] workHandlers = new ProxyServerEventHandler[proxyConfig.getWorkerThreads()]; IntStream.range(0, proxyConfig.getWorkerThreads()).forEach( nbr -> workHandlers[nbr] = new ProxyServerEventHandler(gson, proxyConfig, requestHandlersMapper) ); final RingBuffer<ServerEvent> ringBuffer = RingBuffer.createMultiProducer(ServerEvent::new, proxyConfig.getBufferSize(), getWaitStrategy()); final SequenceBarrier barrier = ringBuffer.newBarrier(); WorkerPool<ServerEvent> workerPool = new WorkerPool<>(ringBuffer, barrier, new FatalExceptionHandler(), workHandlers); ringBuffer.addGatingSequences(workerPool.getWorkerSequences()); return workerPool; }
@Bean public NotificationHandler notificationHandler(Gson gson, WorkerPool<ServerEvent> workerPool) { final ExecutorService execService = Executors.newFixedThreadPool(proxyConfig.getWorkerThreads()); RingBuffer<ServerEvent> ringBuffer = workerPool.start(execService); return new ProxyRequestHandler(gson, ringBuffer); }
@Bean public RpcClient rpcClient(NotificationHandler notificationHandler, WebSocketKafkaProxyConfig proxyConfig, RequestResponseMatcher requestResponseMatcher, Gson gson, WorkerPool<ServerEvent> workerPool) { final ExecutorService execService = Executors.newFixedThreadPool(proxyConfig.getWorkerThreads()); RingBuffer<ServerEvent> ringBuffer = workerPool.start(execService); RpcClient client = new FrontendProxyClient(REQUEST_TOPIC, RESPONSE_TOPIC, proxyConfig, notificationHandler, requestResponseMatcher, gson, ringBuffer); client.start(); return client; }
@Override public void createTopic(String topic) { pluginProxyClient.createTopic(Arrays.asList(topic)); } }
@Override public void call(Request request, Consumer<Response> callback) { requestResponseMatcher.addRequestCallback(request.getCorrelationId(), callback); logger.debug("Request callback added for request: {}, correlationId: {}", request.getBody(), request.getCorrelationId()); push(request); }
@Override public void call(Request request, Consumer<Response> callback) { requestResponseMatcher.addRequestCallback(request.getCorrelationId(), callback); logger.debug("Request callback added for request: {}, correlationId: {}", request.getBody(), request.getCorrelationId()); push(request); }
@Bean public NotificationHandler notificationHandler(Gson gson, RequestResponseMatcher requestResponseMatcher, WebSocketKafkaProxyConfig proxyConfig) { return new ProxyResponseHandler(gson, REQUEST_TOPIC, RESPONSE_TOPIC, proxyConfig, requestResponseMatcher); }
@Bean public NotificationHandler notificationHandler(Gson gson, RequestResponseMatcher requestResponseMatcher) { return new ProxyResponseHandler(gson, requestResponseMatcher); }