Skip to content

Commit c801cb5

Browse files
committed
Implement broadcasting in addon
1 parent 935ee1e commit c801cb5

3 files changed

Lines changed: 30 additions & 4 deletions

File tree

serverside-rpc/src/main/java/com/bookmap/api/rpc/server/addon/ExternalProcessInstance.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class ExternalProcessInstance implements Instance {
3333

3434
private final ConcurrentMap<String, State> aliasToState;
3535
private final ConcurrentMap<String, CompletableFuture<?>> aliasToInitializationTask;
36+
private Connector connector;
3637
private Server server;
3738
private final File scriptFile;
3839
private MessageReader reader;
@@ -79,14 +80,19 @@ public ExternalProcessInstance(File scriptFile, ConcurrentMap<String, State> ali
7980
}, PERIODS_OF_HEALTH_CHECK_SECONDS, PERIODS_OF_HEALTH_CHECK_SECONDS, TimeUnit.SECONDS);
8081
}
8182

83+
public ExternalProcessInstance(File scriptFile, ConcurrentMap<String, State> aliasToState, ConcurrentMap<String, CompletableFuture<?>> aliasToInitializationTask, CompletableFuture<Integer> pythonExitCode, Connector connector) {
84+
this(scriptFile, aliasToState, aliasToInitializationTask, pythonExitCode);
85+
this.connector = connector;
86+
}
87+
8288
@Override
8389
public void run() {
8490
try {
8591
int port = Config.getTcpPort();
8692
ProcessBuilder processBuilder = new ProcessBuilder().command(Config.getPythonRuntime(), "-X utf8", scriptFile.getAbsolutePath(), String.valueOf(port));
8793
server = new LocalTcpSocketServer(port);
8894
runningProcess = processBuilder.start();
89-
service = Executors.newSingleThreadExecutor();
95+
service = Executors.newFixedThreadPool(2);
9096
LogTracker.initExecutorService();
9197
LogTracker.track(Log.LogLevel.INFO, runningProcess.getInputStream());
9298
LogTracker.track(Log.LogLevel.ERROR, runningProcess.getErrorStream());
@@ -122,7 +128,7 @@ public void run() {
122128
sendingEventToClientHandler, reqDataHandler, clientInitHandler,
123129
new RegisterIndicatorHandler(aliasToState, eventLoop), new AddPointIndicatorHandler(aliasToState, eventLoop), new FinishedInitializationHandler(aliasToInitializationTask),
124130
new ClientOffHandler(eventLoop), new AddUiFieldHandler(aliasToState, eventLoop),
125-
new SendOrderHandler(aliasToState, eventLoop), new UpdateOrderHandler(aliasToState, eventLoop));
131+
new SendOrderHandler(aliasToState, eventLoop), new UpdateOrderHandler(aliasToState, eventLoop), new SubscribeToIndicatorHandler(eventLoop, connector, service));
126132
eventLoop.setHandlerManager(handlerManager);
127133
reader = new DefaultMessageReader(server, incomeConverterManager, eventLoop);
128134
eventLoop.pushEvent(new ServerInitEvent());

serverside-rpc/src/main/java/com/bookmap/api/rpc/server/addon/RpcServerAddon.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.bookmap.api.rpc.server.addon;
22

3+
import com.bookmap.addons.broadcasting.api.view.BroadcasterConsumer;
4+
import com.bookmap.addons.broadcasting.implementations.view.BroadcastFactory;
35
import com.bookmap.api.rpc.server.*;
46
import com.bookmap.api.rpc.server.data.outcome.InstrumentDetachedEvent;
57
import com.bookmap.api.rpc.server.data.outcome.InstrumentInfoEvent;
@@ -8,8 +10,10 @@
810
import com.bookmap.api.rpc.server.exceptions.FatalServerException;
911
import com.bookmap.api.rpc.server.log.PythonStackTraceTracker;
1012
import com.bookmap.api.rpc.server.log.RpcLogger;
13+
import velox.api.layer1.Layer1ApiProvider;
1114
import velox.api.layer1.annotations.*;
1215
import velox.api.layer1.common.DirectoryResolver;
16+
import velox.api.layer1.common.ListenableHelper;
1317
import velox.api.layer1.common.Log;
1418
import velox.api.layer1.data.InstrumentInfo;
1519
import velox.api.layer1.data.Layer1ApiProviderSupportedFeatures;
@@ -23,6 +27,7 @@
2327
import java.nio.file.Files;
2428
import java.nio.file.Path;
2529
import java.util.concurrent.*;
30+
import java.util.concurrent.atomic.AtomicBoolean;
2631
import java.util.stream.Stream;
2732

2833
@Layer1SimpleAttachable
@@ -47,6 +52,9 @@ public class RpcServerAddon
4752
public static final int PYTHON_ERROR_WIDTH = 800;
4853
private static Instance instance;
4954
private static ExecutorService executor;
55+
private final AtomicBoolean isWorking = new AtomicBoolean(false);
56+
private BroadcasterConsumer broadcaster;
57+
private Connector connector;
5058

5159
static {
5260
try {
@@ -111,11 +119,21 @@ public void initialize(String alias, InstrumentInfo instrumentInfo, Api api, Ini
111119

112120
ALIAS_TO_INITIALIZATION_TASK.put(alias, future);
113121

122+
Layer1ApiProvider provider = api.getProvider();
123+
124+
ListenableHelper.addListeners(provider, this);
125+
broadcaster = BroadcastFactory.getBroadcasterConsumer(provider, this.getClass().getSimpleName(), this.getClass());
126+
connector = new Connector(broadcaster);
127+
114128
if (instance == null) {
115-
instance = new ExternalProcessInstance(SCRIPT_FILE, ALIAS_TO_STATE, ALIAS_TO_INITIALIZATION_TASK, pythonExitCode);
129+
instance = new ExternalProcessInstance(SCRIPT_FILE, ALIAS_TO_STATE, ALIAS_TO_INITIALIZATION_TASK, pythonExitCode, connector);
116130
instance.run();
117131
}
118132
this.initialState.instrumentApi.addIntervalListeners(this);
133+
134+
isWorking.set(true);
135+
broadcaster.start();
136+
119137
Layer1ApiProviderSupportedFeatures supportedFeatures = TargetedRequestHelper.getSupportedFeaturesForAlias(api.getProvider(), alias);
120138
// TODO: find a better place to send this
121139
instance.getEventLoop().pushEvent(
@@ -164,6 +182,8 @@ public void stop() {
164182
executor = null;
165183
}
166184
instance = null;
185+
connector.finish();
186+
broadcaster.finish();
167187
}
168188
}
169189

serverside-rpc/src/test/java/com/bookmap/api/rpc/server/addon/TestInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void run() {
5555
sendingEventToClientHandler, reqDataHandler, clientInitHandler,
5656
new RegisterIndicatorHandler(aliasToState, eventLoop), new AddPointIndicatorHandler(aliasToState, eventLoop), new FinishedInitializationHandler(aliasToInitializationTask),
5757
new ClientOffHandler(eventLoop), new AddUiFieldHandler(aliasToState, eventLoop),
58-
new SendOrderHandler(aliasToState, eventLoop), new UpdateOrderHandler(aliasToState, eventLoop));
58+
new SendOrderHandler(aliasToState, eventLoop), new UpdateOrderHandler(aliasToState, eventLoop), new SubscribeToIndicatorHandler(eventLoop, null, null));
5959
eventLoop.setHandlerManager(handlerManager);
6060
eventLoop.pushEvent(new ServerInitEvent());
6161
reader = new DefaultMessageReader(server, incomeConverterManager, eventLoop);

0 commit comments

Comments
 (0)