Какие веб-службы следует использовать для отправки запросов MDX в ActivePivot?

В нашей компании пользователи уже запрашивают activepivot через стандартный интерфейс (Excel). Но мы хотели бы создать пользовательское приложение MDX на Java для запроса ActivePivot. Цель состоит в том, чтобы иметь возможность подписаться на несколько конкретных представлений и получать сводные обновления данных в режиме реального времени, чтобы снабжать несколько наших внутренних систем.

Я знаю, что ActivePivot реализует стандарт XML и имеет настраиваемые веб-службы. Но мне было интересно, что было бы лучшим выбором для отправки запросов MDX и почему? поддерживает ли стандарт XMLA обновления в реальном времени?


person JBE    schedule 18.09.2012    source источник


Ответы (1)


ActivePivot действительно в основном запрашивается с использованием языка многомерных выражений. Как вы заметили, существует несколько различных способов отправки запросов MDX в ActivePivot и получения ответа.

Первый и самый стандартный способ — запросить ActivePivot со стандартом XMLA. Это происходит, например, когда вы используете Excel, Tableau или большинство графических интерфейсов, поддерживающих MDX, для запроса ActivePivot. Однако этот метод действителен только для специальных запросов. Вы не можете использовать функцию непрерывных запросов ActivePivot с XMLA.

Для регистрации непрерывных запросов необходимо использовать существующие веб-службы, поставляемые с ActivePivot, а именно:

  • служба генератора идентификаторов
  • стриминговый сервис
  • сервис LongPolling

Общий рабочий процесс выглядит следующим образом:

  1. Создайте поток прослушивателя, который зарегистрируется в службе LongPolling и будет прослушивать определенное доменное имя (скажем, myDomain). Этот поток будет в цикле прослушивать события и обрабатывать их асинхронно.
  2. Зарегистрируйте запрос MDX в службе потоковой передачи. Свойство потока должно указывать ему публиковать события в домене 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.");
      }
    }
  }
}
person RomainC    schedule 20.09.2012