/*
* Copyright 2016 ANI Technologies Pvt. Ltd.
*
* Licensed 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 com.olacabs.fabric.compute.pipelined;
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.SharedMetricRegistries;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.olacabs.fabric.compute.builder.Linker;
import com.olacabs.fabric.compute.builder.impl.RegisteringLoader;
import com.olacabs.fabric.compute.pipeline.ComputationPipeline;
import com.olacabs.fabric.model.common.ComponentMetadata;
import com.olacabs.fabric.model.common.ComponentType;
import com.olacabs.fabric.model.computation.ComponentInstance;
import com.olacabs.fabric.model.computation.ComputationSpec;
import com.olacabs.fabric.model.computation.Connection;
import org.junit.Test;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* doc.
*/
public class ComuptationPipelineTest {
@Test
public void testCheck() throws Exception {
Properties properties = new Properties();
properties.put("processor.counter_1.triggering_frequency", "1000");
properties.put("processor.summer_1.triggering_frequency", "1000");
properties.put("computation.shutdown.wait_time_in_seconds", "1");
properties.put("computation.channel.channel_type", " disruptor");
properties.put("computation.disruptor.buffer_size", "64");
properties.put("computation.disruptor.wait_strategy", "Yield ");
final String sourceId = "source_1";
final String pid1 = "summer_1";
final String pid2 = "counter_1";
final String pid3 = "printer_1";
RegisteringLoader loader = RegisteringLoader.builder()
.source("memory", new MemoryBasedPipelineStreamPipelineSource())
.stage("printer", new PrinterStreamingProcessor())
.stage("summer", new SummingProcessor())
.stage("counter", new CountingProcessor())
.build();
ComputationSpec spec = ComputationSpec.builder()
.name("test-pipeline")
.source(
ComponentInstance.builder()
.id(sourceId)
.meta(
ComponentMetadata.builder()
.type(ComponentType.SOURCE)
.id(sourceId)
.name("memory")
.build())
.build())
.processor(
ComponentInstance.builder()
.id(pid1)
.meta(
ComponentMetadata.builder()
.type(ComponentType.PROCESSOR)
.id(pid1)
.name("summer")
.build())
.build())
.processor(
ComponentInstance.builder()
.id(pid2)
.meta(
ComponentMetadata.builder()
.type(ComponentType.PROCESSOR)
.id(pid2)
.name("counter")
.build())
.build())
.processor(ComponentInstance.builder()
.id(pid3)
.meta(
ComponentMetadata.builder()
.type(ComponentType.PROCESSOR)
.id(pid3)
.name("printer")
.build())
.build())
.connection(Connection.builder().fromType(ComponentType.SOURCE).from(sourceId).to(pid1).build())
.connection(Connection.builder().fromType(ComponentType.SOURCE).from(sourceId).to(pid2).build())
.connection(Connection.builder().fromType(ComponentType.SOURCE).from(sourceId).to(pid3).build())
.connection(Connection.builder().fromType(ComponentType.PROCESSOR).from(pid1).to(pid3).build())
.connection(Connection.builder().fromType(ComponentType.PROCESSOR).from(pid2).to(pid3).build())
.properties(properties)
.build();
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(spec));
Linker linker = new Linker(loader);
ComputationPipeline pipeline = linker.build(spec);
pipeline.initialize(properties);
ExecutorService executor = Executors.newSingleThreadExecutor();
ConsoleReporter reporter = ConsoleReporter.forRegistry(SharedMetricRegistries.getOrCreate("metrics-registry"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
executor.submit(pipeline::start);
Thread.sleep(2000);
pipeline.stop();
reporter.stop();
executor.shutdownNow();
}
}