├── Dockerfile-connector ├── Dockerfile-producer ├── README.md ├── connector-config.json ├── docker-compose.yml └── producer ├── pom.xml └── src └── main ├── java └── json │ ├── JsonProducer.java │ ├── ticks │ ├── TickData.java │ └── TickGenerator.java │ └── utils │ └── ExchangeUtils.java └── resources ├── json └── csv │ └── exchangedata.csv └── log4j2.xml /Dockerfile-connector: -------------------------------------------------------------------------------- 1 | FROM confluentinc/cp-kafka-connect-base:5.3.0 2 | RUN curl -O -L "https://downloads.datastax.com/kafka/kafka-connect-cassandra-sink.tar.gz" \ 3 | && mkdir datastax-connector \ 4 | && tar xzf kafka-connect-cassandra-sink.tar.gz -C datastax-connector --strip-components=1 \ 5 | && mv datastax-connector/kafka-connect* datastax-connector/kafka-connect-cassandra.jar 6 | ENV CONNECT_PLUGIN_PATH="/usr/share/java,/datastax-connector/kafka-connect-cassandra.jar" 7 | -------------------------------------------------------------------------------- /Dockerfile-producer: -------------------------------------------------------------------------------- 1 | # Alpine Linux with OpenJDK JRE 2 | FROM openjdk:8u171-jdk-slim-stretch 3 | 4 | RUN apt-get update \ 5 | && apt-get install -y maven 6 | 7 | RUN mkdir producer 8 | 9 | COPY producer producer/ 10 | 11 | WORKDIR producer 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ingest JSON from Kafka to Cassandra 2 | This example shows how to ingest JSON records from [Kafka](https://kafka.apache.org/) to multiple tables in the [Cassandra](https://cassandra.apache.org/) database using the [DataStax Apache Kafka Connector](https://docs.datastax.com/en/kafka/doc/index.html). 3 | 4 | Contributor(s): [Chris Splinter](https://github.com/csplinter), [Tomasz Lelek](https://github.com/tomekl007) 5 | 6 | Have Questions? We're here to help: https://community.datastax.com/ 7 | 8 | Want to learn more about the DataStax Kafka Connector? Take a free, [short course on DataStax Academy](https://academy.datastax.com/resources/getting-started-datastax-apache-kafka%E2%84%A2-connector) 9 | 10 | Looking for a fully-managed service built on Apache Cassandra? Try DataStax Astra for free: https://astra.datastax.com/ 11 | 12 | ## Objectives 13 | - How to ingest JSON records from Kafka to Cassandra databases 14 | - How to use docker and docker-compose to quickly set up an environment with Zookeeper, Kafka Brokers, Kafka Connect and Cassandra 15 | 16 | ## Project Layout 17 | - [Dockerfile-connector](Dockerfile-connector): Dockerfile to build an image of Kafka Connect with the DataStax Kafka Connector installed. 18 | - [Dockerfile-producer](Dockerfile-producer): Dockerfile to build an image for the producer contained in this repository. 19 | - [docker-compose.yml](docker-compose.yml): Uses [Confluent](https://www.confluent.io/) and Cassandra docker images to set up Zookeeper, Kafka Brokers, Kafka Connect, Apache Cassandra, and the producer container. 20 | - [connector-config.json](connector-config.json): Configuration file for the DataStax Kafka Connector to be used with the distributed Kafka Connect Worker. 21 | - [producer](producer/): Contains the Kafka Java Producer to write records to Kafka. Uses the StringSerializer for the Kafka record key and the JsonSerializer for the Kafka record value. 22 | 23 | ## How this works 24 | After running the docker and docker-compose commands, there will be 5 docker containers running, all using the same docker network. 25 | 26 | After writing records to the Kafka Brokers, the DataStax Kafka Connector will be started which will start the stream of records from Kafka to the Cassandra database, writing a single record to three different tables in the database, showing how to achieve the common Cassandra pattern of denormalization with the connector. 27 | 28 | ## Setup & Running 29 | ### Prerequisites 30 | - Docker: https://docs.docker.com/v17.09/engine/installation/ 31 | - Docker Compose: https://docs.docker.com/compose/install/ 32 | 33 | ### Setup 34 | Clone this repository 35 | ``` 36 | git clone https://github.com/DataStax-Examples/kafka-connector-sink-json.git 37 | ``` 38 | 39 | Go to the directory 40 | ``` 41 | cd kafka-connector-sink-json 42 | ``` 43 | 44 | Build the DataStax Kafka Connector image 45 | ``` 46 | docker build --no-cache -t datastax-connect -f Dockerfile-connector . 47 | ``` 48 | 49 | Build the JSON Java Producer image 50 | ``` 51 | docker build . -t kafka-producer -f Dockerfile-producer 52 | ``` 53 | 54 | Start Zookeeper, Kafka Brokers, Kafka Connect, Cassandra, and the producer containers 55 | ``` 56 | docker-compose up -d 57 | ``` 58 | 59 | ### Running 60 | Now that everything is up and running, it's time to set up the flow of data from Kafka to Cassandra. 61 | 62 | #### Create the Kafka topic 63 | Start a bash shell on the Kafka Broker 64 | ``` 65 | docker exec -it kafka-broker bash 66 | ``` 67 | Create the topic 68 | ``` 69 | kafka-topics --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 10 --topic json-stream --config retention.ms=-1 70 | ``` 71 | 72 | #### Create the Cassandra tables 73 | Start a cqlsh shell on the Cassandra node 74 | ``` 75 | docker exec -it cassandra cqlsh 76 | ``` 77 | Create the tables that the connector will write to. Note that a single instance of the connector can write Kafka records to multiple tables. 78 | ``` 79 | create keyspace if not exists kafka_examples with replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; 80 | create table if not exists kafka_examples.stocks_table_by_symbol (symbol text, datetime timestamp, exchange text, industry text, name text, value double, PRIMARY KEY (symbol, datetime)); 81 | create table if not exists kafka_examples.stocks_table_by_exchange (symbol text, datetime timestamp, exchange text, industry text, name text, value double, PRIMARY KEY (exchange, datetime)); 82 | create table if not exists kafka_examples.stocks_table_by_industry (symbol text, datetime timestamp, exchange text, industry text, name text, value double, PRIMARY KEY (industry, datetime)); 83 | ``` 84 | 85 | #### Load data into Kafka 86 | Start a bash shell on the Kafka Producer 87 | ``` 88 | docker exec -it kafka-producer bash 89 | ``` 90 | Write 1000 records ( 10 stocks, 100 records per stock ) to Kafka using the JSON Java Producer in this project 91 | ``` 92 | mvn clean compile exec:java -Dexec.mainClass=json.JsonProducer -Dexec.args="json-stream 10 100 broker:29092" 93 | ``` 94 | There will be many lines of output in your console as Maven pulls down the dependencies. The following output means that it completed successfully 95 | ``` 96 | 2020-03-09 18:01:34.268 [json.JsonProducer.main()] INFO - Completed loading 1000/1000 records to Kafka in 1 seconds 97 | [INFO] ------------------------------------------------------------------------ 98 | [INFO] BUILD SUCCESS 99 | [INFO] ------------------------------------------------------------------------ 100 | [INFO] Total time: 20.254 s 101 | [INFO] Finished at: 2020-03-09T18:01:34+00:00 102 | [INFO] Final Memory: 31M/215M 103 | [INFO] ------------------------------------------------------------------------ 104 | ``` 105 | 106 | #### Start the DataStax Kafka Connector 107 | Execute the following command from the machine where docker is running to start the connector using the Kafka Connect REST API 108 | ``` 109 | curl -X POST -H "Content-Type: application/json" -d @connector-config.json "http://localhost:8083/connectors" 110 | ``` 111 | 112 | #### Confirm rows written to Cassandra 113 | Start a cqlsh shell on the Cassandra node 114 | ``` 115 | docker exec -it cassandra cqlsh 116 | ``` 117 | 118 | Confirm rows were written to each of the Cassandra tables 119 | ``` 120 | select * from kafka_examples.stocks_table_by_symbol limit 10; 121 | ``` 122 | ``` 123 | symbol | datetime | exchange | industry | name | value 124 | --------+---------------------------------+----------+----------+-------------+---------- 125 | XOM | 2020-03-09 18:27:07.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 79.53462 126 | XOM | 2020-03-09 18:27:17.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 79.94343 127 | XOM | 2020-03-09 18:27:27.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 79.46183 128 | XOM | 2020-03-09 18:27:37.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.1765 129 | XOM | 2020-03-09 18:27:47.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.44787 130 | XOM | 2020-03-09 18:27:57.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 79.9512 131 | XOM | 2020-03-09 18:28:07.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.08623 132 | XOM | 2020-03-09 18:28:17.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.42811 133 | XOM | 2020-03-09 18:28:27.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.22866 134 | XOM | 2020-03-09 18:28:37.289000+0000 | NYSE | ENERGY | EXXON MOBIL | 80.00116 135 | 136 | (10 rows) 137 | ``` 138 | ``` 139 | select * from kafka_examples.stocks_table_by_exchange limit 10; 140 | ``` 141 | ``` 142 | exchange | datetime | industry | name | symbol | value 143 | ----------+---------------------------------+----------+-------+--------+----------- 144 | NASDAQ | 2020-03-09 18:27:06.289000+0000 | TECH | APPLE | APPL | 208.25739 145 | NASDAQ | 2020-03-09 18:27:16.289000+0000 | TECH | APPLE | APPL | 208.39239 146 | NASDAQ | 2020-03-09 18:27:26.289000+0000 | TECH | APPLE | APPL | 208.26644 147 | NASDAQ | 2020-03-09 18:27:36.289000+0000 | TECH | APPLE | APPL | 207.48437 148 | NASDAQ | 2020-03-09 18:27:46.289000+0000 | TECH | APPLE | APPL | 207.42801 149 | NASDAQ | 2020-03-09 18:27:56.289000+0000 | TECH | APPLE | APPL | 207.62685 150 | NASDAQ | 2020-03-09 18:28:06.289000+0000 | TECH | APPLE | APPL | 207.62004 151 | NASDAQ | 2020-03-09 18:28:16.289000+0000 | TECH | APPLE | APPL | 206.49582 152 | NASDAQ | 2020-03-09 18:28:26.289000+0000 | TECH | APPLE | APPL | 206.21018 153 | NASDAQ | 2020-03-09 18:28:36.289000+0000 | TECH | APPLE | APPL | 205.53896 154 | 155 | (10 rows) 156 | ``` 157 | ``` 158 | select * from kafka_examples.stocks_table_by_industry limit 10; 159 | ``` 160 | ``` 161 | industry | datetime | exchange | name | symbol | value 162 | ----------+---------------------------------+----------+---------+--------+---------- 163 | RETAIL | 2020-03-09 18:27:04.289000+0000 | NYSE | WALMART | WMT | 89.45163 164 | RETAIL | 2020-03-09 18:27:14.289000+0000 | NYSE | WALMART | WMT | 89.36504 165 | RETAIL | 2020-03-09 18:27:24.289000+0000 | NYSE | WALMART | WMT | 89.24324 166 | RETAIL | 2020-03-09 18:27:34.289000+0000 | NYSE | WALMART | WMT | 89.83376 167 | RETAIL | 2020-03-09 18:27:44.289000+0000 | NYSE | WALMART | WMT | 90.1238 168 | RETAIL | 2020-03-09 18:27:54.289000+0000 | NYSE | WALMART | WMT | 89.5875 169 | RETAIL | 2020-03-09 18:28:04.289000+0000 | NYSE | WALMART | WMT | 90.08323 170 | RETAIL | 2020-03-09 18:28:14.289000+0000 | NYSE | WALMART | WMT | 89.49746 171 | RETAIL | 2020-03-09 18:28:24.289000+0000 | NYSE | WALMART | WMT | 89.15786 172 | RETAIL | 2020-03-09 18:28:34.289000+0000 | NYSE | WALMART | WMT | 89.12892 173 | 174 | (10 rows) 175 | ``` 176 | -------------------------------------------------------------------------------- /connector-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "datastax-connector-json-multi-table-example", 3 | "config": { 4 | "connector.class": "com.datastax.oss.kafka.sink.CassandraSinkConnector", 5 | "tasks.max": "10", 6 | "topics": "json-stream", 7 | "contactPoints": "cassandra", 8 | "loadBalancing.localDc": "datacenter1", 9 | "topic.json-stream.kafka_examples.stocks_table_by_symbol.mapping": "symbol=value.symbol, datetime=value.datetime, exchange=value.exchange, industry=value.industry, name=key, value=value.value", 10 | "topic.json-stream.kafka_examples.stocks_table_by_exchange.mapping": "symbol=value.symbol, datetime=value.datetime, exchange=value.exchange, industry=value.industry, name=key, value=value.value", 11 | "topic.json-stream.kafka_examples.stocks_table_by_industry.mapping": "symbol=value.symbol, datetime=value.datetime, exchange=value.exchange, industry=value.industry, name=key, value=value.value", 12 | "topic.json-stream.kafka_examples.stocks_table_by_symbol.consistencyLevel": "LOCAL_QUORUM", 13 | "topic.json-stream.kafka_examples.stocks_table_by_exchange.consistencyLevel": "LOCAL_QUORUM", 14 | "topic.json-stream.kafka_examples.stocks_table_by_industry.consistencyLevel": "LOCAL_QUORUM" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '2' 3 | services: 4 | 5 | zookeeper: 6 | image: confluentinc/cp-zookeeper:latest 7 | container_name: zookeeper 8 | environment: 9 | ZOOKEEPER_CLIENT_PORT: 2181 10 | ZOOKEEPER_TICK_TIME: 2000 11 | 12 | broker: 13 | image: confluentinc/cp-kafka:latest 14 | container_name: kafka-broker 15 | depends_on: 16 | - zookeeper 17 | ports: 18 | - 9092:9092 19 | environment: 20 | KAFKA_BROKER_ID: 1 21 | KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 22 | KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092 23 | KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT 24 | KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT 25 | KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 26 | 27 | connect: 28 | image: datastax-connect:latest 29 | hostname: datastax-connect 30 | container_name: datastax-connect 31 | depends_on: 32 | - zookeeper 33 | - broker 34 | ports: 35 | - "8083:8083" 36 | environment: 37 | CONNECT_BOOTSTRAP_SERVERS: 'broker:29092' 38 | CONNECT_REST_ADVERTISED_HOST_NAME: datastax-connect 39 | CONNECT_REST_PORT: 8083 40 | CONNECT_GROUP_ID: datastax-connect-group 41 | CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs 42 | CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1 43 | CONNECT_OFFSET_FLUSH_INTERVAL_MS: 10000 44 | CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets 45 | CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1 46 | CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status 47 | CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1 48 | CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter 49 | CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter 50 | CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE: "false" 51 | CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter 52 | CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter 53 | CONNECT_ZOOKEEPER_CONNECT: 'zookeeper:2181' 54 | 55 | cassandra: 56 | image: cassandra:3.11 57 | hostname: cassandra 58 | container_name: cassandra 59 | 60 | kafka-producer: 61 | image: kafka-producer:latest 62 | hostname: kafka-producer 63 | container_name: kafka-producer 64 | tty: true 65 | 66 | -------------------------------------------------------------------------------- /producer/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.datastax.examples 8 | kafka-connector-sink-json 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 13 | org.apache.maven.plugins 14 | maven-compiler-plugin 15 | 3.8.1 16 | 17 | 1.8 18 | 1.8 19 | 20 | 21 | 22 | 23 | 24 | 25 | 2.3.0 26 | 27 | 28 | 29 | 30 | 31 | org.apache.kafka 32 | kafka-clients 33 | ${kafkaVersion} 34 | 35 | 36 | 37 | 38 | org.apache.kafka 39 | connect-json 40 | ${kafkaVersion} 41 | 42 | 43 | 44 | org.apache.logging.log4j 45 | log4j-api 46 | 2.7 47 | 48 | 49 | 50 | org.apache.logging.log4j 51 | log4j-core 52 | 2.7 53 | 54 | 55 | 56 | org.apache.logging.log4j 57 | log4j-slf4j-impl 58 | 2.7 59 | 60 | 61 | 62 | com.opencsv 63 | opencsv 64 | 3.10 65 | 66 | 67 | 68 | joda-time 69 | joda-time 70 | 2.9.9 71 | 72 | 73 | 74 | org.apache.commons 75 | commons-lang3 76 | 3.8.1 77 | 78 | 79 | 80 | com.google.guava 81 | guava 82 | 27.0-jre 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /producer/src/main/java/json/JsonProducer.java: -------------------------------------------------------------------------------- 1 | package json; 2 | 3 | import json.utils.ExchangeUtils; 4 | import json.ticks.TickData; 5 | import json.ticks.TickGenerator; 6 | 7 | import com.fasterxml.jackson.databind.JsonNode; 8 | import com.fasterxml.jackson.databind.ObjectMapper; 9 | 10 | import org.apache.kafka.clients.producer.Callback; 11 | import org.apache.kafka.clients.producer.KafkaProducer; 12 | import org.apache.kafka.clients.producer.ProducerConfig; 13 | import org.apache.kafka.clients.producer.ProducerRecord; 14 | import org.apache.kafka.common.serialization.StringSerializer; 15 | import org.apache.kafka.connect.json.JsonSerializer; 16 | 17 | import org.slf4j.Logger; 18 | import org.slf4j.LoggerFactory; 19 | import java.time.Duration; 20 | import java.time.Instant; 21 | import java.util.Properties; 22 | import java.util.concurrent.CountDownLatch; 23 | import java.util.concurrent.Executors; 24 | import java.util.concurrent.ScheduledExecutorService; 25 | import java.util.concurrent.TimeUnit; 26 | import java.util.concurrent.atomic.AtomicLong; 27 | 28 | 29 | public class JsonProducer { 30 | 31 | // Report number of records sent every this many seconds. 32 | private static final long PROGRESS_REPORTING_INTERVAL = 5; 33 | 34 | private static Logger log = LoggerFactory.getLogger("JsonProducer"); 35 | 36 | public static void main(String[] args) throws InterruptedException { 37 | 38 | String TOPIC = "json-stream"; 39 | int RECORDS_PER_STOCK = 2_000_000; 40 | int NUMBER_OF_STOCKS = 500; 41 | String BOOTSTRAP_SERVERS = "localhost:9092"; 42 | 43 | if (args.length == 1) { 44 | TOPIC = args[0]; 45 | } 46 | else if (args.length == 2){ 47 | TOPIC = args[0]; 48 | NUMBER_OF_STOCKS = Integer.parseInt(args[1]); 49 | } 50 | else if (args.length == 3){ 51 | TOPIC = args[0]; 52 | NUMBER_OF_STOCKS = Integer.parseInt(args[1]); 53 | RECORDS_PER_STOCK = Integer.parseInt(args[2]); 54 | } 55 | else if (args.length == 4){ 56 | TOPIC = args[0]; 57 | NUMBER_OF_STOCKS = Integer.parseInt(args[1]); 58 | RECORDS_PER_STOCK = Integer.parseInt(args[2]); 59 | BOOTSTRAP_SERVERS = args[3]; 60 | } 61 | 62 | log.info("Topic Name: {}, Number of Stocks: {}, Records per Stock: {}, Bootstrap Servers: {}", 63 | TOPIC, NUMBER_OF_STOCKS, RECORDS_PER_STOCK, BOOTSTRAP_SERVERS); 64 | 65 | Properties props = new Properties(); 66 | props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); 67 | props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); 68 | props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class.getName()); 69 | props.put(ProducerConfig.ACKS_CONFIG, "1"); 70 | 71 | // Start a timer to measure how long this run takes overall. 72 | Instant start = Instant.now(); 73 | 74 | final KafkaProducer producer = new KafkaProducer<>(props); 75 | Runtime.getRuntime().addShutdownHook(new Thread(producer::close, "Shutdown-thread")); 76 | 77 | TickGenerator generator = new TickGenerator(ExchangeUtils.getExchangeData()); 78 | 79 | // Calculate the total number of records we expect to generate, an object 80 | // to keep track of the number of errors we encounter, and a latch that 81 | // will be signalled every time a "send" completes. This latch allows us 82 | // to wait for all sends to complete before terminating the program. 83 | int totalRecords = RECORDS_PER_STOCK * NUMBER_OF_STOCKS; 84 | AtomicLong errorCount = new AtomicLong(); 85 | CountDownLatch requestLatch = new CountDownLatch(totalRecords); 86 | 87 | // Create a counter to track the number of records we've successfully 88 | // created so far. 89 | final AtomicLong successCount = new AtomicLong(); 90 | 91 | // This callback will be invoked whenever a send completes. It reports any 92 | // errors (and bumps the error-count) and signals the latch as described above. 93 | Callback postSender = (recordMetadata, e) -> { 94 | if (e != null) { 95 | log.error("Error adding to topic", e); 96 | errorCount.incrementAndGet(); 97 | } else { 98 | successCount.incrementAndGet(); 99 | } 100 | requestLatch.countDown(); 101 | }; 102 | 103 | ObjectMapper mapper = new ObjectMapper(); 104 | 105 | ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 106 | scheduler.scheduleAtFixedRate( 107 | ()->log.info("Successfully created {} Kafka records", successCount.get()), 108 | 2, PROGRESS_REPORTING_INTERVAL, TimeUnit.SECONDS); 109 | 110 | for (int j = 0; j < RECORDS_PER_STOCK; j++) { 111 | for (int i = 0; i < NUMBER_OF_STOCKS; i++) { 112 | TickData tickData = generator.getStockWithRandomValue(i); 113 | tickData.setDatetime(); 114 | producer.send(new ProducerRecord<>(TOPIC, tickData.getName(), mapper.valueToTree(tickData)), postSender); 115 | } 116 | } 117 | 118 | // Wait for sends to complete. 119 | requestLatch.await(); 120 | 121 | // Stop the thread that periodically reports progress. 122 | scheduler.shutdown(); 123 | producer.close(); 124 | long duration = Duration.between(start, Instant.now()).getSeconds(); 125 | log.info("Completed loading {}/{} records to Kafka in {} seconds", 126 | totalRecords - errorCount.get(), totalRecords, duration); 127 | } 128 | } 129 | 130 | -------------------------------------------------------------------------------- /producer/src/main/java/json/ticks/TickData.java: -------------------------------------------------------------------------------- 1 | package json.ticks; 2 | 3 | import java.time.LocalDateTime; 4 | import java.time.temporal.ChronoUnit; 5 | import java.util.concurrent.atomic.AtomicLong; 6 | 7 | public class TickData { 8 | private static final LocalDateTime BASE_TIME = LocalDateTime.now(); 9 | private static final AtomicLong TIME_OFFSET = new AtomicLong(); 10 | 11 | private String name; 12 | private String symbol; 13 | private double value; 14 | private String exchange; 15 | private String industry; 16 | private String datetime; 17 | 18 | public TickData(String name, String symbol, double value, String exchange, String industry) { 19 | this.name = name; 20 | this.symbol = symbol; 21 | this.value = value; 22 | this.exchange = exchange; 23 | this.industry = industry; 24 | this.datetime = BASE_TIME.plus(TIME_OFFSET.incrementAndGet(), ChronoUnit.SECONDS).toString(); 25 | } 26 | 27 | public String getName() { 28 | return name; 29 | } 30 | 31 | public String getSymbol() { 32 | return symbol; 33 | } 34 | 35 | public double getValue() { 36 | return value; 37 | } 38 | 39 | public String getExchange() { 40 | return exchange; 41 | } 42 | 43 | public String getIndustry() { 44 | return industry; 45 | } 46 | 47 | public String getDatetime() { 48 | return datetime; 49 | } 50 | 51 | public void setDatetime(){ 52 | this.datetime = BASE_TIME.plus(TIME_OFFSET.incrementAndGet(), ChronoUnit.SECONDS).toString(); 53 | } 54 | 55 | public void setValue(double v){ 56 | this.value = v; 57 | } 58 | 59 | @Override 60 | public String toString() { 61 | return "TickData [" + 62 | "name=" + name + ", " + 63 | "symbol=" + symbol + ", " + 64 | "value=" + value + ", " + 65 | "exchange=" + exchange + ", " + 66 | "industry=" + industry +"]"; 67 | } 68 | 69 | } 70 | 71 | -------------------------------------------------------------------------------- /producer/src/main/java/json/ticks/TickGenerator.java: -------------------------------------------------------------------------------- 1 | package json.ticks; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | public class TickGenerator { 10 | 11 | static final Logger log = LoggerFactory.getLogger("TickGenerator"); 12 | 13 | private long TOTAL_TICKS = 0; 14 | 15 | private final List stocksList; 16 | 17 | public TickGenerator(List stocks) { 18 | this.stocksList = stocks; 19 | } 20 | 21 | public long getTicksGenerated(){ 22 | return TOTAL_TICKS; 23 | } 24 | 25 | 26 | public TickValue getTickValueRandom(int i) { 27 | TickData thisStock = stocksList.get(i); 28 | TickValue tickValue = new TickValue(thisStock.getName(), thisStock.getValue()); 29 | tickValue.value = this.createRandomValue(tickValue.value); 30 | return tickValue; 31 | } 32 | 33 | public TickData getStockWithRandomValue(int i) { 34 | TickData thisStock = stocksList.get(i); 35 | thisStock.setValue(this.createRandomValue(thisStock.getValue())); 36 | return thisStock; 37 | } 38 | 39 | class TickValue implements Serializable { 40 | String tickSymbol; 41 | double value; 42 | 43 | public TickValue(String tickSymbol, double value) { 44 | super(); 45 | this.tickSymbol = tickSymbol; 46 | this.value = value; 47 | } 48 | } 49 | 50 | private double createRandomValue(double lastValue) { 51 | 52 | double up = Math.random() * 2; 53 | double percentMove = (Math.random() * 1.0) / 100; 54 | 55 | if (up < 1) { 56 | lastValue -= percentMove*lastValue; 57 | } else { 58 | lastValue += percentMove*lastValue; 59 | } 60 | 61 | return lastValue; 62 | } 63 | 64 | } 65 | 66 | -------------------------------------------------------------------------------- /producer/src/main/java/json/utils/ExchangeUtils.java: -------------------------------------------------------------------------------- 1 | package json.utils; 2 | 3 | import json.ticks.TickData; 4 | 5 | import com.opencsv.CSVReader; 6 | import com.opencsv.ICSVParser; 7 | import java.io.File; 8 | import java.io.FileFilter; 9 | import java.io.FileNotFoundException; 10 | import java.io.FileReader; 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import org.slf4j.Logger; 16 | import org.slf4j.LoggerFactory; 17 | 18 | public class ExchangeUtils { 19 | 20 | private static final Logger log = LoggerFactory.getLogger("ExchangeUtils"); 21 | 22 | private static final CharSequence EXCHANGEDATA = "exchangedata"; 23 | 24 | private static CSVReader getCSVReader(File file) throws IOException{ 25 | char quoteChar = ICSVParser.DEFAULT_QUOTE_CHARACTER; 26 | char delimiterChar = ICSVParser.DEFAULT_SEPARATOR; 27 | return new CSVReader(new FileReader(file.getAbsolutePath()), delimiterChar, quoteChar, 0); 28 | } 29 | 30 | private static List getAllFilesThatContain(File searchDir, String containsString){ 31 | List allFilesThatContain = new ArrayList<>(); 32 | 33 | File[] files = searchDir.listFiles(new FileFilter() { 34 | public boolean accept(File file) { 35 | return file.isFile(); 36 | } 37 | }); 38 | 39 | for (File file : files) { 40 | if (file.getName().contains(containsString)) { 41 | allFilesThatContain.add(file); 42 | } 43 | } 44 | 45 | return allFilesThatContain; 46 | } 47 | 48 | public static List getExchangeData() { 49 | 50 | List allStocks = new ArrayList<>(); 51 | 52 | // Process all the files from the csv directory 53 | File csvDir = new File(".", "src/main/resources/json/csv"); 54 | 55 | List files = getAllFilesThatContain(csvDir, EXCHANGEDATA.toString()); 56 | 57 | for (File file : files) { 58 | try { 59 | allStocks.addAll(getExchangeData(file)); 60 | } catch (FileNotFoundException e) { 61 | System.out.println("Could not process file : " + file.getAbsolutePath()); 62 | e.printStackTrace(); 63 | System.exit(1); 64 | } catch (IOException e) { 65 | System.out.println("Could not process file : " + file.getAbsolutePath()); 66 | e.printStackTrace(); 67 | System.exit(1); 68 | } catch (InterruptedException e) { 69 | e.printStackTrace(); 70 | System.exit(1); 71 | } 72 | } 73 | return allStocks; 74 | } 75 | 76 | private static List getExchangeData(File file) throws IOException, InterruptedException{ 77 | CSVReader reader = getCSVReader(file); 78 | 79 | String[] items; 80 | 81 | List stocksList = new ArrayList<>(); 82 | 83 | while ((items = reader.readNext()) != null) { 84 | stocksList.add(new TickData( 85 | items[0].trim(), 86 | items[1].trim(), 87 | Double.valueOf(items[2].trim()), 88 | items[3].trim(), 89 | items[4].trim())); 90 | } 91 | 92 | reader.close(); 93 | return stocksList; 94 | } 95 | } 96 | 97 | -------------------------------------------------------------------------------- /producer/src/main/resources/json/csv/exchangedata.csv: -------------------------------------------------------------------------------- 1 | WALMART,WMT,90,NYSE,RETAIL 2 | BERKSHIRE HATHAWAY,BRK.A,304671,NYSE,FINANCE 3 | APPLE,APPL,208,NASDAQ,TECH 4 | EXXON MOBIL,XOM,80,NYSE,ENERGY 5 | MCKESSON,MCK,126,NYSE,HEALTH 6 | UNITEDHEALTH GROUP,UNH,257,NYSE,HEALTH 7 | CVS HEALTH,CVS,65,NYSE,RETAIL PHARMA 8 | GENERAL MOTORS,GM,38,NYSE,AUTO 9 | AT&T,T,33,NYSE,TELECOM 10 | FORD MOTOR,F,10,NYSE,AUTO 11 | AMERISOURCEBERGEN,ABC,81,NYSE,PHARMA 12 | AMAZON.COM,AMZN,1823,NASDAQ,TECH 13 | GENERAL ELECTRIC,GE,13,NYSE,CONGLOMERATE 14 | VERIZON COMMUNICATIONS,VZ,52,NYSE,TELECOM 15 | CARDINAL HEALTH,CAH,50,NYSE,PHARMA 16 | COSTCO,COST,222,NASDAQ,RETAIL 17 | WALGREENS BOOTS ALLIANCE,WBA,67,NASDAQ,RETAIL PHARMA 18 | KROGER,KR,30,NYSE,GROCERY 19 | CHEVRON,CVX,124,NYSE,ENERGY 20 | FANNIE MAE,FNMA,2,OTCMKTS,FINANCE 21 | J.P. MORGAN CHASE,JPM,117,NYSE,FINANCE 22 | EXPRESS SCRIPTS HOLDING,ESRX,77,NASDAQ,HEALTH 23 | HOME DEPOT,HD,195,NYSE,RETAIL 24 | BOEING,BA,348,NYSE,TRANSPORTATION 25 | WELLS FARGO,WFC,59,NYSE,FINANCE 26 | BANK OF AMERICA CORP.,BAC,32,NYSE,FINANCE 27 | ALPHABET,GOOGL,1238,NASDAQ,TECH 28 | MICROSOFT,MSFT,108,NASDAQ,TECH 29 | ANTHEM,ANTM,257,NYSE,HEALTH 30 | CITIGROUP,C,72,NYSE,FINANCE 31 | COMCAST,CMCSA,35,NASDAQ,TELECOM 32 | IBM,IBM,147,NYSE,TECH 33 | STATE FARM INSURANCE COS.,STFGX,81,NASDAQ,INSURANCE 34 | PHILLIPS 66,PSX,121,NYSE,ENERGY 35 | JOHNSON & JOHNSON,JNJ,132,NYSE,PHARMA 36 | PROCTER & GAMBLE,PG,82,NYSE,RETAIL 37 | VALERO ENERGY,VLO,115,NYSE,ENERGY 38 | TARGET,TGT,81,NYSE,RETAIL 39 | FREDDIE MAC,FMCC,2,OTCMKTS,FINANCE 40 | LOWE'S,LOW,98,NYSE,RETAIL 41 | DELL TECHNOLOGIES,DVMT,93,NYSE,TECH 42 | METLIFE,MET,45,NYSE,FINANCE 43 | AETNA,AET,188,NYSE,HEALTH 44 | PEPSICO,PEP,116,NASDAQ,FOOD BEVERAGE 45 | ARCHER DANIELS MIDLAND,ADM,50,NYSE,FOOD BEVERAGE 46 | UPS,UPS,119,NYSE,COURIER 47 | INTEL,INTC,49,NASDAQ,TECH 48 | PRUDENTIAL FINANCIAL,PRU,99,NYSE,FINANCE 49 | ALBERTSONS COS.,ABS,24,NYSE,GROCERY 50 | UNITED TECHNOLOGIES,UTX,134,NYSE,TRANSPORTATION 51 | MARATHON PETROLEUM,MPC,79,NYSE,ENERGY 52 | DISNEY,DIS,114,NYSE,ENTERTAINMENT 53 | HUMANA,HUM,324,NYSE,HEALTH 54 | PFIZER,PFE,40,NYSE,PHARMA 55 | AIG,AIG,53,NYSE,INSURANCE 56 | LOCKHEED MARTIN,LMT,320,NYSE,TRANSPORTATION 57 | SYSCO,SYY,68,NYSE,RETAIL 58 | FEDEX,FDX,243,NYSE,COURIER 59 | HEWLETT PACKARD ENTERPRISE,HPE,16,NYSE,TECH 60 | CISCO SYSTEMS,CSCO,43,NASDAQ,TECH 61 | HP,HPQ,23,NYSE,TECH 62 | DOW CHEMICAL,DWDP,67,NYSE,CHEMICAL 63 | HCA HOLDINGS,HCA,130,NYSE,HEALTH 64 | COCA-COLA,KO,46,NYSE,FOOD BEVERAGE 65 | NEW YORK LIFE INSURANCE,PVT-0,0,PRIVATE,FINANCIALS 66 | CENTENE,CNC,142,NYSE,HEALTH 67 | AMERICAN TRANSPORTATIONLINES GROUP,AAL,37,NASDAQ,TRANSPORTATION 68 | MERCK,MRK,75,NYSE,HEALTH 69 | CIGNA,CI,220,NYSE,HEALTH 70 | DELTA TRANSPORTATION LINES,DAL,57,NYSE,TRANSPORTATION 71 | BEST BUY,BBY,73,NYSE,RETAILING 72 | HONEYWELL INTERNATIONAL,HON,150,NYSE,INDUSTRIALS 73 | CATERPILLAR,CAT,135,NYSE,INDUSTRIALS 74 | LIBERTY MUTUAL INSURANCE GROUP,PVT-1,0,PRIVATE,FINANCIALS 75 | MORGAN STANLEY,MS,46,NYSE,FINANCIALS 76 | MASSACHUSETTS MUTUAL LIFE INSURANCE,PVT-2,0,PRIVATE,FINANCIALS 77 | GOLDMAN SACHS GROUP,GS,231,NYSE,FINANCIALS 78 | ENERGY TRANSFER EQUITY,ETE,16,NYSE,ENERGY 79 | TIAA,None,0,PRIVATE,FINANCIALS 80 | ORACLE,ORCL,50,NYSE,TECH 81 | TYSON FOODS,TSN,62,NYSE,FOOD BEVERAGE 82 | UNITED CONTINENTAL HOLDINGS,UAL,92,NASDAQ,TRANSPORTATION 83 | ALLSTATE,ALL,92,NYSE,FINANCIALS 84 | PUBLIX SUPER MARKETS,PVT-3,0,PRIVATE,FOOD & DRUG STORES 85 | AMERICAN EXPRESS,AXP,107,NYSE,FINANCIALS 86 | TJX,TJX,55,NYSE,RETAILING 87 | NIKE,NKE,78,NYSE,APPAREL 88 | EXELON,EXC,45,NYSE,ENERGY 89 | GENERAL DYNAMICS,GD,185,NYSE,AEROSPACE & DEFENSE 90 | RITE AID,RAD,2,NYSE,FOOD & DRUG STORES 91 | GILEAD SCIENCES,GILD,73,NASDAQ,HEALTH 92 | CHS,PVT-4,0,PRIVATE,FOOD BEVERAGE 93 | 3M,MMM,201,NYSE,INDUSTRIALS 94 | TIME WARNER,TWX,107,NYSE,MEDIA 95 | CHARTER COMMUNICATIONS,CHTR,328,NASDAQ,TELECOM 96 | NORTHWESTERN MUTUAL,PVT-5,0,PRIVATE,FINANCIALS 97 | FACEBOOK,FB,151,NASDAQ,TECH 98 | TRAVELERS COS.,TRV,130,NYSE,FINANCIALS 99 | CAPITAL ONE FINANCIAL,COF,91,NYSE,FINANCIALS 100 | TWENTY-FIRST CENTURY FOX,FOXA,47,NASDAQ,MEDIA 101 | USAA,PVT-5,0,PRIVATE,FINANCIALS 102 | WORLD FUEL SERVICES,INT,31,NYSE,ENERGY 103 | PHILIP MORRIS INTERNATIONAL,PM,90,NYSE,FOOD BEVERAGE 104 | DEERE,DE,148,NYSE,INDUSTRIALS 105 | KRAFT HEINZ,KHC,54,NASDAQ,FOOD BEVERAGE 106 | TECH DATA,TECD,75,NASDAQ,WHOLESALERS 107 | AVNET,AVT,44,NASDAQ,WHOLESALERS 108 | MONDELEZ INTERNATIONAL,MDLZ,43,NASDAQ,FOOD BEVERAGE 109 | MACY'S,M,37,NYSE,RETAILING 110 | ABBVIE,ABBV,87,NYSE,HEALTH 111 | MCDONALD'S,MCD,185,NYSE,"HOTELS, RESTAURANTS & LEISURE" 112 | DUPONT,DD,84,NYSE,CHEMICALS 113 | NORTHROP GRUMMAN,NOC,285,NYSE,AEROSPACE & DEFENSE 114 | SPLINTER INC,CPS,1000,NYSE,TECH 115 | CONOCOPHILLIPS,COP,70,NYSE,ENERGY 116 | RAYTHEON,RTN,187,NYSE,AEROSPACE & DEFENSE 117 | ANDEAVOR,TSO,105,NYSE,ENERGY 118 | ARROW ELECTRONICS,ARW,75,NYSE,WHOLESALERS 119 | QUALCOMM,QCOM,63,NASDAQ,TECH 120 | PROGRESSIVE,PGR,73,NYSE,FINANCIALS 121 | DUKE ENERGY,DUK,84,NYSE,ENERGY 122 | ENTERPRISE PRODUCTS PARTNERS,EPD,27,NYSE,ENERGY 123 | AMGEN,AMGN,197,NASDAQ,HEALTH 124 | US FOODS HOLDING,USFD,32,NYSE,WHOLESALERS 125 | U.S. BANCORP,USB,52,NYSE,FINANCIALS 126 | AFLAC,AFL,45,NYSE,FINANCIALS 127 | SEARS HOLDINGS,SHLD,1,OTCMKTS,RETAILING 128 | DOLLAR GENERAL,DG,116,NYSE,RETAILING 129 | AUTONATION,AN,39,NYSE,RETAILING 130 | COMMUNITY HEALTH SYSTEMS,CYH,4,NYSE,HEALTH 131 | STARBUCKS,SBUX,68,NASDAQ,"HOTELS, RESTAURANTS & LEISURE" 132 | ELI LILLY,LLY,109,NYSE,HEALTH 133 | INTERNATIONAL PAPER,IP,47,NYSE,MATERIALS 134 | TENET HEALTHCARE,THC,27,NYSE,HEALTH 135 | ABBOTT LABORATORIES,ABT,73,NYSE,HEALTH 136 | DOLLAR TREE,DLTR,86,NASDAQ,RETAILING 137 | WHIRLPOOL,WHR,117,NYSE,INDUSTRIALS 138 | SOUTHWEST TRANSPORTATIONLINES,LUV,53,NYSE,TRANSPORTATION 139 | EMERSON ELECTRIC,EMR,70,NYSE,INDUSTRIALS 140 | STAPLES,SPLS,10,NYSE,RETAILING 141 | PLAINS GP HOLDINGS,PAGP,23,NYSE,ENERGY 142 | PENSKE AUTOMOTIVE GROUP,PAG,45,NYSE,RETAILING 143 | UNION PACIFIC,UNP,152,NYSE,TRANSPORTATION 144 | DANAHER,DHR,104,NYSE,TECH 145 | SOUTHERN,SO,48,NYSE,ENERGY 146 | MANPOWERGROUP,MAN,82,NYSE,BUSINESS SERVICES 147 | BRISTOL-MYERS SQUIBB,BMY,53,NYSE,HEALTH 148 | ALTRIA GROUP,MO,65,NYSE,FOOD BEVERAGE 149 | FLUOR,FLR,49,NYSE,ENGINEERING & CONSTRUCTION 150 | KOHL'S,KSS,80,NYSE,RETAILING 151 | LEAR,LEA,140,NYSE,MOTOR VEHICLES & PARTS 152 | JABIL CIRCUIT,JBL,26,NYSE,TECH 153 | HARTFORD FINANCIAL SERVICES GROUP,HIG,47,NYSE,FINANCIALS 154 | THERMO FISHER SCIENTIFIC,TMO,245,NYSE,TECH 155 | KIMBERLY-CLARK,KMB,108,NYSE,HOUSEHOLD PRODUCTS 156 | MOLINA HEALTHCARE,MOH,137,NYSE,HEALTH 157 | PG&E CORP.,PCG,48,NYSE,ENERGY 158 | SUPERVALU,SVU,0,None,FOOD & DRUG STORES 159 | CUMMINS,CMI,147,NYSE,INDUSTRIALS 160 | CENTURYLINK,CTL,22,NYSE,TELECOM 161 | AECOM,ACM,34,NYSE,ENGINEERING & CONSTRUCTION 162 | XEROX,XRX,29,NYSE,TECH 163 | MARRIOTT INTERNATIONAL,MAR,116,NASDAQ,"HOTELS, RESTAURANTS & LEISURE" 164 | PACCAR,PCAR,60,NASDAQ,INDUSTRIALS 165 | GENERAL MILLS,GIS,44,NYSE,FOOD BEVERAGE 166 | PNC FINANCIAL SERVICES GROUP,PNC,133,NYSE,FINANCIALS 167 | AMERICAN ELECTRIC POWER,AEP,75,NYSE,ENERGY 168 | ICAHN ENTERPRISES,IEP,74,NYSE,FINANCIALS 169 | NUCOR,NUE,64,NYSE,MATERIALS 170 | NEXTERA ENERGY,NEE,173,NYSE,ENERGY 171 | PERFORMANCE FOOD GROUP,PFGC,32,NYSE,WHOLESALERS 172 | PBF ENERGY,PBF,43,NYSE,ENERGY 173 | HALLIBURTON,HAL,36,NYSE,ENERGY 174 | CARMAX,KMX,68,NYSE,RETAILING 175 | FREEPORT-MCMORAN,FCX,12,NYSE,ENERGY 176 | WHOLE FOODS MARKET,WFM,0,None,FOOD & DRUG STORES 177 | BANK OF NEW YORK MELLON CORP.,BK,49,NYSE,FINANCIALS 178 | GAP,GPS,27,NYSE,RETAILING 179 | OMNICOM GROUP,OMC,76,NYSE,BUSINESS SERVICES 180 | GENUINE PARTS,GPC,100,NYSE,WHOLESALERS 181 | DAVITA HEALTHCARE PARTNERS,DVA,76,NYSE,HEALTH 182 | COLGATE-PALMOLIVE,CL,61,NYSE,HOUSEHOLD PRODUCTS 183 | PPG INDUSTRIES,PPG,110,NYSE,CHEMICALS 184 | GOODYEAR TIRE & RUBBER,GT,22,NASDAQ,MOTOR VEHICLES & PARTS 185 | SYNCHRONY FINANCIAL,SYF,27,NYSE,FINANCIALS 186 | DISH NETWORK,DISH,32,NASDAQ,TELECOM 187 | VISA,V,145,NYSE,BUSINESS SERVICES 188 | NORDSTROM,JWN,66,NYSE,RETAILING 189 | INTL FCSTONE,INTL,49,NASDAQ,FINANCIALS 190 | WESTROCK,WRK,46,NYSE,MATERIALS 191 | XPO LOGISTICS,XPO,88,NYSE,TRANSPORTATION 192 | ARAMARK,ARMK,36,NYSE,BUSINESS SERVICES 193 | CBS,CBS,58,NYSE,MEDIA 194 | AES,AES,15,NYSE,ENERGY 195 | WELLCARE HEALTH PLANS,WCG,275,NYSE,HEALTH 196 | FIRSTENERGY,FE,38,NYSE,ENERGY 197 | CONAGRA FOODS,CAG,35,NYSE,FOOD BEVERAGE 198 | SYNNEX,SNX,80,NYSE,WHOLESALERS 199 | CDW,CDW,90,NASDAQ,TECH 200 | TEXTRON,TXT,57,NYSE,AEROSPACE & DEFENSE 201 | WASTE MANAGEMENT,WM,90,NYSE,BUSINESS SERVICES 202 | ILLINOIS TOOL WORKS,ITW,133,NYSE,INDUSTRIALS 203 | OFFICE DEPOT,ODP,4,NASDAQ,RETAILING 204 | MONSANTO,MON,1,CVE,CHEMICALS 205 | COGNIZANT TECH SOLUTIONS,CTSH,71,NASDAQ,TECH 206 | TEXAS INSTRUMENTS,TXN,97,NASDAQ,TECH 207 | LINCOLN NATIONAL,LNC,66,NYSE,FINANCIALS 208 | NEWELL BRANDS,NWL,20,NYSE,HOUSEHOLD PRODUCTS 209 | LAND O'LAKES,PVT-6,0,PRIVATE,FOOD BEVERAGE 210 | MARSH & MCLENNAN,MMC,87,NYSE,FINANCIALS 211 | ECOLAB,ECL,160,NYSE,CHEMICALS 212 | C.H. ROBINSON WORLDWIDE,CHRW,91,NASDAQ,TRANSPORTATION 213 | LOEWS,L,49,NYSE,FINANCIALS 214 | CBRE GROUP,CBG,44,NYSE,FINANCIALS 215 | KINDER MORGAN,KMI,17,NYSE,ENERGY 216 | KELLOGG,K,65,NYSE,FOOD BEVERAGE 217 | WESTERN DIGITAL,WDC,48,NASDAQ,TECH 218 | GUARDIAN LIFE INS. CO. OF AMERICA,PVT-7,0,PRIVATE,FINANCIALS 219 | ROSS STORES,ROST,102,NASDAQ,RETAILING 220 | L BRANDS,LB,35,NYSE,RETAILING 221 | J.C. PENNEY,JCP,2,NYSE,RETAILING 222 | FARMERS INSURANCE EXCHANGE,PVT-8,0,PRIVATE,FINANCIALS 223 | REYNOLDS AMERICAN,RAI,73,LON,FOOD BEVERAGE 224 | VIACOM,VIAB,32,NASDAQ,MEDIA 225 | BECTON DICKINSON,BDX,237,NYSE,HEALTH 226 | MICRON TECH,MU,41,NASDAQ,TECH 227 | PRINCIPAL FINANCIAL,PFG,50,NASDAQ,FINANCIALS 228 | ARCONIC,ARNC,21,NYSE,AEROSPACE & DEFENSE 229 | NRG ENERGY,NRG,38,NYSE,ENERGY 230 | VF,VFC,86,NYSE,APPAREL 231 | DEVON ENERGY,DVN,34,NYSE,ENERGY 232 | D.R. HORTON,DHI,38,NYSE,ENGINEERING & CONSTRUCTION 233 | BED BATH & BEYOND,BBBY,15,NASDAQ,RETAILING 234 | CONSOLIDATED EDISON,ED,78,NYSE,ENERGY 235 | EDISON INTERNATIONAL,EIX,70,NYSE,ENERGY 236 | SHERWIN-WILLIAMS,SHW,415,NYSE,CHEMICALS 237 | NGL ENERGY PARTNERS,NGL,11,NYSE,ENERGY 238 | DOMINION RESOURCES,D,71,NYSE,ENERGY 239 | AMERIPRISE FINANCIAL,AMP,129,NYSE,FINANCIALS 240 | ADP,ADP,148,NASDAQ,BUSINESS SERVICES 241 | HILTON WORLDWIDE HOLDINGS,HLT,73,NYSE,"HOTELS, RESTAURANTS & LEISURE" 242 | FIRST DATA,FDC,20,NYSE,BUSINESS SERVICES 243 | HENRY SCHEIN,HSIC,87,NASDAQ,WHOLESALERS 244 | "TOYS ""R"" US",PVT-9,0,PRIVATE,RETAILING 245 | BB&T CORP.,BBT,50,NYSE,FINANCIALS 246 | REINSURANCE GROUP OF AMERICA,RGA,148,NYSE,FINANCIALS 247 | CORE-MARK HOLDING,CORE,30,NASDAQ,WHOLESALERS 248 | BIOGEN,BIIB,331,NASDAQ,HEALTH 249 | LAS VEGAS SANDS,LVS,56,NYSE,"HOTELS, RESTAURANTS & LEISURE" 250 | STANLEY BLACK & DECKER,SWK,128,NYSE,HOUSEHOLD PRODUCTS 251 | PARKER-HANNIFIN,PH,171,NYSE,INDUSTRIALS 252 | STRYKER,SYK,170,NYSE,HEALTH 253 | ESTEE LAUDER,EL,142,NYSE,HOUSEHOLD PRODUCTS 254 | CELGENE,CELG,75,NASDAQ,HEALTH 255 | BLACKROCK,BLK,424,NYSE,FINANCIALS 256 | XCEL ENERGY,XEL,50,NASDAQ,ENERGY 257 | CSX,CSX,72,NASDAQ,TRANSPORTATION 258 | UNUM GROUP,UNM,38,NYSE,FINANCIALS 259 | JACOBS ENGINEERING GROUP,JEC,80,NYSE,ENGINEERING & CONSTRUCTION 260 | LENNAR,LEN,43,NYSE,ENGINEERING & CONSTRUCTION 261 | GROUP 1 AUTOMOTIVE,GPI,57,NYSE,RETAILING 262 | LEUCADIA NATIONAL,LUK,22,NYSE,FINANCIALS 263 | ENTERGY,ETR,85,NYSE,ENERGY 264 | PAYPAL HOLDINGS,PYPL,88,NASDAQ,BUSINESS SERVICES 265 | APPLIED MATERIALS,AMAT,35,NASDAQ,TECH 266 | VOYA FINANCIAL,VOYA,46,NYSE,FINANCIALS 267 | MASTERCARD,MA,208,NYSE,BUSINESS SERVICES 268 | PRICELINE GROUP,PCLN,2000,NASDAQ,TECH 269 | LIBERTY INTERACTIVE,QVCA,0,None,RETAILING 270 | AUTOZONE,AZO,790,NYSE,RETAILING 271 | STATE STREET CORP.,STT,74,NYSE,FINANCIALS 272 | DTE ENERGY,DTE,116,NYSE,ENERGY 273 | L-3 COMMUNICATIONS,LLL,195,NYSE,AEROSPACE & DEFENSE 274 | HOLLYFRONTIER,HFC,68,NYSE,ENERGY 275 | PRAXTRANSPORTATION,PX,0,None,CHEMICALS 276 | UNIVERSAL HEALTH SERVICES,UHS,130,NYSE,HEALTH 277 | DISCOVER FINANCIAL SERVICES,DFS,70.74,NYSE,FINANCIALS 278 | OCCIDENTAL PETROLEUM,OXY,73,NYSE,ENERGY 279 | UNITED STATES STEEL,X,29,NYSE,MATERIALS 280 | SEMPRA ENERGY,SRE,117,NYSE,ENERGY 281 | BAXTER INTERNATIONAL,BAX,63,NYSE,HEALTH 282 | W.W. GRAINGER,GWW,296,NYSE,WHOLESALERS 283 | AUTOLIV,ALV,86,NYSE,MOTOR VEHICLES & PARTS 284 | NORFOLK SOUTHERN,NSC,173,NYSE,TRANSPORTATION 285 | BAKER HUGHES,BHI,54,FRA,ENERGY 286 | ALLY FINANCIAL,ALLY,26,NYSE,FINANCIALS 287 | SONIC AUTOMOTIVE,SAH,18,NYSE,RETAILING 288 | OWENS & MINOR,OMI,9,NYSE,WHOLESALERS 289 | HUNTSMAN,HUN,23,NYSE,CHEMICALS 290 | LABORATORY CORP. OF AMERICA,LH,171,NYSE,HEALTH 291 | MURPHY USA,MUSA,82,NYSE,RETAILING 292 | ADVANCE AUTO PARTS,AAP,170,NYSE,RETAILING 293 | FIDELITY NATIONAL FINANCIAL,FNF,33,NYSE,FINANCIALS 294 | TRANSPORTATION PRODUCTS & CHEMICALS,APD,160,NYSE,CHEMICALS 295 | HORMEL FOODS,HRL,44,NYSE,FOOD BEVERAGE 296 | HERTZ GLOBAL HOLDINGS,HTZ,16,NYSE,RETAILING 297 | MGM RESORTS INTERNATIONAL,MGM,28,NYSE,"HOTELS, RESTAURANTS & LEISURE" 298 | CORNING,GLW,34,NYSE,INDUSTRIALS 299 | REPUBLIC SERVICES,RSG,73,NYSE,BUSINESS SERVICES 300 | ALCOA,AA,37,NYSE,MATERIALS 301 | FIDELITY NATIONAL INFORMATION SERVICES,FIS,107,NYSE,BUSINESS SERVICES 302 | PACIFIC LIFE,PVT-10,0,PRIVATE,FINANCIALS 303 | SUNTRUST BANKS,STI,63,NYSE,FINANCIALS 304 | LKQ,LKQ,28,NASDAQ,WHOLESALERS 305 | BORGWARNER,BWA,40,NYSE,MOTOR VEHICLES & PARTS 306 | BALL,BLL,48,NYSE,MATERIALS 307 | CST BRANDS,CST,1,CVE,RETAILING 308 | PUBLIC SERVICE ENTERPRISE GROUP,PEG,53,NYSE,ENERGY 309 | EASTMAN CHEMICAL,EMN,84,NYSE,CHEMICALS 310 | EBAY,EBAY,30,NASDAQ,TECH 311 | MOHAWK INDUSTRIES,MHK,127,NYSE,HOUSEHOLD PRODUCTS 312 | ONEOK,OKE,64,NYSE,ENERGY 313 | FRONTIER COMMUNICATIONS,FTR,4,NASDAQ,TELECOM 314 | NETFLIX,NFLX,327,NASDAQ,TECH 315 | AMERICAN FAMILY INSURANCE GROUP,PVT-11,0,PRIVATE,FINANCIALS 316 | THRIVENT FINANCIAL FOR LUTHERANS,PVT-12,0,PRIVATE,FINANCIALS 317 | EXPEDIA,EXPE,128,NASDAQ,TECH 318 | LITHIA MOTORS,LAD,85,NYSE,RETAILING 319 | AVIS BUDGET GROUP,CAR,32,NASDAQ,RETAILING 320 | RELIANCE STEEL & ALUMINUM,RS,82,NYSE,MATERIALS 321 | GAMESTOP,GME,15,NYSE,RETAILING 322 | TENNECO,TEN,35,NYSE,MOTOR VEHICLES & PARTS 323 | O'REILLY AUTOMOTIVE,ORLY,342,NASDAQ,RETAILING 324 | PETER KIEWIT SONS',PVT-13,0,PRIVATE,ENGINEERING & CONSTRUCTION 325 | UNITED NATURAL FOODS,UNFI,23,NYSE,WHOLESALERS 326 | SALESFORCE.COM,CRM,142,NYSE,TECH 327 | BOSTON SCIENTIFIC,BSX,38,NYSE,HEALTH 328 | NEWMONT MINING,NEM,33,NYSE,ENERGY 329 | GENWORTH FINANCIAL,GNW,5,NYSE,FINANCIALS 330 | LIVE NATION ENTERTAINMENT,LYV,57,NYSE,MEDIA 331 | VERITIV,VRTV,32,NYSE,WHOLESALERS 332 | NEWS CORP.,NWSA,14,NASDAQ,MEDIA 333 | CROWN HOLDINGS,CCK,47,NYSE,MATERIALS 334 | GLOBAL PARTNERS,GLP,20,NYSE,WHOLESALERS 335 | PVH,PVH,125,NYSE,APPAREL 336 | LEVEL 3 COMMUNICATIONS,LVLT,0,None,TELECOM 337 | NAVISTAR INTERNATIONAL,NAV,32,NYSE,INDUSTRIALS 338 | UNIVAR,UNVR,23,NYSE,WHOLESALERS 339 | CAMPBELL SOUP,CPB,38,NYSE,FOOD BEVERAGE 340 | DICK'S SPORTING GOODS,DKS,37,NYSE,RETAILING 341 | WEYERHAEUSER,WY,27,NYSE,MATERIALS 342 | MUTUAL OF OMAHA INSURANCE,PVT-14,0,PRIVATE,FINANCIALS 343 | CHESAPEAKE ENERGY,CHK,4,NYSE,ENERGY 344 | ANADARKO PETROLEUM,APC,58,NYSE,ENERGY 345 | INTERPUBLIC GROUP,IPG,24,NYSE,BUSINESS SERVICES 346 | J.M. SMUCKER,SJM,110,NYSE,FOOD BEVERAGE 347 | STEEL DYNAMICS,STLD,42,NASDAQ,MATERIALS 348 | FOOT LOCKER,FL,50,NYSE,RETAILING 349 | WESTERN REFINING,PVT-15,0,PRIVATE,ENERGY 350 | SPARTANNASH,SPTN,20,NASDAQ,WHOLESALERS 351 | DEAN FOODS,DF,6,NYSE,FOOD BEVERAGE 352 | ZIMMER BIOMET HOLDINGS,ZBH,118,NYSE,HEALTH 353 | PULTEGROUP,PHM,25,NYSE,ENGINEERING & CONSTRUCTION 354 | W.R. BERKLEY,WRB,78,NYSE,FINANCIALS 355 | QUANTA SERVICES,PWR,35,NYSE,ENGINEERING & CONSTRUCTION 356 | EOG RESOURCES,EOG,109,NYSE,ENERGY 357 | CHARLES SCHWAB,SCHW,48,NYSE,FINANCIALS 358 | EVERSOURCE ENERGY,ES,65,NYSE,ENERGY 359 | ANIXTER INTERNATIONAL,AXE,69,NYSE,WHOLESALERS 360 | EMCOR GROUP,EME,76,NYSE,ENGINEERING & CONSTRUCTION 361 | ASSURANT,AIZ,102,NYSE,FINANCIALS 362 | CENTERPOINT ENERGY,CNP,28,NYSE,ENERGY 363 | HARRIS,HRS,153,NYSE,TECH 364 | HD SUPPLY HOLDINGS,HDS,39,NASDAQ,WHOLESALERS 365 | PPL,PPL,31,NYSE,ENERGY 366 | QUEST DIAGNOSTICS,DGX,97,NYSE,HEALTH 367 | WILLIAMS,WMB,26,NYSE,ENERGY 368 | WEC ENERGY GROUP,WEC,68,NYSE,ENERGY 369 | HERSHEY,HSY,108,NYSE,FOOD BEVERAGE 370 | AGCO,AGCO,58,NYSE,INDUSTRIALS 371 | RALPH LAUREN,RL,127,NYSE,APPAREL 372 | MASCO,MAS,31,NYSE,HOUSEHOLD PRODUCTS 373 | WESCO INTERNATIONAL,WCC,55,NYSE,WHOLESALERS 374 | LIFEPOINT HEALTH,LPNT,65,NASDAQ,HEALTH 375 | NATIONAL OILWELL VARCO,NOV,36,NYSE,ENERGY 376 | KINDRED HEALTHCARE,KND,0,None,HEALTH 377 | MOSAIC,MOS,35,NYSE,CHEMICALS 378 | ALLIANCE DATA SYSTEMS,ADS,212,NYSE,BUSINESS SERVICES 379 | COMPUTER SCIENCES CORPORATION,PVT-16,0,PRIVATE,TECH 380 | HUNTINGTON INGALLS INDUSTRIES,HII,234,NYSE,AEROSPACE & DEFENSE 381 | LEIDOS HOLDINGS,LDOS,65,NYSE,TECH 382 | ERIE INSURANCE GROUP,PVT-17,0,PRIVATE,FINANCIALS 383 | TESLA,TSLA,350,NASDAQ,MOTOR VEHICLES & PARTS 384 | ASCENA RETAIL GROUP,ASNA,4,NASDAQ,RETAILING 385 | DARDEN RESTAURANTS,DRI,111,NYSE,"HOTELS, RESTAURANTS & LEISURE" 386 | HARMAN INTERNATIONAL INDUSTRIES,PVT-18,0,PRIVATE,INDUSTRIALS 387 | NVIDIA,NVDA,213,NASDAQ,TECH 388 | R.R. DONNELLEY & SONS,RRD,7,NYSE,MEDIA 389 | FIFTH THIRD BANCORP,FITB,27,NASDAQ,FINANCIALS 390 | QUINTILES TRANSNATIONAL HOLDINGS,Q,45,BMV,HEALTH 391 | JONES LANG LASALLE,JLL,145,NYSE,FINANCIALS 392 | DOVER,DOV,86,NYSE,INDUSTRIALS 393 | SPIRIT AEROSYSTEMS HOLDINGS,SPR,87,NYSE,AEROSPACE & DEFENSE 394 | RYDER SYSTEM,R,57,NYSE,TRANSPORTATION 395 | A-MARK PRECIOUS METALS,AMRK,12,NASDAQ,MATERIALS 396 | TRACTOR SUPPLY,TSCO,95,NASDAQ,RETAILING 397 | SEALED TRANSPORTATION,SEE,35,NYSE,MATERIALS 398 | AUTO-OWNERS INSURANCE,PVT-19,0,PRIVATE,FINANCIALS 399 | YUM CHINA HOLDINGS,YUMC,37,NYSE,"HOTELS, RESTAURANTS & LEISURE" 400 | CALPINE,CPN,78,BKK,ENERGY 401 | OWENS-ILLINOIS,OI,17,NYSE,MATERIALS 402 | TARGA RESOURCES,TRGP,53,NYSE,ENERGY 403 | JETBLUE TRANSPORTATIONWAYS,JBLU,18,NASDAQ,FINANCIALS 404 | JONES FINANCIAL,PVT-20,0,PRIVATE,TRANSPORTATION 405 | FRANKLIN RESOURCES,BEN,31,NYSE,FINANCIALS 406 | ACTIVISION BLIZZARD,ATVI,65,NASDAQ,TECH 407 | J.B. HUNT TRANSPORT SERVICES,JBHT,111,NASDAQ,TRANSPORTATION 408 | CONSTELLATION BRANDS,STZ,206,NYSE,FOOD BEVERAGE 409 | NCR,NCR,28,NYSE,TECH 410 | ASBURY AUTOMOTIVE GROUP,ABG,68,NYSE,RETAILING 411 | AMERICAN FINANCIAL GROUP,AFG,105,NYSE,FINANCIALS 412 | DISCOVERY COMMUNICATIONS,DISCA,33,NASDAQ,MEDIA 413 | BERRY GLOBAL GROUP,BERY,46,NYSE,MATERIALS 414 | SANMINA,SANM,26,NASDAQ,TECH 415 | CALATLANTIC GROUP,CAA,1,ASX,ENGINEERING & CONSTRUCTION 416 | DR PEPPER SNAPPLE GROUP,DPS,1,KLSE,FOOD BEVERAGE 417 | DILLARD'S,DDS,79,NYSE,RETAILING 418 | HRG GROUP,HRG,66,NYSE,HOUSEHOLD PRODUCTS 419 | CMS ENERGY,CMS,49,NYSE,ENERGY 420 | GRAYBAR ELECTRIC,PVT-21,0,PRIVATE,WHOLESALERS 421 | BUILDERS FIRSTSOURCE,BLDR,13,NASDAQ,MATERIALS 422 | YUM BRANDS,YUM,90,NYSE,"HOTELS, RESTAURANTS & LEISURE" 423 | CASEY'S GENERAL STORES,CASY,132,NASDAQ,RETAILING 424 | AMPHENOL,APH,91,NYSE,TECH 425 | OSHKOSH,OSK,69,NYSE,INDUSTRIALS 426 | IHEARTMEDIA,IHRT,1,OTCMKTS,MEDIA 427 | TREEHOUSE FOODS,THS,49,NYSE,FOOD BEVERAGE 428 | ALLEGHANY,Y,635,NYSE,FINANCIALS 429 | EXPEDITORS INTERNATIONAL OF WASHINGTON,EXPD,74,NASDAQ,TRANSPORTATION 430 | AVERY DENNISON,AVY,93,NYSE,MATERIALS 431 | AMEREN,AEE,66,NYSE,ENERGY 432 | HANESBRANDS,HBI,17,NYSE,APPAREL 433 | MOTOROLA SOLUTIONS,MSI,128,NYSE,TECH 434 | ST. JUDE MEDICAL,PVT-22,0,PRIVATE,HEALTH 435 | HARLEY-DAVIDSON,HOG,41,NYSE,TRANSPORTATION 436 | REGIONS FINANCIAL,RF,18,NYSE,FINANCIALS 437 | INTERCONTINENTAL EXCHANGE,ICE,78,NYSE,FINANCIALS 438 | ALASKA TRANSPORTATION GROUP,ALK,66,NYSE,TRANSPORTATION 439 | OLD REPUBLIC INTERNATIONAL,ORI,22,NYSE,FINANCIALS 440 | LAM RESEARCH,LRCX,151,NASDAQ,TECH 441 | AK STEEL HOLDING,AKS,4,NYSE,MATERIALS 442 | ROCKWELL AUTOMATION,ROK,179,NYSE,INDUSTRIALS 443 | ADOBE SYSTEMS,ADBE,253,NASDAQ,TECH 444 | AVON PRODUCTS,AVP,2,NYSE,HOUSEHOLD PRODUCTS 445 | TEREX,TEX,32,NYSE,INDUSTRIALS 446 | NVR,NVR,2303,NYSE,ENGINEERING & CONSTRUCTION 447 | DANA HOLDING,DAN,15,NYSE,MOTOR VEHICLES & PARTS 448 | REALOGY HOLDINGS,RLGY,0,None,FINANCIALS 449 | AMERICAN TOWER,AMT,157,NYSE,TELECOM 450 | PACKAGING CORP. OF AMERICA,PKG,99,NYSE,MATERIALS 451 | CITIZENS FINANCIAL GROUP,CFG,38,NYSE,FINANCIALS 452 | UNITED RENTALS,URI,131,NYSE,BUSINESS SERVICES 453 | CLOROX,CLX,158,NYSE,HOUSEHOLD PRODUCTS 454 | GENESIS HEALTHCARE,GEN,2,NYSE,HEALTH 455 | M&T BANK CORP.,MTB,165,NYSE,FINANCIALS 456 | INGREDION,INGR,106,NYSE,FOOD BEVERAGE 457 | UGI,UGI,55,NYSE,ENERGY 458 | OWENS CORNING,OC,49,NYSE,MATERIALS 459 | S&P GLOBAL,SPGI,186,NYSE,BUSINESS SERVICES 460 | MARKEL,MKL,1127,NYSE,FINANCIALS 461 | WYNDHAM WORLDWIDE,WYN,413,LON,"HOTELS, RESTAURANTS & LEISURE" 462 | ARTHUR J. GALLAGHER,AJG,77,NYSE,FINANCIALS 463 | BURLINGTON STORES,BURL,171,NYSE,RETAILING 464 | FIRST AMERICAN FINANCIAL,FAF,46,NYSE,FINANCIALS 465 | SYMANTEC,SYMC,23,NASDAQ,TECH 466 | PATTERSON,PDCO,24,NASDAQ,WHOLESALERS 467 | OLIN,OLN,22,NYSE,CHEMICALS 468 | NETAPP,NTAP,83,NASDAQ,TECH 469 | RAYMOND JAMES FINANCIAL,RJF,81,NYSE,FINANCIALS 470 | TRAVELCENTERS OF AMERICA,TA,4,NASDAQ,RETAILING 471 | FISERV,FISV,79,NASDAQ,BUSINESS SERVICES 472 | HOST HOTELS & RESORTS,HST,19,NYSE,FINANCIALS 473 | INSIGHT ENTERPRISES,NSIT,45,NASDAQ,WHOLESALERS 474 | MATTEL,MAT,14,NASDAQ,HOUSEHOLD PRODUCTS 475 | AMTRUST FINANCIAL SERVICES,AFSI,14,NASDAQ,FINANCIALS 476 | CINCINNATI FINANCIAL,CINF,81,NASDAQ,FINANCIALS 477 | SIMON PROPERTY GROUP,SPG,187,NYSE,FINANCIALS 478 | WESTERN UNION,WU,18,NYSE,BUSINESS SERVICES 479 | KEYCORP,KEY,19,NYSE,FINANCIALS 480 | DELEK US HOLDINGS,DK,39,NYSE,ENERGY 481 | BOOZ ALLEN HAMILTON HOLDING,BAH,50,NYSE,TECH 482 | CHEMOURS,CC,35,NYSE,CHEMICALS 483 | WESTERN & SOUTHERN FINANCIAL GROUP,PVT-23,0,PRIVATE,FINANCIALS 484 | CELANESE,CE,106,NYSE,CHEMICALS 485 | WINDSTREAM HOLDINGS,WIN,5,NASDAQ,TELECOM 486 | SEABOARD,SEB,3625,NYSEAMERICAN,FOOD BEVERAGE 487 | ESSENDANT,ESND,13,NASDAQ,WHOLESALERS 488 | APACHE,APA,38,NYSE,ENERGY 489 | TRANSPORTATIONGAS,PVT-24,0,PRIVATE,WHOLESALERS 490 | KELLY SERVICES,KELYA,24,NASDAQ,BUSINESS SERVICES 491 | LIBERTY MEDIA,LSXMA,41,NASDAQ,MEDIA 492 | ROCKWELL COLLINS,COL,133,NYSE,AEROSPACE & DEFENSE 493 | ROBERT HALF INTERNATIONAL,RHI,65,NYSE,BUSINESS SERVICES 494 | CH2M HILL,PVT-25,0,PRIVATE,ENGINEERING & CONSTRUCTION 495 | BIG LOTS,BIG,44,NYSE,RETAILING 496 | MICHAELS COS.,MIK,17,NASDAQ,RETAILING 497 | TOLL BROTHERS,TOL,34,NYSE,ENGINEERING & CONSTRUCTION 498 | YAHOO,YHOO,0,None,TECH 499 | VISTRA ENERGY,VST,25,NYSE,ENERGY 500 | ABM INDUSTRIES,ABM,33,NYSE,BUSINESS SERVICES -------------------------------------------------------------------------------- /producer/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | --------------------------------------------------------------------------------