実際、ActivePivot は主に MDX 言語を使用してクエリされます。ご指摘のとおり、MDX クエリを ActivePivot に送信して回答を得る方法はいくつかあります。
最初の最も標準的な方法は、XMLA 標準を使用して ActivePivot をクエリすることです。これは、たとえば、Excel、Tableau、または MDX をサポートするほとんどの GUI を使用して ActivePivot をクエリする場合に発生します。ただし、この方法はアドホック クエリに対してのみ有効です。XMLA で ActivePivot の連続クエリ機能を使用することはできません。
継続的なクエリを登録するには、ActivePivot に同梱されている既存の Web サービスを使用する必要があります。
- IdGenerator サービス
- ストリーミングサービス
- 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.");
}
}
}
}