【问题标题】:Which web services should we use to send MDX queries to ActivePivot?我们应该使用哪些 Web 服务将 MDX 查询发送到 ActivePivot?
【发布时间】:2012-09-18 13:43:55
【问题描述】:

在我们公司,用户已经通过标准前端(Excel)查询activepivot。但是我们想用 Java 构建一个自定义的 MDX 应用程序来查询 ActivePivot。目标是能够订阅多个特定视图并实时检索聚合数据更新,以便为我们的多个内部系统提供数据。

我知道 ActivePivot 实现了 XMLA 标准 并具有 自定义 Web 服务。但我想知道发送 MDX 查询的最佳选择是什么,为什么? XMLA 标准是否支持实时更新?

【问题讨论】:

    标签: java mdx xmla activepivot


    【解决方案1】:

    ActivePivot 确实主要使用 MDX 语言进行查询。 正如您所指出的,有几种不同的方法可以将 MDX 查询发送到 ActivePivot 并获得答案。

    第一种也是最标准的方法是使用 XMLA 标准查询 ActivePivot。例如,当您使用 Excel、Tableau 或大多数支持 MDX 的 GUI 查询 ActivePivot 时,就会发生这种情况。 但是,此方法仅对 ad-hoc 查询有效。您不能将 ActivePivot 的连续查询功能与 XMLA 一起使用。

    为了注册连续查询,您需要使用 ActivePivot 附带的现有 Web 服务,特别是:

    • IdGenerator 服务
    • 流媒体服务
    • Lo​​ngPolling 服务

    一般工作流程如下:

    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.");
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2012-02-09
      • 2015-06-16
      相关资源
      最近更新 更多