[WSO2 Api Manager 4.1/自定义处理程序]



我已经为我的apim平台(4.1(开发了一个自定义处理程序,我在其中调用一个自定义类中介器,以便将MessageContext信息记录到一个单独的日志文件中,如下所示:

public void logUserRequest(MessageContext messageContext) {
Map headers = service.getTransportHeaders(messageContext);
String userId = (String) messageContext.getProperty(APIMgtGatewayConstants.USER_ID);
String api = (String) messageContext.getProperty(APIMgtGatewayConstants.API);
String apiKeyType = (String) messageContext.getProperty(AM_KEY_TYPE);
String appliName = (String) messageContext.getProperty(APIMgtGatewayConstants.APPLICATION_NAME);
String method = (String) messageContext.getProperty(APIMgtGatewayConstants.HTTP_METHOD);
String organisation = (String) messageContext.getProperty(APIMgtGatewayConstants.APPLICATION_NAME);   
String version = (String) messageContext.getProperty(APIMgtGatewayConstants.VERSION);
successCallLog.info(userId + "|" + organisation + "|" + apiKeyType  + "|" + method + "|" + api + "|" + version + "|" + appliName );
}

当在我的处理程序的handleResponse()方法中调用日志中介器时,它工作得很好,但问题是我没有记录请求的确切时间,而是在另一个流中使用它来计算其他统计信息。

06-10-2022 10:49:00,072|admin@carbon.super|test|PRODUCTION|GET|PizzaShackAPI|1.0.0|test

另一方面,当我在处理程序的handleRequest()方法中调用日志中介时,我会得到我试图记录的MessageContext属性的null值:

06-10-2022 10:46:34,311|null|null|null|null|null|null|null|null

PS:我在apim 3.2版本中使用相同的处理程序和中介程序时没有遇到这个问题

我是不是错过了什么?或者两个版本之间有什么变化吗?

正如@DushaniW在他的评论中所解释的,在我的中介尝试记录MessageContext属性时,MessageContext属性没有设置,因为调用中介的处理程序是在APIAuthenticationHandler之前参与的,APIAuthenticationHandler解释了null值。

我能够通过确保在自定义处理程序之前调用默认处理程序APIAuthenticationHandler来纠正这个问题。

我已经更新了velocity_template.xml中的配置,以便在foreach循环之后使用我的自定义处理程序,该循环使用默认处理程序(如果我的理解正确的话(。

错误:

<handlers xmlns="http://ws.apache.org/ns/synapse">
<!-- ############## CUSTOM : handler X-Correlation-ID ############### -->
<handler class="fr.XX.XX.XX.XX.handler.CustomAPIAuthenticationXCorrelationIDHandler"/>
<!-- ############## CUSTOM : handler X-Correlation-ID ############### -->
<!-- ############## Default handlers ############### -->
#foreach($handler in $handlers)
<handler xmlns="http://ws.apache.org/ns/synapse" class="$handler.className">
#if($handler.hasProperties())
#set ($map = $handler.getProperties() )
#foreach($property in $map.entrySet())
<property name="$!property.key" value="$!property.value"/>
#end
#end
</handler>
#end

更正:

<handlers xmlns="http://ws.apache.org/ns/synapse">
<!-- ############## Default handlers ############### -->
#foreach($handler in $handlers)
<handler xmlns="http://ws.apache.org/ns/synapse" class="$handler.className">
#if($handler.hasProperties())
#set ($map = $handler.getProperties() )
#foreach($property in $map.entrySet())
<property name="$!property.key" value="$!property.value"/>
#end
#end
</handler>
#end
<!-- ############## CUSTOM : handler X-Correlation-ID ############### -->
<handler class="fr.XX.XX.XX.XX.handler.CustomAPIAuthenticationXCorrelationIDHandler"/>
<!-- ############## CUSTOM : handler X-Correlation-ID ############### -->

最新更新