001/* 002# Licensed Materials - Property of IBM 003# Copyright IBM Corp. 2020 004 */ 005package simple; 006 007import java.util.Arrays; 008import java.util.Random; 009import java.util.List; 010import java.util.concurrent.TimeUnit; 011import com.ibm.streamsx.topology.TStream; 012import com.ibm.streamsx.topology.Topology; 013import com.ibm.streamsx.topology.context.StreamsContextFactory; 014import com.ibm.streamsx.topology.function.Function; 015import com.ibm.streamsx.topology.function.Supplier; 016import com.ibm.streamsx.topology.TWindow; 017 018/** 019 * Sample topology application. This Java application builds a 020 * simple topology that demonstrates the usage of submission time parameter for time based window. <BR> 021 * The application implements the typical pattern of code that declares a 022 * topology followed by submission of the topology to a Streams context 023 * {@code com.ibm.streamsx.topology.context.StreamsContext}. 024 * <BR> 025 * This demonstrates the mechanics of declaring a topology with submission time parameter and executing it. 026 * <P> 027 * This may be executed from the {@code samples/java/functional} directory as: 028 * <UL> 029 * <LI>{@code ant run.temperaturesensor} - Using Apache Ant, this will run in standalone 030 * mode.</LI> 031 * <LI>{@code ant run.temperaturesensor.bundle} - Using Apache Ant, this will create the bundle only.</LI> 032 * <LI> 033 * {@code java -jar funcsamples.jar:../com.ibm.streamsx.topology/lib/com.ibm.streamsx.topology.jar:$STREAMS_INSTALL/lib/com.ibm.streams.operator.samples.jar 034 * simple.TemperatureSensor [CONTEXT_TYPE] 035 * } - Run directly from the command line. 036 * </LI> 037 * If no arguments are provided then the topology is executed in bundle mode. 038 * <BR> 039 * <i>CONTEXT_TYPE</i> is one of: 040 * <UL> 041 * <LI>{@code DISTRIBUTED} - Run as an IBM Streams distributed 042 * application.</LI> 043 * <LI>{@code STANDALONE} - Run as an IBM Streams standalone 044 * application.</LI> 045 * <LI>{@code BUNDLE} - Create an IBM Streams application bundle.</LI> 046 * <LI>{@code TOOLKIT} - Create an IBM Streams application toolkit.</LI> 047 * </UL> 048 * </LI> 049 * <LI> 050 * An application execution within your IDE once you set the class path to include the correct jars.</LI> 051 * </UL> 052 * </P> 053 */ 054public class TemperatureSensor { 055 056 /** 057 * Sample topology application. 058 * This Java application builds a simple topology 059 * that demonstrates the usage of submission time parameter for time based window 060 * and finally prints the aggregates values to standard output. 061 * <BR> 062 * The application implements the typical pattern 063 * of code that declares a topology followed by 064 * submission of the topology to a Streams context 065 * (@code com.ibm.streamsx.topology.context.StreamsContext}. 066 067 * @param args 068 * @throws Exception 069 */ 070 public static void main(String[] args) throws Exception { 071 072 /* 073 * Create the container for the topology that will 074 * hold the streams of tuples. 075 */ 076 Topology topology = new Topology("TemperatureSensor"); 077 078 Random random = new Random(); 079 080 @SuppressWarnings("unchecked") 081 TStream<Double> readings = topology.endlessSource(new Supplier<Double>(){ 082 @Override 083 public Double get() { 084 return random.nextGaussian(); 085 } 086 087 }); 088 089 Supplier<Integer> time = topology.createSubmissionParameter("time", 5); 090 TWindow<Double, ?> lastNSeconds = readings.lastSeconds(time); 091 092 TStream<Double> maxTemp = lastNSeconds.aggregate(new Function<List<Double>, Double>(){ 093 @Override 094 public Double apply(List<Double> temps) { 095 Double max = temps.get(0); 096 for(Double temp : temps){ 097 if(temp > max) 098 max = temp; 099 } 100 return max; 101 } 102 103 }); 104 maxTemp.print(); 105 106 if (args.length == 0) 107 StreamsContextFactory.getStreamsContext("BUNDLE").submit(topology).get(); 108 else 109 StreamsContextFactory.getStreamsContext(args[0]).submit(topology) 110 .get(); 111 } 112}