@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; }
@Bean public Executor executionPool(NotificationHandler notificationHandler, WebSocketKafkaProxyConfig proxyConfig) { 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.create(new TopicsPayload(REQUEST_TOPIC))).join(); client.push(ProxyMessageBuilder.subscribe(new SubscribePayload(REQUEST_TOPIC, proxyConfig.getConsumerGroup()))).join(); }); } return executionPool; }
@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; }
@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 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; }