java - 我们应该使用哪些 Web 服务将 MDX 查询发送到 ActivePivot?

标签 java mdx xmla activepivot

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

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

最佳答案

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

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

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

  • IdGenerator 服务
  • 流媒体服务
  • 长轮询服务

一般工作流程如下:

  1. 创建一个监听器线程,将其自身注册到 LongPolling 服务并监听特定的域名名称(例如 myDomain)。该线程将在循环中监听事件并异步处理它们。
  2. 将 MDX 查询注册到流服务。 Stream 属性应该告诉它将事件发布到 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.");
      }
    }
  }
}

关于java - 我们应该使用哪些 Web 服务将 MDX 查询发送到 ActivePivot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12478290/

相关文章:

python - 使用 Python 连接到 Power BI XMLA 端点

c# - Java 等效于 C# 'using' 语句

java - 确保 Spring 托管 bean 的单个实例

sql - 具有两个或多个日期范围的 MDX 查询

ssas - MDX 查询 - 如何使用成员属性?

mdx - icCube - 调用另一个函数的函数结果为 NULL

.net - 我有哪些选项可以使用 Postgres 创建 OLAP 多维数据集并使其可通过 .net webservices/wcf 访问?

sql-server - 在 SSAS 安全中添加新用户

java - 在 AppEngine for Java 中,如何获取实例 : e. g 的名称。实例.appspot.com

java - com.google.gson.JsonSyntaxException : java. lang.IllegalStateException:预期为 BEGIN_OBJECT 但在第 1 行第 1 列路径 $