Различают событие создания и обновления управляемых объектов - PullRequest
1 голос
/ 27 мая 2019

Я использую Apama в Cumulocity.Всякий раз, когда в Cumulocity создается управляемый объект (устройство), я хотел бы предоставить ему некоторые начальные параметры, здесь требуется интервал, в течение которого устройство должно сообщить Cumulocity, прежде чем оно будет считаться недоступным.

Моя проблемачто в Apama у меня, похоже, нет никакого способа различить события создания и обновления.Поэтому, если я получаю управляемый объект, добавляю к нему некоторые параметры и отправляю его обратно в канал управляемого объекта, я оказываюсь в цикле.

Конечно, я могу выполнить некоторую проверку после получения события,но я бы предпочел фильтровать только события создания управляемых объектов и не выполнять никаких проверок IF.

Есть ли способ фильтрации только событий создания?В чем разница между CHANNEL и UPDATE_CHANNEL?Кажется, не имеет значения, какой я использую.

Мой текущий код выглядит следующим образом.Чего я хочу добиться, так это избегать использования оператора IF и фильтрации непосредственно при создании событий в слушателе.

monitor InitializeDevice {
    action onload() {

        monitor.subscribe(ManagedObject.CHANNEL);
        on all ManagedObject(type = "c8y_MQTTDevice") as mo {
            log "###Received managed object. Content is: " + mo.toString() at INFO;
            if (mo.params.hasKey("c8y_RequiredAvailability")) {
                //Assuming an interval has already been set, do nothing.
                log "###Received managed object with required availability fragment. Doing nothing." at INFO;
            }
            else {
                //Set the response interval on the managed object
                dictionary<string,any> params := mo.params;
                dictionary<string,any> paramssub := new dictionary<string,any>;
                paramssub.add("responseInterval",3);
                params.add("c8y_RequiredAvailability",paramssub);
                mo.params := params;
                log "###Added required interval to managed object. Content is: " + mo.toString() at INFO;
                send mo to ManagedObject.UPDATE_CHANNEL;
            }
        }
    }
}

Когда я запускаю этот монитор и создаю новый управляемый объект, это то, что печатается в журналах:


2019-05-27 16:15:07.310 INFO  [12648] - InitializeDevice [6] ###Received managed object. Content is: com.apama.cumulocity.ManagedObject("5708279","c8y_MQTTDevice","some-device",[],[],[],[],[],[],{},{"c8y_IsDevice":any(dictionary<any,any>,{}),"owner":any(string,"some-owner")})
2019-05-27 16:15:07.310 INFO  [12648] - InitializeDevice [6] ###Added required interval to managed object. Content is: com.apama.cumulocity.ManagedObject("5708279","c8y_MQTTDevice","some-device",[],[],[],[],[],[],{},{"c8y_IsDevice":any(dictionary<any,any>,{}),"c8y_RequiredAvailability":any(dictionary<string,any>,{"responseInterval":any(integer,3)}),"owner":any(string,"some-owner")})
2019-05-27 16:15:07.310 INFO  [12648] - InitializeDevice [6] ###Received managed object. Content is: com.apama.cumulocity.ManagedObject("5708279","c8y_MQTTDevice","some-device",[],[],[],[],[],[],{},{"c8y_IsDevice":any(dictionary<any,any>,{}),"c8y_RequiredAvailability":any(dictionary<string,any>,{"responseInterval":any(integer,3)}),"owner":any(string,"some-owner")})
2019-05-27 16:15:07.310 INFO  [12648] - InitializeDevice [6] ###Received managed object with required availability fragment. Doing nothing.
2019-05-27 16:15:08.244 INFO  [7868] - InitializeDevice [6] ###Received managed object. Content is: com.apama.cumulocity.ManagedObject("5708279","c8y_MQTTDevice","some-device",[],[],[],[],[],[],{},{"c8y_Availability":any(dictionary<any,any>,{any(string,"lastMessage"):any(dictionary<any,any>,{any(string,"date"):any(integer,27),any(string,"day"):any(integer,1),any(string,"hours"):any(integer,16),any(string,"minutes"):any(integer,15),any(string,"month"):any(integer,4),any(string,"seconds"):any(integer,7),any(string,"time"):any(integer,1558966507220),any(string,"timezoneOffset"):any(integer,-120),any(string,"year"):any(integer,119)}),any(string,"status"):any(string,"AVAILABLE")}),"c8y_Connection":any(dictionary<any,any>,{any(string,"status"):any(string,"DISCONNECTED")}),"c8y_IsDevice":any(dictionary<any,any>,{}),"c8y_RequiredAvailability":any(dictionary<any,any>,{any(string,"responseInterval"):any(integer,3)}),"owner":any(string,"some-owner")})
2019-05-27 16:15:08.244 INFO  [7868] - InitializeDevice [6] ###Received managed object with required availability fragment. Doing nothing.

Есть ли способ фильтрации непосредственно при создании событий?Почему после обновления я получил два заявления на печать?

Спасибо, Матиас

1 Ответ

0 голосов
/ 28 мая 2019

После некоторого расследования кажется, что нет никакого способа различить сообщения создания и обновления.Так что код, который вы используете в данный момент, вероятно, единственный способ сделать это.

Отредактировано:

НО Вторая часть вопроса:

Почему после обновления я получил два заявления на печать?

  1. c8y отправляет управляемый объект в MO.CHANNEL -> Монитор монитора Apama добавляет c8y_RequiredAvailability
  2. монитор отправляет управляемый объект с обновлением в MO.UPDATE_CHANNEL -> c8y
  3. c8y отправляет обновленный управляемый объект, содержащий c8y_RequiredAvailability -> монитор Apama
  4. c8y отправляет управляемый объект + c8y_Availability -> Apamamonitor

, поэтому 3 является подтверждением вашего обновления, а 4 - c8y асинхронно отправляет окончательное обновление с доступностью на MO.CHANNEL

Если быть точным - MO.CHANNELгде созданные и обновленные объекты поступают в Apama.Отправка по этому каналу не должна иметь никакого эффекта.MO.UPDATE_CHANNEL - это канал запроса, куда вы отправляете обновления, и затем он может инициировать дальнейшие сообщения на MO.CHANNEL в процессе c8y.

...