Как java-клиент в cumulocity прослушивает события?

Цель состоит в том, чтобы создать Java-клиент, который подписывается и слушает канал. Затем обработайте поступающие события с сервера cumulocity на hadoop. Сначала было сложно подключиться (подписаться) к серверу cumulocity с помощью 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.                       
        }

    }

Поскольку мы можем получить некоторое целочисленное значение, которое подтверждает подключение к серверу. Но теперь следующий момент — как прослушивать канал на наличие событий и получать эти события. Любая помощь будет высоко оценена.


person irfan aziz    schedule 24.01.2017    source источник


Ответы (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 просто добавьте строки ниже (используя лямбда-выражение)

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» — это идентификатор желаемого канала.

Надеюсь это поможет!

person Jorge    schedule 25.01.2017