Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Montura authored Dec 7, 2023
1 parent 0b7514b commit 11e952c
Showing 1 changed file with 59 additions and 49 deletions.
108 changes: 59 additions & 49 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ Java API and implementing them in the native library.
#include "dxfeed/utils/JNICommon.hpp"

void printEvent(const dxfg_event_type_t* pEvent) {
if (pEvent->clazz == DXFG_EVENT_TIME_AND_SALE) {
const auto* time_and_sale = (const dxfg_time_and_sale_t*) pEvent;
if (pEvent->clazz == DXFG_EVENT_QUOTE) {
const auto* quote = (const dxfg_quote_t*) pEvent;
printf(
"C: TIME_AND_SALE{event_symbol=%s, bid_price=%f, exchange_sale_conditions=%s, buyer=%s, seller=%s}\n",
time_and_sale->market_event.event_symbol,
time_and_sale->bid_price,
time_and_sale->exchange_sale_conditions,
time_and_sale->buyer,
time_and_sale->seller
"C: QUOTE{event_symbol=%s, bid_price=%f, bid_time=%lld, ask_price=%f, ask_time=%lld}\n",
quote->market_event.event_symbol,
quote->bid_price,
quote->bid_time,
quote->ask_price,
quote->ask_time
);
}
fflush(stdout);
Expand All @@ -75,51 +75,61 @@ void c_print(graal_isolatethread_t *thread, dxfg_event_type_list *events, void *
}
}

int main(int argc, char** argv) {
// load cmd args
const int defaultArgSize = 4;
if (argc < defaultArgSize) {
std::cerr << "Error: expected 3 args: <JAVA_HOME, address:port, symbol, ... VMOptions >" << std::endl;
return -1;
}
void endpoint_state_change_listener(graal_isolatethread_t *thread, dxfg_endpoint_state_t old_state,
dxfg_endpoint_state_t new_state, void *user_data) {
printf("C: state %d -> %d\n", old_state, new_state);
}

void dxEndpointSubscription(graal_isolatethread_t *thread, const char* address, const char* symbol) {
printf("C: dxEndpointSubscription BEGIN\n");
dxfg_endpoint_t* endpoint = dxfg_DXEndpoint_create(thread);
dxfg_DXEndpoint_connect(thread, endpoint, address);
dxfg_feed_t* feed = dxfg_DXEndpoint_getFeed(thread, endpoint);

dxfg_subscription_t* subscription = dxfg_DXFeed_createSubscription(thread, feed, DXFG_EVENT_QUOTE);
dxfg_feed_event_listener_t* listener = dxfg_DXFeedEventListener_new(thread, &c_print, nullptr);
dxfg_DXFeedSubscription_addEventListener(thread, subscription, listener);

dxfg_endpoint_state_change_listener_t* stateListener =
dxfg_PropertyChangeListener_new(thread, endpoint_state_change_listener, nullptr);
dxfg_DXEndpoint_addStateChangeListener(thread, endpoint, stateListener);

dxfg_string_symbol_t symbolAAPL;
symbolAAPL.supper.type = STRING;
symbolAAPL.symbol = symbol;

dxfg_DXFeedSubscription_setSymbol(thread, subscription, &symbolAAPL.supper);
std::chrono::seconds seconds(10);
std::this_thread::sleep_for(seconds);

auto event = dxfg_EventType_new(thread, "", DXFG_EVENT_QUOTE);
int32_t result = dxfg_DXFeed_getLastEvent(thread, feed, event);
printf("C: result: %d\n", result);
dxfg_DXFeed_getLastEventIfSubscribed(thread, feed, DXFG_EVENT_QUOTE, &symbolAAPL.supper);

dxfg_DXFeedSubscription_close(thread, subscription);
dxfg_DXEndpoint_removeStateChangeListener(thread, endpoint, stateListener);
dxfg_DXEndpoint_close(thread, endpoint);
dxfg_JavaObjectHandler_release(thread, &stateListener->handler);
dxfg_JavaObjectHandler_release(thread, &listener->handler);
dxfg_JavaObjectHandler_release(thread, &subscription->handler);
dxfg_JavaObjectHandler_release(thread, &endpoint->handler);
printf("C: dxEndpointSubscription END\n");
}

int main() {
const auto javaHomePath = argv[1];
const auto address = argv[2];
const auto symbol = argv[3];
const auto address = "demo.dxfeed.com:7300";
const auto symbol = "AAPL";

dxfeed::jni::VMOptions vmOptions { javaHomePath, nullptr, 0 };

// init java VM
const int vmOptionsSize = 2;
const char* jvmArgs[vmOptionsSize] = { "-Xmx12G", "-Dcom.devexperts.qd.impl.matrix.Agent.MaxBufferSize=50000000" };
dxfeed::jni::VMOptions vmOptions { javaHomePath, jvmArgs, vmOptionsSize };
graal_isolate_t* isolate;
graal_isolatethread_t* thread;
int hr = graal_create_isolate(&vmOptions, &isolate, &thread);
if (hr == JNI_OK) {
// init context, connection, subscription
std::cout << "Connection to address:" << address << std::endl;
dxfg_endpoint_t* endpoint = dxfg_DXEndpoint_create(thread);
dxfg_DXEndpoint_connect(thread, endpoint, address);
dxfg_feed_t* feed = dxfg_DXEndpoint_getFeed(thread, endpoint);
dxfg_subscription_t* subscriptionTimeAndSale = dxfg_DXFeed_createSubscription(thread, feed, DXFG_EVENT_TIME_AND_SALE);

// add listener with user code
dxfg_feed_event_listener_t* listener = dxfg_DXFeedEventListener_new(thread, &c_print, nullptr);
dxfg_DXFeedSubscription_addEventListener(thread, subscriptionTimeAndSale, listener);

dxfg_string_symbol_t symbolAAPL;
symbolAAPL.supper.type = STRING;
symbolAAPL.symbol = symbol;

// add symbol to subscription
dxfg_DXFeedSubscription_setSymbol(thread, subscriptionTimeAndSale, &symbolAAPL.supper);

// sleep then clean up
std::chrono::seconds seconds(30);
std::this_thread::sleep_for(seconds);

dxfg_DXFeedSubscription_close(thread, subscriptionTimeAndSale);
dxfg_JavaObjectHandler_release(thread, &listener->handler);
dxfg_JavaObjectHandler_release(thread, &subscriptionTimeAndSale->handler);
dxfg_JavaObjectHandler_release(thread, &endpoint->handler);
dxEndpointSubscription(thread, address, symbol);
}
}
```
Expand Down Expand Up @@ -157,7 +167,7 @@ $ mvn clean package
$ cd src/main/c
$ sh build_release.sh
$ cd build
$ ./time_and_sale $JAVA_HOME 127.0.0.1:6666 ETH/USD:GDAX -Xmx12G
$ ./time_and_sale $JAVA_HOME demo.dxfeed.com:7300 AAPL -Xmx12G
```
</details>
Expand All @@ -168,7 +178,7 @@ $ mvn clean package
$ cd src\main\c
$ build_release.cmd
$ cd build
$ time_and_sale.exe %JAVA_HOME% 127.0.0.1:6666 ETH/USD:GDAX -Xmx12G
$ time_and_sale.exe %JAVA_HOME% demo.dxfeed.com:7300 AAPL -Xmx12G
```
</details>
Expand Down

0 comments on commit 11e952c

Please sign in to comment.