【发布时间】: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