我正在使用Apama v10.3.1。我正在使用Cumulocity安装的内置Apama容器,这就是我要上传的只是一个监视器,而不是整个Apama项目。在我的Apama监视器中,我正在对Cumulocity REST API执行HTTP GET请求,以获取监视器处理所需的其他参数。
我的问题是执行HTTP请求时,我需要提供用户名和密码,否则会出现401错误。由于我不想在监视器中对用户名和密码进行硬编码,是否有任何方法可以使用内置的Apama容器与Cumulocity通信时使用的凭据?由于Apama在幕后与Cumulocity进行通信以交换事件,度量等,因此我假设某个地方有可用的凭据。是这样,如果是,我该如何告诉我的Apama监视器使用这些凭据?
以下是代码的摘录:
monitor SampleAlarmRules {
action onload() {
monitor.subscribe(Alarm.CHANNEL);
monitor.subscribe(FindManagedObjectResponse.CHANNEL);
on all Alarm(type = "ax_UnavailabilityAlarm") as a {
onAlarm(a.source);
}
}
action onAlarm(string source) {
integer reqId := integer.getUnique();
send FindManagedObject(reqId, source, new dictionary<string,string>) to FindManagedObject.CHANNEL;
on FindManagedObjectResponse(reqId = reqId) as resp
and not FindManagedObjectResponseAck(reqId) {
ManagedObject dev := resp.managedObject;
dictionary<string, string> httpConfig := {
HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC"
//HttpTransport.CONFIG_USERNAME:"someUser",
//HttpTransport.CONFIG_PASSWORD:"somePassword"
};
HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
request.execute(handleResponse);
}
}
action handleResponse(Response response) {
JSONPlugin json := new JSONPlugin;
if response.isSuccess(){
switch (response.payload.data as payload) {
case string: {
}
default: {
}
}
}
else {
print "###Request failed. Response status is: " + response.statusCode.toString() + " | " + response.statusMessage;
}
}
}
使用此配置(注释了用户名和密码),我得到以下打印语句:
启用用户名和密码后,请求将成功执行。但是,我不想在此处对用户名和密码进行硬编码。
还有,有没有办法从环境变量或类似的变量中获取当前租户,这样我就不必对基本URL进行硬编码了?
谢谢 Mathias
答案 0 :(得分:3)
是的,之所以可以这样做是因为Cumulocity将这些作为环境变量传递给了所有微服务,包括Apama微服务。
您应该能够使用com.apama.correlator.Component
事件来访问环境变量。采用
Component.getInfo("envp")
获取环境属性的字典,然后查找感兴趣的变量。您可以在http://www.cumulocity.com/guides/reference/microservice-runtime/#environment-variables
因此,对于您的用例,将可以执行以下操作:
using com.apama.correlator.Component;
...
monitor test {
action onload() {
dictionary<string,string> envp := Component.getInfo("envp");
dictionary<string, string> httpConfig := {
HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC",
HttpTransport.CONFIG_USERNAME:envp["C8Y_USER"],
HttpTransport.CONFIG_PASSWORD:envp["C8Y_PASSWORD"]
};
HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
request.execute(handleResponse);
}
}
类似地,您可以使用环境变量C8Y_TENANT
访问租户名称。
请注意,这些环境变量仅在云中可用。如果要在与自己添加的Cumulocity传输一起使用时执行相同的操作或在本地测试代码,而无需更改代码,则可以在Designer的运行配置中手动定义相同的环境变量,以便在那里也可以使用它们。