<?xml version="1.0" encoding="UTF-8"?>
  <!--
   ***************************************************************
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
         *
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   ***************************************************************
   -->
<analysisEngineDeploymentDescription xmlns="http://uima.apache.org/resourceSpecifier">
  <name>Top Level TAE</name>
  <description/>
  <version/>
  <vendor/>
  <deployment protocol="jms" provider="activemq">
    <service>
      <inputQueue endpoint="TopLevelTaeQueue" brokerURL="tcp://localhost:8118" prefetch="0"/>
      <topDescriptor>
        <import location="../descriptors/analysis_engine/SimpleTestCMAggregateWithCollocated1MillionCM.xml"/>
      </topDescriptor>
      <analysisEngine async="true">
        <scaleout numberOfInstances="1"/>
        <delegates>
          <analysisEngine key="TestMultiplier" async="false">
            <casMultiplier poolSize="7" initialFsHeapSize="2000000"/>
            <asyncAggregateErrorConfiguration>
              <getMetadataErrors maxRetries="0" timeout="0" errorAction="terminate"/>
              <processCasErrors maxRetries="0" timeout="0" continueOnRetryFailure="false" thresholdCount="0" thresholdWindow="0" thresholdAction="terminate"/>
              <collectionProcessCompleteErrors timeout="0" additionalErrorAction="terminate"/>
            </asyncAggregateErrorConfiguration>
          </analysisEngine>
			
          <remoteAnalysisEngine key="RemoteNoOp">
            <inputQueue brokerURL="tcp://localhost:8118" endpoint="NoOpAnnotatorQueue"/>
            <serializer method="xmi"/>
            <asyncAggregateErrorConfiguration>
              <getMetadataErrors maxRetries="0" timeout="0" errorAction="disable"/>
              <processCasErrors maxRetries="0" timeout="0" continueOnRetryFailure="false" thresholdCount="1" thresholdWindow="0" thresholdAction="terminate"/>
              <collectionProcessCompleteErrors timeout="0" additionalErrorAction="terminate"/>
            </asyncAggregateErrorConfiguration>
          </remoteAnalysisEngine>

	    </delegates>
        <asyncPrimitiveErrorConfiguration>
          <processCasErrors thresholdCount="0" thresholdWindow="0" thresholdAction="terminate"/>
          <collectionProcessCompleteErrors timeout="0" additionalErrorAction="terminate"/>
        </asyncPrimitiveErrorConfiguration>
      </analysisEngine>
    </service>
  </deployment>
</analysisEngineDeploymentDescription>
