diff --git a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java
new file mode 100644
index 0000000..06c597f
--- /dev/null
+++ b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.skywalking.oal.tool.output;
+
+import java.util.LinkedList;
+import java.util.List;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oal.tool.parser.AnalysisResult;
+
+@Getter(AccessLevel.PUBLIC)
+@Setter(AccessLevel.PUBLIC)
+public class DispatcherContext {
+    private List<AnalysisResult> serviceIndicators = new LinkedList<>();
+    private List<AnalysisResult> serviceInstanceIndicators = new LinkedList<>();
+    private List<AnalysisResult> endpointIndicators = new LinkedList<>();
+
+
+}
diff --git a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
index a8dbc1e..7d0fdc6 100644
--- a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
+++ b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
@@ -19,22 +19,19 @@
 package org.apache.skywalking.oal.tool.output;
 
 import freemarker.template.Configuration;
-import freemarker.template.Template;
 import freemarker.template.TemplateException;
 import freemarker.template.Version;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.io.Writer;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import org.apache.skywalking.oal.tool.parser.AnalysisResult;
 
 public class FileGenerator {
     private List<AnalysisResult> results;
     private String outputPath;
     private Configuration configuration;
+    private DispatcherContext dispatcherContext;
 
     public FileGenerator(List<AnalysisResult> results, String outputPath) {
         this.results = results;
@@ -42,6 +39,7 @@
         configuration = new Configuration(new Version("2.3.28"));
         configuration.setEncoding(Locale.ENGLISH, "UTF-8");
         configuration.setClassLoaderForTemplateLoading(FileGenerator.class.getClassLoader(), "/code-templates");
+        this.toDispatchers();
     }
 
     public void generate() {
@@ -63,4 +61,28 @@
     void generateIndicatorImplementor(AnalysisResult result, Writer output) throws IOException, TemplateException {
         configuration.getTemplate("IndicatorImplementor.ftl").process(result, output);
     }
+
+    void generateServiceDispatcher(Writer output) throws IOException, TemplateException {
+        configuration.getTemplate("ServiceDispatcherTemplate.ftl").process(dispatcherContext, output);
+    }
+
+    private void toDispatchers() {
+        dispatcherContext = new DispatcherContext();
+        for (AnalysisResult result : results) {
+            String sourceName = result.getSourceName();
+            switch (sourceName) {
+                case "Service":
+                    dispatcherContext.getServiceIndicators().add(result);
+                    break;
+                case "Endpoint":
+                    dispatcherContext.getServiceInstanceIndicators().add(result);
+                    break;
+                case "ServiceInstance":
+                    dispatcherContext.getEndpointIndicators().add(result);
+                    break;
+                default:
+
+            }
+        }
+    }
 }
diff --git a/oal-parser/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl b/oal-parser/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl
new file mode 100644
index 0000000..66be8b6
--- /dev/null
+++ b/oal-parser/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.skywalking.oap.server.core.analysis.generated;
+
+import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.define.WorkerMapper;
+import org.apache.skywalking.oap.server.core.source.Endpoint;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class ServiceDispatcher implements SourceDispatcher<Service> {
+
+    private final ModuleManager moduleManager;
+<#list serviceIndicators as indicator>
+    private ${indicator.metricName}AggregateWorker ${indicator.metricName};
+</#list>
+
+    public ServiceDispatcher(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    @Override public void dispatch(Service source) {
+<#list serviceIndicators as indicator>
+        do${indicator.metricName}(source);
+</#list>
+    }
+
+<#list serviceIndicators as indicator>
+    private void do${indicator.metricName}(Service source) {
+        if (avgAggregator == null) {
+            WorkerMapper workerMapper = moduleManager.find(CoreModule.NAME).getService(WorkerMapper.class);
+            avgAggregator = (${indicator.metricName}AggregateWorker)workerMapper.findInstanceByClass(${indicator.metricName}AggregateWorker.class);
+        }
+
+        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
+
+        indicator.setTimeBucket(source.getTimeBucket());
+    <#list indicator.fieldsFromSource as field>
+        indicator.${field.fieldSetter}(source.${field.fieldGetter}())
+    </#list>
+        indicator.${indicator.entryMethod.methodName}(
+            <#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
+        avgAggregator.in(indicator);
+    }
+</#list>
+}
diff --git a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
index 3761f7a..9cd522b 100644
--- a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
+++ b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
@@ -26,6 +26,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import org.apache.skywalking.oal.tool.parser.AnalysisResult;
+import org.apache.skywalking.oal.tool.parser.EntryMethod;
 import org.apache.skywalking.oal.tool.parser.SourceColumnsFactory;
 import org.apache.skywalking.oap.server.core.remote.selector.Selector;
 import org.junit.Assert;
@@ -42,6 +43,12 @@
         result.setRemoteSelector(Selector.HashCode);
         result.setNeedMerge(true);
         result.setIndicatorClassName("AvgIndicator");
+        EntryMethod method = new EntryMethod();
+        method.setMethodName("combine");
+        method.setArgsExpressions(new LinkedList<>());
+        method.getArgsExpressions().add("source.getLatency()");
+        method.getArgsExpressions().add("1");
+        result.setEntryMethod(method);
         result.addPersistentField("summation", "summation", long.class);
         result.addPersistentField("count", "count", int.class);
         result.addPersistentField("value", "value", long.class);
@@ -112,6 +119,21 @@
         //fileGenerator.generateIndicatorImplementor(result, new OutputStreamWriter(System.out));
     }
 
+    @Test
+    public void testServiceDispatcher() throws IOException, TemplateException {
+        AnalysisResult result = buildResult();
+
+        List<AnalysisResult> results = new LinkedList<>();
+        results.add(result);
+
+        FileGenerator fileGenerator = new FileGenerator(results, ".");
+        StringWriter writer = new StringWriter();
+        fileGenerator.generateServiceDispatcher(writer);
+        Assert.assertEquals(readExpectedFile("ServiceDispatcherExpected.java"), writer.toString());
+
+        //fileGenerator.generateServiceDispatcher(new OutputStreamWriter(System.out));
+    }
+
     private String readExpectedFile(String filename) throws IOException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(FileGenerator.class.getResourceAsStream("/expectedFiles/" + filename)));
 
diff --git a/oal-parser/src/test/resources/expectedFiles/ServiceDispatcherExpected.java b/oal-parser/src/test/resources/expectedFiles/ServiceDispatcherExpected.java
new file mode 100644
index 0000000..199d40a
--- /dev/null
+++ b/oal-parser/src/test/resources/expectedFiles/ServiceDispatcherExpected.java
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.skywalking.oap.server.core.analysis.generated;
+
+import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.define.WorkerMapper;
+import org.apache.skywalking.oap.server.core.source.Endpoint;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class ServiceDispatcher implements SourceDispatcher<Service> {
+
+    private final ModuleManager moduleManager;
+    private ServiceAvgAggregateWorker ServiceAvg;
+
+    public ServiceDispatcher(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    @Override public void dispatch(Service source) {
+        doServiceAvg(source);
+    }
+
+    private void doServiceAvg(Service source) {
+        if (avgAggregator == null) {
+            WorkerMapper workerMapper = moduleManager.find(CoreModule.NAME).getService(WorkerMapper.class);
+            avgAggregator = (ServiceAvgAggregateWorker)workerMapper.findInstanceByClass(ServiceAvgAggregateWorker.class);
+        }
+
+        ServiceAvgIndicator indicator = new ServiceAvgIndicator();
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.setId(source.getId())
+        indicator.setServiceId(source.getServiceId())
+        indicator.setServiceInstanceId(source.getServiceInstanceId())
+        indicator.combine(
+            source.getLatency(), 1);
+        avgAggregator.in(indicator);
+    }
+}
\ No newline at end of file
