【发布时间】:2020-12-23 11:00:02
【问题描述】:
小问题:如何将以下 java 代码转换为 ColdFusion 代码?
private static HttpRequestInitializer setHttpTimeout(final HttpRequestInitializer requestInitializer) {
return new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest httpRequest) throws IOException {
requestInitializer.initialize(httpRequest);
httpRequest.setConnectTimeout(3 * 60000); // 3 minutes connect timeout
httpRequest.setReadTimeout(3 * 60000); // 3 minutes read timeout
}};
}
说明: 我使用一个组件与谷歌分析 API 进行通信。这很好用,但有时会发生读取超时。我想增加连接并读取超时。我在 StackOverflow 上找到了一篇文章,解释了如何在 Java 中执行此操作 (https://stackoverflow.com/a/30721185/2482184)。但是,我无法将 java 代码转换为 ColdFusion 代码。在我目前用于与 Google Analytics API 通信的 ColdFusion 组件下方:
<cfcomponent displayname="cfanalyticsConnector" output="false">
<cffunction name="init" access="public" output="false" returntype="cfanalyticsConnector">
<cfargument name="serviceAccountId" type="string" required="true" />
<cfargument name="pathToKeyFile" type="string" required="true" />
<cfargument name="analyticsAppName" type="string" required="true" />
<cfscript>
variables.serviceAccountId = arguments.serviceAccountId;
variables.pathToKeyFile = arguments.pathToKeyFile;
variables.analyticsAppName = arguments.analyticsAppName;
variables.HTTP_Transport = createObject("java", "com.google.api.client.http.javanet.NetHttpTransport").init();
variables.JSON_Factory = createObject("java", "com.google.api.client.json.jackson2.JacksonFactory").init();
variables.HTTP_Request_Initializer = createObject("java", "com.google.api.client.http.HttpRequestInitializer");
variables.Credential_Builder = createObject("java", "com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder");
variables.Analytics_Scopes = createObject("java", "com.google.api.services.analytics.AnalyticsScopes");
variables.Analytics_Builder = createObject("java", "com.google.api.services.analytics.Analytics$Builder").init(
variables.HTTP_Transport,
variables.JSON_Factory,
javaCast("null", ""));
variables.Collections = createObject("java", "java.util.Collections");
variables.File_Obj = createObject("java", "java.io.File");
variables.credential = "";
variables.analytics = "";
</cfscript>
<cfreturn this />
</cffunction>
<cffunction name="buildAnalytics" access="public" output="true" returntype="struct" hint="creates analytics object">
<cfset local = {} />
<cfset local.credential = "" />
<cfset local.returnStruct = {} />
<cfset local.returnStruct.success = true />
<cfset local.returnStruct.error = "" />
<!--- Access tokens issued by the Google OAuth 2.0 Authorization Server expire in one hour.
When an access token obtained using the assertion flow expires, then the application should
generate another JWT, sign it, and request another access token.
https://developers.google.com/accounts/docs/OAuth2ServiceAccount --->
<cftry>
<cfset local.credential = Credential_Builder
.setTransport(variables.HTTP_Transport)
.setJsonFactory(variables.JSON_Factory)
.setServiceAccountId(variables.serviceAccountId)
.setServiceAccountScopes(Collections.singleton(variables.Analytics_Scopes.ANALYTICS_READONLY))
.setServiceAccountPrivateKeyFromP12File(variables.File_Obj.Init(variables.pathToKeyFile))
.build() />
<cfcatch type="any">
<cfset local.returnStruct.error = "Credential Object Error: " & cfcatch.message & " - " & cfcatch.detail />
<cfset local.returnStruct.success = false />
</cfcatch>
</cftry>
<cfif local.returnStruct.success>
<cftry>
<cfset variables.analytics = variables.Analytics_Builder
.setApplicationName(variables.analyticsAppName)
.setHttpRequestInitializer(local.credential)
.build() />
<cfcatch type="any">
<cfset local.returnStruct.error = "Analytics Object Error: " & cfcatch.message & " - " & cfcatch.detail />
<cfset local.returnStruct.success = false />
</cfcatch>
</cftry>
</cfif>
<cfreturn local.returnStruct />
</cffunction>
</cfcomponent>
解释如何增加连接和读取超时的java代码:
private static HttpRequestInitializer setHttpTimeout(final HttpRequestInitializer requestInitializer) {
return new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest httpRequest) throws IOException {
requestInitializer.initialize(httpRequest);
httpRequest.setConnectTimeout(3 * 60000); // 3 minutes connect timeout
httpRequest.setReadTimeout(3 * 60000); // 3 minutes read timeout
}};
}
public static Analytics initializeAnalytics() throws Exception {
// Initializes an authorized analytics service object.
// Construct a GoogleCredential object with the service account email
// and p12 file downloaded from the developer console.
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
.setServiceAccountScopes(AnalyticsScopes.all())
.build();
// Construct the Analytics service object.
return new Analytics.Builder(httpTransport, JSON_FACTORY,setHttpTimeout(credential))
.setApplicationName(APPLICATION_NAME).build();
}
如果我理解正确,我需要修改这行代码:
<cfset variables.analytics = variables.Analytics_Builder
.setApplicationName(variables.analyticsAppName)
.setHttpRequestInitializer(local.credential)
.build() />
类似于:
<cfset variables.analytics = createObject("java",
"com.google.api.services.analytics.Analytics$Builder").init(
variables.HTTP_Transport,
variables.JSON_Factory,
setHttpTimeout(local.credential)
)
.setApplicationName(variables.analyticsAppName)
.setHttpRequestInitializer(local.credential)
.build() />
>
然而,我还没有成功地将 java setHttpTimeout 函数转换为coldfusion。任何帮助将不胜感激。
【问题讨论】:
-
该函数实现了一个java 接口
HttpRequestInitializer。要在 CF 中执行此操作,您必须使用 dynamic proxy。创建一个实现函数public void initialize(HttpRequest httpRequest)....的CFC。然后使用createDynamicProxy()创建CFC 的实例。然后使用实例而不是setHttpTimeout(local.credential)。 -
这个线程看起来很旧,但概述了过程stackoverflow.com/questions/28244067/…
标签: coldfusion