From 5e491f37e030c8bfb90b4cd7fc02db00599451a9 Mon Sep 17 00:00:00 2001 From: Anatoly Kalin Date: Mon, 8 Apr 2024 17:34:08 +0300 Subject: [PATCH 01/17] [EN-7588] Implement PublishProfiles sample --- include/dxfeed_graal_cpp_api/api/DXFeed.hpp | 3 - src/api/DXFeed.cpp | 6 -- tests/api/DataIntegrityTest.cpp | 89 ++++++++++++++++++--- 3 files changed, 78 insertions(+), 20 deletions(-) diff --git a/include/dxfeed_graal_cpp_api/api/DXFeed.hpp b/include/dxfeed_graal_cpp_api/api/DXFeed.hpp index 46b257c3..c264d79e 100644 --- a/include/dxfeed_graal_cpp_api/api/DXFeed.hpp +++ b/include/dxfeed_graal_cpp_api/api/DXFeed.hpp @@ -122,9 +122,6 @@ struct DXFCPP_EXPORT DXFeed : SharedEntity { private: JavaObjectHandle handle_; - - std::unordered_set> subscriptions_{}; - static std::shared_ptr create(void *feedHandle); protected: diff --git a/src/api/DXFeed.cpp b/src/api/DXFeed.cpp index 82bc46c2..087c05fc 100644 --- a/src/api/DXFeed.cpp +++ b/src/api/DXFeed.cpp @@ -40,8 +40,6 @@ void DXFeed::attachSubscription(std::shared_ptr subscription subHandle) == 0; }, false)) { - - subscriptions_.emplace(subscription); } } @@ -61,8 +59,6 @@ void DXFeed::detachSubscription(std::shared_ptr subscription subHandle) == 0; }, false)) { - - subscriptions_.erase(subscription); } } @@ -82,8 +78,6 @@ void DXFeed::detachSubscriptionAndClear(std::shared_ptr subs handle, subHandle) == 0; }, false)) { - - subscriptions_.erase(subscription); } } diff --git a/tests/api/DataIntegrityTest.cpp b/tests/api/DataIntegrityTest.cpp index 1aa98008..a547e0ac 100644 --- a/tests/api/DataIntegrityTest.cpp +++ b/tests/api/DataIntegrityTest.cpp @@ -34,6 +34,8 @@ struct DataIntegrityTestFixture { endpoint = DXEndpoint::newBuilder() ->withRole(DXEndpoint::Role::LOCAL_HUB) ->withProperty(DXEndpoint::DXFEED_WILDCARD_ENABLE_PROPERTY, "true") + ->withProperty(DXEndpoint::DXENDPOINT_EVENT_TIME_PROPERTY, "true") + ->withProperty(DXEndpoint::DXSCHEME_NANO_TIME_PROPERTY, "true") ->build(); feed = endpoint->getFeed(); pub = endpoint->getPublisher(); @@ -52,14 +54,10 @@ struct DataIntegrityLocalAddressTestFixture { DXFeed::Ptr feed{}; DataIntegrityLocalAddressTestFixture() { - pubEndpoint = DXEndpoint::newBuilder() - ->withRole(DXEndpoint::Role::PUBLISHER) - ->build(); + pubEndpoint = DXEndpoint::newBuilder()->withRole(DXEndpoint::Role::PUBLISHER)->build(); pubEndpoint->connect(":7766"); pub = pubEndpoint->getPublisher(); - feedEndpoint = DXEndpoint::newBuilder() - ->withRole(DXEndpoint::Role::FEED) - ->build(); + feedEndpoint = DXEndpoint::newBuilder()->withRole(DXEndpoint::Role::FEED)->build(); feedEndpoint->connect("127.0.0.1:7766"); feed = feedEndpoint->getFeed(); } @@ -89,13 +87,12 @@ struct DataIntegrityRemoteTestFixture { } }; -TEST_CASE_FIXTURE(DataIntegrityTestFixture, "Test Message" * doctest::should_fail() ) { +TEST_CASE_FIXTURE(DataIntegrityTestFixture, "Test Message" * doctest::should_fail()) { auto sub = feed->createSubscription(Message::TYPE); - auto message = std::make_shared("TEST", "Attachment2"); - sub->addEventListener([message = message](const std::vector> & messages) { - for (auto&& m : messages) { + sub->addEventListener([message = message](const std::vector> &messages) { + for (auto &&m : messages) { fmt::println("{}", m->toString()); REQUIRE(message->getAttachment() == m->getAttachment()); @@ -103,8 +100,78 @@ TEST_CASE_FIXTURE(DataIntegrityTestFixture, "Test Message" * doctest::should_fai }); sub->addSymbols("TEST"); - pub->publishEvents(message); std::this_thread::sleep_for(2s); } + +TEST_CASE_FIXTURE(DataIntegrityTestFixture, "dxFeed :: Test attach & detach sub") { + std::mutex ioMutex{}; + + auto println = [&ioMutex](auto s) { + std::lock_guard lock{ioMutex}; + std::cout << s << std::endl; + }; + + auto tnsSubAAA = DXFeedSubscription::create({TimeAndSale::TYPE}); + auto tnsSubBBB = DXFeedSubscription::create({TimeAndSale::TYPE}); + + tnsSubAAA->addSymbols("AAA"); + tnsSubBBB->addSymbols("BBB"); + + tnsSubAAA->addEventListener([&println](const auto &timeAndSales) { + for (auto &&tns : timeAndSales) { + println(fmt::format("tnsSubAAA: {}", tns->toString())); + } + }); + + tnsSubBBB->addEventListener([&println](const auto &timeAndSales) { + for (auto &&tns : timeAndSales) { + println(fmt::format("tnsSubBBB: {}", tns->toString())); + } + }); + + std::atomic publishAAA{true}; + std::atomic publishBBB{true}; + std::atomic stop{false}; + + auto t = std::thread([pub = pub, &publishAAA, &publishBBB, &stop]() { + auto tnsAAA = std::make_shared("AAA"); + auto tnsBBB = std::make_shared("BBB"); + + while (!stop) { + if (publishAAA) { + tnsAAA->setTime(tnsAAA->getTime() + 1000); + pub->publishEvents(tnsAAA); + } + + if (publishBBB) { + tnsBBB->setTime(tnsBBB->getTime() + 1000); + pub->publishEvents(tnsBBB); + } + + std::this_thread::sleep_for(100ms); + } + }); + + std::this_thread::sleep_for(1ms); + + println("Attach tnsSubAAA"); + feed->attachSubscription(tnsSubAAA); + println("Attach tnsSubBBB"); + feed->attachSubscription(tnsSubBBB); + + std::this_thread::sleep_for(5s); + + println("Detach tnsSubAAA"); + feed->detachSubscription(tnsSubAAA); + + std::this_thread::sleep_for(5s); + + println("Detach tnsSubBBB"); + feed->detachSubscription(tnsSubBBB); + + std::this_thread::sleep_for(5s); + stop = true; + t.join(); +} From 30d1ab60cc5d7aec9e40bd73997432181c4e5a99 Mon Sep 17 00:00:00 2001 From: Anatoly Kalin Date: Mon, 22 Apr 2024 18:34:37 +0300 Subject: [PATCH 02/17] EN-7588: a project skeleton. --- CMakeLists.txt | 1 + samples/cpp/PublishProfiles/CMakeLists.txt | 56 +++++++++++ samples/cpp/PublishProfiles/src/main.cpp | 107 +++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 samples/cpp/PublishProfiles/CMakeLists.txt create mode 100644 samples/cpp/PublishProfiles/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e6edde8a..86074e72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -461,6 +461,7 @@ endif () if (DXFCXX_BUILD_SAMPLES) add_subdirectory(samples/cpp/PrintQuoteEvents) + add_subdirectory(samples/cpp/PublishProfiles) add_subdirectory(samples/cpp/DxFeedSample) add_subdirectory(samples/cpp/WriteTapeFile) add_subdirectory(samples/cpp/ConvertTapeFile) diff --git a/samples/cpp/PublishProfiles/CMakeLists.txt b/samples/cpp/PublishProfiles/CMakeLists.txt new file mode 100644 index 00000000..62248eef --- /dev/null +++ b/samples/cpp/PublishProfiles/CMakeLists.txt @@ -0,0 +1,56 @@ +# Copyright (c) 2024 Devexperts LLC. +# SPDX-License-Identifier: MPL-2.0 + +cmake_minimum_required(VERSION 3.21) + +if (POLICY CMP0092) + cmake_policy(SET CMP0092 NEW) +endif () + +if (POLICY CMP0135) + cmake_policy(SET CMP0135 NEW) +endif () + +project(PublishProfiles LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_C_STANDARD 11) +set(CXX_EXTENSIONS OFF) +set(C_EXTENSIONS OFF) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(CMAKE_MACOSX_RPATH ON) + set(CMAKE_SKIP_BUILD_RPATH ON) + set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) + set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) + set(CMAKE_INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path;@executable_path;@executable_path/../Frameworks") +elseif (UNIX) + set(CMAKE_SKIP_BUILD_RPATH ON) + set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) + set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) + set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:$ORIGIN/../lib64:$ORIGIN/../lib:$ORIGIN") +endif () + +add_executable(${PROJECT_NAME} src/main.cpp) + +target_include_directories(${PROJECT_NAME} PRIVATE ../../../third_party/range-v3-0.12/include) + +target_link_libraries(${PROJECT_NAME} PRIVATE dxfcxx::static) + +if (DXFCXX_FEATURE_STACKTRACE) + LinkStacktrace(${PROJECT_NAME}) +endif () + +add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + $) + +if (DXFCXX_INSTALL AND DXFCXX_INSTALL_SAMPLES) + install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if (WIN32) + install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif () +endif () \ No newline at end of file diff --git a/samples/cpp/PublishProfiles/src/main.cpp b/samples/cpp/PublishProfiles/src/main.cpp new file mode 100644 index 00000000..bacd0a58 --- /dev/null +++ b/samples/cpp/PublishProfiles/src/main.cpp @@ -0,0 +1,107 @@ +// Copyright (c) 2024 Devexperts LLC. +// SPDX-License-Identifier: MPL-2.0 + +#include + +#include +#include +#include +#include + +#include + +using namespace dxfcpp; +using namespace dxfcpp::literals; +using namespace std::literals; + +void printUsage() { + auto usageString = R"( +Usage: +DxFeedConnect
[