Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

提供一个bundle服务端的例子用于对bundle进行管理 #1

Closed
tonychen0924 opened this issue Nov 15, 2023 · 5 comments
Closed
Labels
question Further information is requested

Comments

@tonychen0924
Copy link

我需要写一个bundle服务端,里面可以对接实现celix对bundle操作的功能,例如"lb","install bundle"这些功能。我目前的难点在于,不知道这里面的install,lb这些指令的具体实现该如何做,其实就是以C++写一个文件,他对于那些来说就是消费端,套了一层实现之林的接口。对外,我就自己可以写一个客户端bundle来调用他。具体的一会我再提交一个例子可能更加清晰一点

@PengZheng
Copy link
Owner

PengZheng commented Nov 15, 2023

任何捆绑包只要有上下文,都可以通过捆绑包上下文提供的接口来管理当前框架实例里面的捆绑包。比如install bundle可以通过celix_framework_installBundle(Async)或者celix_bundleContext_installBundle(Async)来实现。例子可以参考bundles/shell/shell/src/install_command.c。上面这些接口也都有对应的C++接口,C++接口的使用方法可以参考一下框架的测试用例。

@PengZheng PengZheng added the question Further information is requested label Nov 15, 2023
@tonychen0924
Copy link
Author

你是否可以看得到我的github上传的项目
https://github.com/tonychen0924/CelixTest
我就是想调用具体的指令实现,你提到的install_command.c我看了,但我要如何关联起来呢?并且调用的参数也不知道都写什么,我搜了没有找到具体调用的例子

@PengZheng
Copy link
Owner

PengZheng commented Nov 15, 2023

https://github.com/tonychen0924/CelixTest/blob/9513107010febfc0107690c8ae85b974ac22bb9e/command_provider_bundle/src/CommandProviderBundle.cpp#L17-L24

    static std::shared_ptr<celix::ServiceRegistration> createService(std::shared_ptr<celix::BundleContext>& ctx)
    {
        int seed = 42;
        std::cout << "CommandProviderBundle register" << std::endl;
        return ctx->registerService<ACEPHERE_RUNTIME::ICommand>(std::make_shared<ACEPHERE_RUNTIME::CommandImpl>(seed))
                .addProperty("seed", seed)
                .build();
    }

创建CommandImpl的时候把代表框架的捆绑包上下文ctx给丢掉了,怎么在里面调用celix_bundleContext_installBundle实现安装功能呢?调用celix_bundleContext_installBundle的代码测试里面能找到几十处,都能调试器挂着单步调试,比如TEST_F(CelixBundleContextBundlesTestSuite, InstallABundleTest)

再比如,C++的例子

TEST_F(CxxBundleActivatorTestSuite, InstallUninstallBundleWithCmpAndTracker) {
    //When I install and uninstall a bundle with a component and tracker combination without asan issues (use after free)

    auto reg = ctx->registerService<TestInterface>(std::make_shared<TestImpl>()).build();

    auto bndId = ctx->installBundle(CMP_TEST_BUNDLE_LOC);
    EXPECT_GE(bndId, 0);
    ctx->uninstallBundle(bndId);

}

测试用例都是现成Demo。

@tonychen0924
Copy link
Author

非常感谢你的帮助,我测试下来已经可以调用自己写的服务端接口加载bundle了,只需要通过ctx调用"celix\libs\framework\include\celix\BundleContext.h"中声明的接口即可。这也正是我的需求,通过抽象出这层bundle管理组件来负责管理bundle。

不过我还有一个问题,"lb"的实现这里怎么没有对应的接口呢?我需要用就只能通过每个bundle启动以后记录下bundle名字和对应的id进行管理?

@PengZheng
Copy link
Owner

PengZheng commented Nov 16, 2023

"lb"的实现这里怎么没有对应的接口呢?我需要用就只能通过每个bundle启动以后记录下bundle名字和对应的id进行管理?

实际上框架支持的方式是通过捆绑包ID来管理。你现在记录的名字只是捆绑包的位置而已。
这里有一个接口可用性问题,用户需要先通过捆绑包位置或者符号名来反查捆绑包ID,不太方便。
apache#688

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants