Dynamic Router
Поддерживается только производитель
Компонент Dynamic Router представляет собой реализацию динамического маршрутизатора EIP. Участники могут отправлять сообщения о подписке по специальному каналу управления во время выполнения, чтобы указать условия маршрутизации сообщений к своей конечной точке (также указанные в сообщении канала управления). Таким образом, динамический маршрутизатор является расширением контентно-ориентированного маршрутизатора EIP. Если получатель хочет удалить себя, он также может отправить сообщение об отмене подписки.
Обратите внимание, что хотя Camel Core содержит реализацию динамического маршрутизатора EIP, этот компонент представляет собой совершенно отдельную реализацию, призванную более точно отражать описание EIP. Основные различия между реализацией Core и реализацией этого компонента заключаются в следующем:
Канал управления
Зарезервированный канал связи, с помощью которого участники маршрутизации могут подписываться или отписываться от получения сообщений, соответствующих их критериям.
-
core : не имеет канала связи для управляющих сообщений. Возможно, обсуждаемое ниже поведение «рециркуляции» является интерпретацией канала управления динамического маршрутизатора core.
-
component: предоставляет участникам канал управления для подписки и отписки с помощью контрольных сообщений, которые содержат Predicate для определения Exchangeпригодности и URI, на который будет отправлено Endpointсопоставление .Exchange
Динамическая база правил
Динамический маршрутизатор должен иметь список критериев получателей маршрутизации, определяющих условия, при которых обмен подходит для них.
-
core : реализует динамическую версию a Routing Slipдля этой цели, но её содержимое не является динамическим по своей сути. Если содержимое этого бланка динамическое, пользователь должен определить и реализовать эту возможность.
-
component: создает базу правил во время выполнения и поддерживает ее по мере того, как участники подписываются или отписываются через канал управления.
Повторная циркуляция сообщений
Описание EIP динамического маршрутизатора не определяет поведение повторной циркуляции сообщений.
-
core : обеспечивает функцию непрерывной маршрутизации обмена к получателю, а затем обратно через динамический маршрутизатор, пока получатель не вернётся, nullчтобы сообщить о завершении маршрутизации. Это может быть интерпретацией функции канала управления.
-
component: не предоставляет функцию рециркуляции. Если требуется именно это поведение, пользователю придётся определить и реализовать его. Например, создать простой маршрут для отправки ответа обратно через динамический маршрутизатор при определённых условиях.
В некоторых случаях более подходящим будет базовый динамический маршрутизатор. В других случаях лучше подойдёт компонент динамического маршрутизатора.
URI format
dynamic-router:channel[?options]
Канал channelмаршрутизации позволяет логически отделить обмен сообщениями от других каналов. Любая строка, включённая в URI, является допустимым именем канала. Каждый канал может иметь набор подписок участников и может принимать сообщения для маршрутизации соответствующим получателям. Единственный зарезервированный канал -- это controlканал. Это один канал, который обрабатывает управляющие сообщения, позволяющие участникам подписаться или отписаться от обмена сообщениями по выбранному каналу.
Эти сообщения будут более подробно описаны ниже с примерами.
Configuring Options
Компоненты Camel настраиваются на двух отдельных уровнях:
-
уровень компонентов
-
уровень конечной точки
Configuring Component Options
На уровне компонентов задаются общие и общие конфигурации, которые затем наследуются конечными точками. Это самый высокий уровень конфигурации.
Например, компонент может иметь настройки безопасности, учетные данные для аутентификации, URL-адреса для сетевого подключения и т. д.
У некоторых компонентов всего несколько параметров, а у других -- много. Поскольку компоненты обычно имеют предустановленные значения по умолчанию, которые широко используются, зачастую вам может потребоваться настроить лишь несколько параметров компонента, а то и вовсе ни одного.
Вы можете настроить компоненты, используя:
-
Компонент DSL (opens in a new tab) .
-
в файле конфигурации (
application.propertiesфайлы*.yaml, и т.д.). -
непосредственно в коде Java.
Configuring Endpoint Options
Настройка конечных точек обычно занимает больше времени, поскольку у них есть множество параметров. Эти параметры помогают вам настроить функции конечной точки. Параметры также классифицируются по тому, используется ли конечная точка как потребитель ( от ), как производитель ( от ) или и то, и другое.
Конечные точки чаще всего настраиваются непосредственно в URI конечной точки в виде параметров пути и запроса . Вы также можете использовать Endpoint DSL (opens in a new tab) и DataFormat DSL (opens in a new tab) в качестве типобезопасного способа настройки конечных точек и форматов данных в Java.
Хорошей практикой при настройке параметров является использование заполнителей свойств (opens in a new tab) .
Заполнители свойств обеспечивают несколько преимуществ:
-
Они помогают предотвратить использование жестко запрограммированных URL-адресов, номеров портов, конфиденциальной информации и других настроек.
-
Они позволяют вынести конфигурацию за пределы кода.
-
Они помогают коду стать более гибким и пригодным для повторного использования.
В следующих двух разделах перечислены все параметры, сначала для компонента, а затем для конечной точки.
Component Options
Компонент Dynamic Router поддерживает 2 параметра, которые перечислены ниже.
lazyStartProducer (producer)
-
Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.
-
По умолчанию: false
-
Тип: boolean
autowiredEnabled (advanced)
-
Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.
-
По умолчанию: true
-
Тип: boolean
Endpoint Options
Конечная точка динамического маршрутизатора настраивается с использованием синтаксиса URI:
dynamic-router:channel
Со следующими параметрами пути и запроса :
Path Parameters (1 parameters)
channel (producer)
-
Канал для динамического маршрутизатора. Например, если URI динамического маршрутизатора -- dynamic-router://test, то канал -- test. Каналы -- это способ логически отделить участников маршрутизации, их правила и обмены от участников, правил и обменов на других каналах. Это можно рассматривать как аналог VLAN в сетевых технологиях.
-
По умолчанию:
-
Тип: String
Query Parameters (20 parameters)
aggregationStrategy (common)
-
Относится к стратегии агрегации (AggregationStrategy), используемой для объединения ответов многоадресных рассылок в одно исходящее сообщение. По умолчанию Camel использует последний ответ в качестве исходящего сообщения. В качестве стратегии агрегации можно также использовать POJO.
-
По умолчанию:
-
Тип: String
aggregationStrategyBean (common)
-
Тип: Относится к стратегии агрегации (AggregationStrategy), используемой для объединения ответов многоадресных рассылок в одно исходящее сообщение. По умолчанию Camel использует последний ответ в качестве исходящего сообщения. В качестве стратегии агрегации можно также использовать POJO.
-
По умолчанию:
-
Тип: AggregationStrategy
aggregationStrategyMethodAllowNull (common)
-
Если этот параметр установлен в значение false, то метод агрегации не используется при отсутствии данных для обогащения. Если этот параметр установлен в значение true, то при использовании POJO в качестве AggregationStrategy в качестве oldExchange (при отсутствии данных для обогащения) используются значения NULL.
-
По умолчанию: false
-
Тип: boolean
aggregationStrategyMethodName (common)
-
В качестве AggregationStrategy можно использовать POJO. Это название метода, агрегирующего данные между биржами.
-
По умолчанию:
-
Тип: String
cacheSize (common)
-
При кэшировании конечных точек производителя это размер кэша. Значение по умолчанию -- 100.
-
По умолчанию:
-
Тип: int
executorService (common)
-
Тип: Относится к пользовательскому пулу потоков, используемому для параллельной обработки. Обратите внимание, что при установке этого параметра параллельная обработка подразумевается автоматически, и вам не нужно включать этот параметр в дополнение к этому.
-
По умолчанию:
-
Тип: String
executorServiceBean (common)
-
Относится к пользовательскому пулу потоков, используемому для параллельной обработки. Обратите внимание, что при установке этого параметра параллельная обработка подразумевается автоматически, и вам не нужно включать этот параметр в дополнение к этому.
-
По умолчанию:
-
Тип: ExecutorService
ignoreInvalidEndpoints (common)
-
Тип: Игнорируйте исключение недопустимой конечной точки при попытке создать производителя с недопустимой конечной точкой.
-
По умолчанию: false
-
Тип: boolean
onPrepare (common)
-
Использует процессор при подготовке org.apache.camel.Exchange к отправке. Это может использоваться для глубокого клонирования сообщений, которые должны быть отправлены, или для реализации любой пользовательской логики, необходимой перед отправкой обмена. Это имя компонента в реестре.
-
По умолчанию:
-
Тип: String
onPrepareProcessor (common)
-
Использует процессор при подготовке org.apache.camel.Exchange к отправке. Это можно использовать для глубокого клонирования сообщений, которые должны быть отправлены, или для реализации любой пользовательской логики, необходимой перед отправкой обмена. Это экземпляр процессора.
-
По умолчанию:
-
Тип: Processor
parallelAggregate (common)
-
Тип: Если эта опция включена, то агрегатный метод AggregationStrategy может вызываться параллельно. Обратите внимание, что для этого потребуется реализовать AggregationStrategy как потокобезопасный. По умолчанию это значение равно false, что означает, что Camel синхронизирует вызов агрегатного метода. Однако в некоторых случаях это может быть использовано для повышения производительности, если AggregationStrategy реализован как потокобезопасный.
-
По умолчанию: false
-
Тип: boolean
parallelProcessing (common)
-
Если эта опция включена, отправка многоадресных сообщений происходит параллельно. Обратите внимание, что вызывающий поток по-прежнему будет ожидать полной обработки всех сообщений, прежде чем продолжить. Параллельно происходит только отправка и обработка ответов от получателей многоадресных сообщений. При включении параллельной обработки механизм маршрутизации Camel продолжит обработку, используя последний использованный поток из пула параллельных потоков. Однако, если вы хотите использовать исходный поток, вызвавший многоадресную рассылку, обязательно включите также опцию синхронной отправки.
-
По умолчанию: false
-
Тип: boolean
recipientMode (common)
-
Режим получателя: firstMatch или allMatch.
Значения перечисления:
-
firstMatch
-
allMatch
-
-
По умолчанию: firstMatch
-
Тип: String
shareUnitOfWork (common)
-
Разделяет org.apache.camel.spi.UnitOfWork с родительским и каждым подсообщением. Многоадресная рассылка по умолчанию не будет разделять единицу работы между родительским обменом и каждым подсообщением, участвующим в многоадресной рассылке. Это означает, что каждый подобмен имеет свою собственную индивидуальную единицу работы.
-
По умолчанию: false
-
Тип: boolean
stopOnException (common)
-
Дальнейшая обработка будет остановлена, если во время обработки org.apache.camel.Exchange возникло исключение или сбой, и будет выдано соответствующее исключение. Также будет остановлена, если обработка обмена завершилась неудачей (было выдано сообщение об ошибке) или было выдано исключение, обработанное обработчиком ошибок (например, с помощью onException). Во всех случаях многоадресная рассылка прекратит дальнейшую обработку. Это аналогично конвейеру, используемому механизмом маршрутизации. По умолчанию обработка не останавливается, а продолжается до конца.
-
По умолчанию: false
-
Тип: boolean
streaming (common)
-
Если эта опция включена, Camel будет обрабатывать ответы вне очереди (например, в порядке их поступления). Если отключена, Camel будет обрабатывать ответы в порядке, заданном многоадресной рассылкой.
-
По умолчанию: false
-
Тип: boolean
synchronous (common)
-
Устанавливает, следует ли строго использовать синхронную обработку. Если эта опция включена, то тот же поток будет использоваться для продолжения маршрутизации после завершения многоадресной рассылки, даже если включена параллельная обработка.
-
По умолчанию: false
-
Тип: boolean
timeout (common)
-
Устанавливает общее время ожидания в миллисекундах при использовании параллельной обработки. Если многоадресная рассылка не смогла отправить и обработать все ответы в течение заданного времени, срабатывает время ожидания, и многоадресная рассылка прерывается и продолжается. Обратите внимание, что если указать TimeoutAwareAggregationStrategy, то метод timeout вызывается перед прерыванием. Если время ожидания истекает, а запущенные задачи ещё не завершены, некоторые задачи (которые Camel сложно завершить корректно) могут продолжать выполняться. Поэтому используйте эту опцию с осторожностью.
-
По умолчанию: -1
-
Тип: long
warnDroppedMessage (common)
-
Отметить, чтобы зарегистрировать предупреждение, если для обмена не совпадут предикаты.
-
По умолчанию: false
-
Тип: boolean
lazyStartProducer (producer (advanced))
-
Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.
-
По умолчанию: false
-
Тип: boolean
Usage
Пользователям Maven необходимо добавить следующую зависимость для pom.xmlэтого компонента:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-dynamic-router</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>Пользователям Gradle необходимо добавить следующую зависимость для build.gradleэтого компонента:
implementation group: 'org.apache.camel', name: 'camel-dynamic-router', version: 'x.x.x'
// use the same version as your Camel core versionКомпонент Dynamic Router используется так же, как и другие компоненты. В качестве потребителя в маршруте следует включить URI динамического маршрутизатора вместе с именем канала.
- Java
Example Java DSL Route Definition
// Send a message to the Dynamic Router channel named "orders"
from("direct:start").to("dynamic-router:orders");- Spring XML
<route> <from uri="direct:start"/> <to uri="dynamic-router:nameOfYourChannel"/> </route>
Examples
Преимущества компонента динамического маршрутизатора EIP лучше всего видны, пожалуй, на примере некоторых вариантов использования. Эти примеры -- не единственные возможности этого компонента, но они демонстрируют основы двух основных вариантов его применения: маршрутизации сообщений внутри одной JVM и маршрутизации сообщений между несколькими JVM.
Dynamic Router within a single JVM or Application
Компонент Dynamic Router EIP может получать сообщения из одного источника и отправлять их заинтересованным получателям. Если у нас есть простое приложение для точек продаж, мы можем использовать сервисы, которые:
-
Process orders
-
Adjust inventory counts
-
Process returns
Для данного примера точные действия, выполняемые каждой службой, не так важны, как тот факт, что каждая служба должна быть уведомлена о необходимости выполнения определённых действий при определённых условиях. Поэтому каждая служба подписывается на участие в маршрутизации:
Orders processing service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("orderProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{(headers.command == 'processOrder'}")
.expressionLanguage("simple")
.build();
producerTemplate.sendBody("dynamic-router-control:subscribe", controlMessage);Inventory service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("inventoryProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{headers.command == 'processOrder' or headers.command == 'processReturn'}")
.expressionLanguage("simple")
.build();
producerTemplate.sendBody("dynamic-router-control:subscribe", controlMessage);Returns processing service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("orderProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{(headers.command == 'processReturn'}")
.expressionLanguage("simple")
.build();
producerTemplate.sendBody("dynamic-router-control:subscribe", controlMessage);Выше мы видим, что сервис Orders подписывается на все сообщения с commandзаголовком «processOrder», а сервис Returns -- на все сообщения с commandзаголовком «processReturn». Сервис Inventory заинтересован в обоих типах сообщений, поскольку он должен вычитать количество товара из запасов при поступлении запроса на заказ и добавлять его к количеству товара при поступлении запроса на возврат. Таким образом, для каждого типа сообщения будут уведомлены два сервиса.
Сообщения о заказах отправляются на динамический маршрутизатор
Routing order/return request messages
from("direct:start")
.process(myOrderProcessor)
.to("dynamic-router:orders");Обратите внимание на этот .process(myOrderProcessor)шаг. Если входящие сообщения необходимо проверить, обогатить, преобразовать или иным образом дополнить, это можно сделать до того, как динамический маршрутизатор получит сообщение. Затем, получив сообщение, динамический маршрутизатор проверяет его Exchangeпо всем подпискам на канал заказов , чтобы определить, подходит ли оно для какого-либо из получателей. Заказы должны иметь заголовок ( command-> processOrder), чтобы сообщение было направлено в службу заказов и службу инвентаризации. Система обработает данные заказа, а затем служба инвентаризации вычтет их из количества товаров. Аналогично, возвраты должны иметь заголовок ( command-> processReturn), чтобы сообщение было направлено в службу возвратов, где данные возврата будут обработаны, а служба инвентаризации увеличит количество соответствующих товаров.
Further learning: a complete Spring Boot example
В camel-spring-boot-examplesпроекте dynamic-router-eipмодуль служит полноценным примером в этой категории, который вы можете запустить и/или поэкспериментировать, чтобы получить практическое представление о том, как вы можете использовать его в своем собственном приложении с одной JVM.
Dynamic Router across multiple JVMs or Applications
Компонент EIP динамического маршрутизатора особенно хорошо подходит в качестве основного механизма оркестровки между различными приложениями и сервисами, составляющими стек приложений. Обратите внимание, что динамический маршрутизатор не может обеспечить это самостоятельно, и для передачи сообщений между сервисами, работающими в отдельных JVM, требуется другой транспорт. Например, можно использовать реализацию транспорта сообщений, такую как Kafka, Artemis или Protocol Buffers.
Давайте рассмотрим пример с POS-терминалом в другом контексте. В микросервисной архитектуре эта система будет состоять из нескольких отдельных прикладных модулей, включая службу заказов, службу учёта запасов и службу возвратов, которые будут содержаться в отдельных микросервисах (приложениях). Как и в примере с одной JVM, все сервисы будут подписаны, но им потребуется отправлять свои подписки через транспорт, который может взаимодействовать с другой JVM. Их подписки могут выглядеть следующим образом:
Orders processing service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("orderProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{(headers.command == 'processOrder'}")
.expressionLanguage("simple")
.build();
ObjectMapper mapper = new ObjectMapper(new JsonFactory());
producerTemplate.sendBody("kafka://subscriptions", mapper.writeValueAsString(controlMessage));Inventory service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("inventoryProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{headers.command == 'processOrder' or headers.command == 'processReturn'}")
.expressionLanguage("simple")
.build();
ObjectMapper mapper = new ObjectMapper(new JsonFactory());
producerTemplate.sendBody("kafka://subscriptions", mapper.writeValueAsString(controlMessage));Returns processing service subscription
DynamicRouterControlMessage controlMessage = DynamicRouterControlMessage.newBuilder()
.subscribeChannel("orders")
.subscriptionId("orderProcessing")
.destinationUri("direct:orders")
.priority(5)
.predicate("{(headers.command == 'processReturn'}")
.expressionLanguage("simple")
.build();
ObjectMapper mapper = new ObjectMapper(new JsonFactory());
producerTemplate.sendBody("kafka://subscriptions", mapper.writeValueAsString(controlMessage));В другом модуле дополнительная маршрутизация будет служить мостом для передачи сообщения от Kafka к каналу управления динамического маршрутизатора:
RouteBuilder subscriptionRouter() {
return new RouteBuilder(camelContext) {
@Override
public void configure() {
from("kafka:subscriptions")
.unmarshal().json(DynamicRouterControlMessage.class)
.to("dynamic-router-control:subscribe");
}
};
}Запросы на заказ или возврат также могут поступать через Kafka. Маршрут по сути тот же, что и в примере с одной JVM. Вместо пересылки входящего сообщения «как есть» из компонента «direct» в маршрутизатор, сообщения десериализуются из строки и преобразуются в экземпляр объекта «order». Затем их можно отправить в динамический маршрутизатор для оценки и распространения соответствующим получателям-подписчикам:
Routing order/return request messages from Kafka to the Dynamic Router
from("kafka://orders")
.unmarshal().json(MyOrderMessage.class)
.process(myOrderProcessor)
.to("dynamic-router:orders");Обратите внимание на этот .process(myOrderProcessor)шаг. Если входящие сообщения необходимо проверить, обогатить, преобразовать или иным образом дополнить, это можно сделать до того, как динамический маршрутизатор получит сообщение. Затем, получив сообщение, динамический маршрутизатор проверяет его Exchangeпо всем подпискам на канал «orders», чтобы определить, подходит ли оно для кого-либо из получателей. Заказы должны иметь заголовок ( command-> processOrder), поэтому сообщение будет направлено в службу заказов и службу инвентаризации. Система обработает данные заказа, а затем служба инвентаризации вычтет их из количества товаров. Аналогично, возвраты должны иметь заголовок ( command-> processReturn), поэтому сообщение будет направлено в службу возвратов, где данные возврата будут обработаны, а служба инвентаризации увеличит количество соответствующих товаров.
Further learning: a complete Spring Boot example
В camel-spring-boot-examplesпроекте dynamic-router-eip-multimoduleмодуль служит полноценным примером в этой категории, который вы можете запустить и/или поэкспериментировать, чтобы получить практическое представление о том, как вы можете использовать его в своем собственном стеке приложений с несколькими JVM.
JMX Control and Monitoring Operations
Компонент Dynamic Router Control поддерживает некоторые операции JMX, позволяющие управлять компонентом и отслеживать его работу. Подробное описание JMX выходит за рамки данного документа, поэтому ниже представлен список поддерживаемых операций. Подробнее о JMX см. в документации по JMX (opens in a new tab) .
Subscribing with a predicate expression
String subscribeWithPredicateExpression(String, String, String, int, String, String, boolean)Эта операция позволяет подписаться на канал с предикатным выражением. Параметры (в порядке убывания) следующие:
-
subscription ID
-
channel name
-
destination URI
-
priority
-
predicate expression
-
expression language
-
update the subscription (true), or add a new one (false)
Subscribing with a predicate bean
String subscribeWithPredicateBean(String, String, String, int, String, boolean)Эта операция позволяет подписаться на канал с именем предиката, привязанного к реестру. Параметры (в порядке убывания) следующие:
-
subscription ID
-
channel name
-
destination URI
-
priority
-
predicate bean name
-
update the subscription (true), or add a new one (false)
Subscribing with a predicate instance
String subscribeWithPredicateInstance(String, String, String, int, Object, boolean)Эта операция позволяет подписаться на канал с экземпляром предиката. Параметры (в порядке убывания) следующие:
-
subscription ID
-
channel name
-
destination URI
-
priority
-
predicate instance
-
update the subscription (true), or add a new one (false)
Unsubscribing
boolean removeSubscription(String, String)This operation provides the ability to unsubscribe from a channel. The parameters, in order, are as follows:
-
subscription ID
-
channel name
Getting the subscriptions map
Map<String, ConcurrentSkipListSet<PrioritizedFilter>> getSubscriptionsMap()Эта операция позволяет получить карту подписок. Карта ключом служит название канала, а значения представляют собой набор приоритетных фильтров.
Getting the subscriptions statistics map
Map<String, List<PrioritizedFilterStatistics>> getSubscriptionsStatisticsMap()Эта операция позволяет получить карту статистики подписок. Карта определяется по имени канала, а значения представляют собой список приоритетных статистических данных фильтра, включая количество сообщений, соответствующих фильтру и отправленных на целевой URI.