ActivePivot действительно в основном запрашивается с использованием языка многомерных выражений. Как вы заметили, существует несколько различных способов отправки запросов MDX в ActivePivot и получения ответа.
Первый и самый стандартный способ — запросить ActivePivot со стандартом XMLA. Это происходит, например, когда вы используете Excel, Tableau или большинство графических интерфейсов, поддерживающих MDX, для запроса ActivePivot. Однако этот метод действителен только для специальных запросов. Вы не можете использовать функцию непрерывных запросов ActivePivot с XMLA.
Для регистрации непрерывных запросов необходимо использовать существующие веб-службы, поставляемые с ActivePivot, а именно:
- служба генератора идентификаторов
- стриминговый сервис
- сервис LongPolling
Общий рабочий процесс выглядит следующим образом:
- Создайте поток прослушивателя, который зарегистрируется в службе LongPolling и будет прослушивать определенное доменное имя (скажем, myDomain). Этот поток будет в цикле прослушивать события и обрабатывать их асинхронно.
- Зарегистрируйте запрос 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