2012-09-18 23 views
3

在我們公司,用戶已經通過標準的前端(Excel)查詢activepivot。但是我們想用Java構建一個自定義的MDX應用程序來查詢ActivePivot。我們的目標是能夠訂閱多個特定的視圖並實時檢索彙總的數據更新,以便爲我們的幾個內部系統提供數據。我們應該使用哪些Web服務將MDX查詢發送到ActivePivot?

我知道ActivePivot執行XMLA標準並且有自定義網絡服務。但我想知道發送MDX查詢的最佳選擇是什麼,爲什麼? XMLA標準是否支持實時更新?

回答

5

ActivePivot確實主要使用MDX語言進行查詢。 如您所述,有幾種不同的方法可以將MDX查詢發送到ActivePivot並獲得答案。

第一個也是最標準的方法是使用XMLA標準查詢ActivePivot。例如,當您使用Excel,Tableau或大多數支持MDX查詢ActivePivot的GUI時,會發生這種情況。 但是,此方法僅適用於臨時查詢。您無法將ActivePivot的連續查詢功能用於XMLA。

爲了註冊連續查詢,您需要使用附帶ActivePivot現有的Web服務,特別是:

  • 的IdGenerator服務
  • 進行流媒體業務
  • 的LongPolling服務

一般工作流程如下:

  1. 創建一個偵聽器線程,該線程將自己註冊到LongPolling服務並偵聽特定的域名名稱(比如myDomain)。這個線程將循環監聽事件並異步處理它們。
  2. 將MDX查詢註冊到Streaming服務。流屬性應該告訴它將事件發佈到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."); 
     } 
    } 
    } 
} 
相關問題