目标是构建一个订阅和收听频道的Java客户端。然后将到达事件从cumulocity服务器处理到hadoop。首先,很难使用java客户端连接(订阅)cumulocity服务器。但是,现在我们已经有订户(因为我们能够获得一些价值,如代码注释中所述)。接下来我们想要的是订阅者收听我们在cumulocity服务器中定义的频道。但是我们无法获得有助于实现此步骤的积极性java文档中的任何方法或任何有用的方法。 这是代码。我已将凭据和服务器URL匿名化。
package c8y.example.hello_agent;
import c8y.IsDevice;
import com.cumulocity.model.authentication.CumulocityCredentials;
import com.cumulocity.rest.representation.inventory.ManagedObjectRepresentation;
import com.cumulocity.sdk.client.Platform;
import com.cumulocity.sdk.client.PlatformImpl;
import com.cumulocity.sdk.client.inventory.InventoryApi;
import com.cumulocity.sdk.client.PlatformParameters;
import com.cumulocity.sdk.client.SDKException;
import com.cumulocity.sdk.client.notification.*;
import com.cumulocity.sdk.client.ClientConfiguration;
import com.cumulocity.*;
import c8y.example.hello_agent.cred;
public class CepCustomNotificationsSubscriber implements Subscriber<String, Object> {
public static final String CEP_CUSTOM_NOTIFICATIONS_URL = "test/sendTemperature";
private final Subscriber<String, Object> subscriber;
public CepCustomNotificationsSubscriber(PlatformParameters parameters) {
subscriber = createSubscriber(parameters);
}
private Subscriber<String, Object> createSubscriber(PlatformParameters parameters) {
// @formatter:off
return SubscriberBuilder.<String, Object>anSubscriber()
.withParameters(parameters)
.withEndpoint(CEP_CUSTOM_NOTIFICATIONS_URL)
.withSubscriptionNameResolver(new Identity())
.withDataType(Object.class)
.build();
// @formatter:on
}
public Subscription<String> subscribe(final String channelID, final SubscriptionListener<String, Object> handler) throws SDKException {
return subscriber.subscribe(channelID, handler);
}
public void disconnect() {
subscriber.disconnect();
}
private static final class Identity implements SubscriptionNameResolver<String> {
@Override
public String apply(String id) {
return id;
}
}
public static void main( String[] args )
{
cred crede = new cred();
String uRl = "https://xxx.cumulocityiox.com";
CumulocityCredentials rC = new CumulocityCredentials(crede.name,crede.pass);
PlatformParameters parameters = new PlatformParameters(uRl,rC, new ClientConfiguration());
CepCustomNotificationsSubscriber t = new CepCustomNotificationsSubscriber(parameters);
System.out.println(t.toString() + " - " + t.CEP_CUSTOM_NOTIFICATIONS_URL.toString()); // It prints an integer number corresponding to the subscriber t.
// Now how to listen to the events on the channel and get the desired data.
}
}
因为我们能够获得一些整数值来验证与服务器的连接。但现在接下来的重点是如何听取频道的事件并获得这些事件。任何帮助将受到高度赞赏。
答案 0 :(得分:1)
我猜你有一个像
这样的cep模块insert into
SendNotification
select
e.event as payload,
"customevent/" || e.event.source.value as channelName
from
EventCreated e;
如果您创建了“customevent / cumulocity-system-id”频道的订阅,您将能够获得这些活动
在Java代码中,只需添加以下行(使用lambda表达式)
t.subscribe("/customevent/1191201", new SubscriptionListener (){
@Override
public void onNotification(Subscription s, Object r) {
// here come the notification of the desired channel. The Object r is the event desired.
System.out.println(r);
}
@Override
public void onError(Subscription s, Throwable thrwbl) {
// errors will come here
}
});
和
System.out.println(r);
将打印类似
的内容{creationTime=2017-01-26T19:00:15.837+01:00, c8y_Position=Position
[lat=4, lng=-71.80, alt=67, accuracy=null],
self=http://yourTenant.cumulocity.com/event/events/1202018,
time=2017-01- 26T13:00:15.000-05:00, id=1202018, source={name=Lancer
UBL142,
self=http://yourTenant.cumulocity.com/inventory/managedObjects/1191201,
id=1191201}, text=Estado,Idle mode (Parking), type=c8y_LocationUpdate}
请注意“/ customevent / 1191201”是您的愿望频道。
希望这有帮助!