如何从 MFP 8.0 中的 java 适配器异步调用 javascript 适配器?

Posted

技术标签:

【中文标题】如何从 MFP 8.0 中的 java 适配器异步调用 javascript 适配器?【英文标题】:How to call javascript adapters from java adapters in MFP 8.0 asynchronously? 【发布时间】:2019-01-21 21:30:37 【问题描述】:

这里我尝试从 java 适配器异步调用多个 js 适配器,但无法获取响应对象。谁能帮我解决这个问题。我使用 Java 的 Callable 和 Future 进行了尝试。

public JSONArray getResourceDataAsync() throws IOException, InterruptedException, ExecutionException
    HttpUriRequest request = adaptersAPI.createjavascriptAdapterRequest(randNumberAdapter, "getEmpDetails");
    addJsAdapterRequest(request);

    request = adaptersAPI.createJavascriptAdapterRequest(randTextAdapter, "getJson");
    addJsAdapterRequest(request);
    new Thread(new Runnable() 

        public void run() 
            System.out.println("Inside Thread Run method");
            HttpUriRequest req = adaptersAPI.createJavascriptAdapterRequest(randNumberAdapter, "getEmpDetails");
            HttpResponse res=null;
            try 
                res = adaptersAPI.executeAdapterRequest(req);
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            JSONObject object=null;
            try 
                object = adaptersAPI.getResponseAsJSON(res);
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            System.out.println("The response from Thread Implementation is  -->" + object);
        
    ).start();

【问题讨论】:

你看到这个链接mobilefirstplatform.ibmcloud.com/tutorials/it/foundation/8.0/…了吗? 示例演示github.com/MobileFirst-Platform-Developer-Center/AdaptersMashup @manjunathkallannavar 是的。我已经阅读了所有这些文档并实现了上述场景。对于从 java 适配器进行的同步调用,它可以工作,但在通过线程传递请求的情况下,它会失败。这就是为什么要询问异步实现以及是否可以使用 mfp apis。 【参考方案1】:

适配器混搭调用 - 一个适配器调用另一个部署的适配器,只能同步完成。不支持异步调用。您所观察到的是预期的。

正确的方法是使用如下代码:

HttpUriRequest req = adaptersAPI.createJavascriptAdapterRequest(AdapterName, ProcedureName, [parameters]);
org.apache.http.HttpResponse response = adaptersAPI.executeAdapterRequest(req);
JSONObject jsonObj = adaptersAPI.getResponseAsJSON(response);

详情是here。

【讨论】:

是否可以使用 HttpClient 来做到这一点,我们直接从 java 适配器命中其余端点而不使用上述方法。我们可以通过这种方式进行异步调用吗?实际上将它与 spring 集成。 是可以做到的。但是为什么要做这一切呢?如果您调用的适配器端点受到保护(如果不是自定义的,则始终存在默认保护),您将收到质询作为响应。在您的调用适配器中,您无法处理它 - 因为适配器希望获得 OAuth 令牌。或者,您可以明确关闭第二个端点的 OAuth 安全性。 在我的项目中,有许多后端 apis 是使用 MFP.Server.invokeHttp() 方法从 js 适配器同步调用的,这需要花费大量时间来执行,以使其有点快。从 java 适配器调用 javascript 适配器并使 js 适配器调用异步,以便所有后端服务可以在多个线程上运行,完成后每个都可以返回响应,然后我可以将响应组合成一个 json 数组,可以是返回到客户端应用程序。所以如果你有建议怎么做,请帮忙。 如果您的 JS 适配器过程被明确标记为不受保护,您可以这样做。使用这里提到的方法:mobilefirstplatform.ibmcloud.com/blog/2018/11/29/…

以上是关于如何从 MFP 8.0 中的 java 适配器异步调用 javascript 适配器?的主要内容,如果未能解决你的问题,请参考以下文章

推送通知 - 适配器 - MFP 从 6.3 迁移到 8.0

来自应用程序的 MobileFirst 8.0 调用适配器正在连接到 localhost:6015/mfp

MobileFirst 8.0 - 从 WLResourceRequest 调用受保护的适配器

如何从 MFP 8 Java 适配器向客户端抛出用户异常?

没有客户端组件的基于 IBM MFP 适配器的身份验证

MFP 8.0 SECURITY_CHECK_NOT_FOUND