在我們公司,用戶已經通過標準的前端(Excel)查詢activepivot。但是我們想用Java構建一個自定義的MDX應用程序來查詢ActivePivot。我們的目標是能夠訂閱多個特定的視圖並實時檢索彙總的數據更新,以便爲我們的幾個內部系統提供數據。我們應該使用哪些Web服務將MDX查詢發送到ActivePivot?
我知道ActivePivot執行XMLA標準並且有自定義網絡服務。但我想知道發送MDX查詢的最佳選擇是什麼,爲什麼? XMLA標準是否支持實時更新?
在我們公司,用戶已經通過標準的前端(Excel)查詢activepivot。但是我們想用Java構建一個自定義的MDX應用程序來查詢ActivePivot。我們的目標是能夠訂閱多個特定的視圖並實時檢索彙總的數據更新,以便爲我們的幾個內部系統提供數據。我們應該使用哪些Web服務將MDX查詢發送到ActivePivot?
我知道ActivePivot執行XMLA標準並且有自定義網絡服務。但我想知道發送MDX查詢的最佳選擇是什麼,爲什麼? XMLA標準是否支持實時更新?
ActivePivot確實主要使用MDX語言進行查詢。 如您所述,有幾種不同的方法可以將MDX查詢發送到ActivePivot並獲得答案。
第一個也是最標準的方法是使用XMLA標準查詢ActivePivot。例如,當您使用Excel,Tableau或大多數支持MDX查詢ActivePivot的GUI時,會發生這種情況。 但是,此方法僅適用於臨時查詢。您無法將ActivePivot的連續查詢功能用於XMLA。
爲了註冊連續查詢,您需要使用附帶ActivePivot現有的Web服務,特別是:
一般工作流程如下:
在這一點上,監聽線程將獲得當前結果爲註冊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.");
}
}
}
}