【问题标题】:How to create persistent queries in JCEF如何在 JCEF 中创建持久查询
【发布时间】:2022-12-15 01:07:08
【问题描述】:

关于我的应用

我有一个混合应用程序,我在其中使用JCEF(java 铬嵌入式框架)。

我想要达到的目标

使用 JCEF 的 IPC 功能设置一个简单的订阅系统。其中之一是消息路由.

在相关类中(CefMessageRouter.java).它讨论了一些用例:

// Some possible usage patterns include:
//
// 1.One-time Request. ...
// 2.Broadcast. ...
// 3.Subscription. Use a persistent query to register as a JavaScript subscription
//    receiver. The Handler initiates the subscription feed on the first request
//    and delivers responses to all registered subscribers as they become
//    available. The Handler cancels the subscription feed when there are no
//    longer any registered JavaScript receivers.

第三个选项是我想要的。如您所见,它需要持久查询。

我试过的

在我的主要课程中:

CefMessageRouter msgRouter = CefMessageRouter.create(new CefMessageRouterConfig("cefQuery", "cefQueryCancel"));
msgRouter.addHandler(new MessageRouterHandler(), isTransparent);
        
client_ = cefApp_.createClient();
client_.addMessageRouter(msgRouter);

MessageRouteHandler.java

//imports...    
public class MessageRouterhandler implements CefMessageRouterHandler{

    @Override
    public void setNativeRef(String identifer, long nativeRef) {}

    @Override
    public long getNativeRef(String identifer) { return 0;}

    @Override
    public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId, String request, boolean persistent,
            CefQueryCallback callback) {
        
        callback.success("{\"by\": \"cat\", \"message\": \"I hate you\"}");
        callback.success("{\"by\": \"dog\", \"message\": \"I love you\"}");
        
        return true;
    }

    @Override
    public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) {}
}

来自 javascript

window.cefQuery({
            request: 'get-data',
            persistent: true,
            onSuccess: function(response) {
                console.log(response)
            },
            onFailure: function(error_code, error_message) {
                console.log(error_code+":"+error_message);
            }
        })

输出

通过此设置,我除了进入控制台之外:

{"by": "cat", "message": "I hate you"}
{"by": "dog", "message": "I love you"}

我实际得到的是:

{"by": "cat", "message": "I hate you"}

我不明白为什么因为文档说:

// If the query is persistent then the callbacks will remain registered until one of the
// following conditions are met:
//
// A. The query is canceled in JavaScript using the |window.cefQueryCancel|
//    function.
// B. The query is canceled in C++ code using the Callback::Failure function.
// C. The context associated with the query is released due to browser
//    destruction, navigation or renderer process termination.

就我而言,似乎没有满足任何条件。但是回调不会保持注册状态。

问题

这是一个错误还是我遗漏了什么?如果这是一个错误。我可以探索其他选择吗?

编辑:

刚发现有像我这样的人在持久查询方面遇到同样的问题。这个问题有问题:https://bitbucket.org/chromiumembedded/java-cef/issues/186

【问题讨论】:

    标签: ipc chromium-embedded


    【解决方案1】:

    一个查询只能有一个响应。因此,您的第二个 success() 调用将被忽略。

    【讨论】:

    • 那么,如何通过一次查询将数据多次发送到渲染进程呢?
    猜你喜欢
    • 2011-03-09
    • 2012-04-05
    • 1970-01-01
    • 2011-04-21
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多