├── 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 |
--------------------------------------------------------------------------------