Какие веб-сервисы мы должны использовать для отправки запросов MDX в ActivePivot?
В нашей компании пользователи уже запрашивают activepivot через стандартный интерфейс (Excel). Но мы бы хотели создать собственное приложение MDX на Java для запроса ActivePivot. Цель состоит в том, чтобы иметь возможность подписаться на несколько конкретных представлений и получать сводные обновления данных в режиме реального времени, чтобы использовать некоторые из наших внутренних систем.
Я знаю, что ActivePivot реализует стандарт XMLA и имеет собственные веб-сервисы. Но мне было интересно, что будет лучшим выбором для отправки запросов MDX и почему? поддерживает ли стандарт XMLA обновления в реальном времени?
1 ответ
ActivePivot действительно в первую очередь запрашивается с использованием языка MDX. Как вы заметили, существует несколько различных способов отправки MDX-запросов в ActivePivot и получения ответа.
Первый и самый стандартный способ - это запросить ActivePivot со стандартом XMLA. Это то, что происходит, например, когда вы используете Excel, Tableau или большинство графических интерфейсов, которые поддерживают MDX, для запроса ActivePivot. Этот метод, однако, действителен только для специальных запросов. Вы не можете использовать функцию непрерывных запросов ActivePivot с XMLA.
Для регистрации непрерывных запросов вам необходимо использовать существующие веб-сервисы, поставляемые с ActivePivot, а именно:
- сервис IdGenerator
- Потоковый сервис
- сервис LongPolling
Общий рабочий процесс выглядит следующим образом:
- Создайте поток слушателя, который зарегистрирует себя в службе LongPolling и прослушивает определенное доменное имя (скажем, myDomain). Этот поток в цикле будет прослушивать события и обрабатывать их асинхронно.
- Зарегистрируйте запрос MDX для службы потоковой передачи. Свойство stream должно указывать ему публиковать события в домене myDomain.
На этом этапе поток слушателя получит текущий набор результатов для зарегистрированного запроса MDX и впоследствии получит только измененные ячейки, так как их значение изменяется с новыми транзакциями.
Вот пример кода для регистрации запроса:
// Create my MDX query
final String mdx =
"SELECT NON EMPTY {DrilldownLevel({[Bookings].[ALL].[AllMember]})} ON ROWS " +
"FROM [EquityDerivativesCube] " +
"WHERE ([Measures].[contributors.COUNT])";
final IMDXQuery mdxQuery = new MDXQuery(mdx);
// Retrieve your various webservices
final IStreamingService streamingService = ...;
final ILongPollingService longPollingService = ...;
final IIdGenerator idGenerator = ...;
// Initiate a (long polling based) communication channel
final String listenerId = idGenerator.generateListenerIds(1)[0];
longPollingService.addListener(PUBLICATION_DOMAIN, listenerId);
new Thread(new Listener(longPollingService, listenerId)).start();
// Subscribe a continuous mdx query, events will be received
// through the communication channel.
final String mdxStreamId = idGenerator.generateListenerIds(1)[0];
final IStreamProperties mdxStreamProperties = new StreamProperties(
mdxStreamId,
PUBLICATION_DOMAIN,
InitialState.STARTED,
true);
streamingService.createStream(mdxQuery, mdxStreamProperties);
// From now on the listener will receive the real-time events
А вот простой код слушателя:
public class Listener implements Runnable {
final ILongPollingService service;
final String listenerId;
Listener(ILongPollingService service, String listenerId) {
this.service = service;
this.listenerId = listenerId;
}
@Override
public void run() {
for(int iteration = 0; iteration < 100; iteration++) {
IBulkedStreamEvents events = service.listen(listenerId);
if(events != null) {
logger.log(Level.INFO, "Received events:");
for(final IDomainStreamEvent domainEvent: events.getDomainEvents()) {
for(final IStreamEvent event : domainEvent.getEvents())
logger.log(Level.INFO, event.toString());
}
} else {
logger.log(Level.INFO, "No events received.");
}
}
}
}