Java tutorial
/* * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Amazon Software License (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/asl/ * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.services.kinesis.application.stocktrades.writer; import java.nio.ByteBuffer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.regions.Region; import com.amazonaws.regions.RegionUtils; import com.amazonaws.services.kinesis.AmazonKinesis; import com.amazonaws.services.kinesis.AmazonKinesisClient; import com.amazonaws.services.kinesis.model.DescribeStreamResult; import com.amazonaws.services.kinesis.model.PutRecordRequest; import com.amazonaws.services.kinesis.model.ResourceNotFoundException; import com.amazonaws.services.kinesis.application.stocktrades.model.StockTrade; import com.amazonaws.services.kinesis.application.stocktrades.utils.ConfigurationUtils; import com.amazonaws.services.kinesis.application.stocktrades.utils.CredentialUtils; /** * Continuously sends simulated stock trades to Kinesis * */ public class StockTradesWriter { private static final Log LOG = LogFactory.getLog(StockTradesWriter.class); private static void checkUsage(String[] args) { if (args.length != 2) { System.err.println("Usage: " + StockTradesWriter.class.getSimpleName() + " <stream name> <region>"); System.exit(1); } } /** * Checks if the stream exists and is active * * @param kinesisClient Amazon Kinesis client instance * @param streamName Name of stream */ private static void validateStream(AmazonKinesis kinesisClient, String streamName) { try { DescribeStreamResult result = kinesisClient.describeStream(streamName); if (!"ACTIVE".equals(result.getStreamDescription().getStreamStatus())) { System.err.println( "Stream " + streamName + " is not active. Please wait a few moments and try again."); System.exit(1); } } catch (ResourceNotFoundException e) { System.err.println("Stream " + streamName + " does not exist. Please create it in the console."); System.err.println(e); System.exit(1); } catch (Exception e) { System.err.println("Error found while describing the stream " + streamName); System.err.println(e); System.exit(1); } } /** * Uses the Kinesis client to send the stock trade to the given stream. * * @param trade instance representing the stock trade * @param kinesisClient Amazon Kinesis client * @param streamName Name of stream */ private static void sendStockTrade(StockTrade trade, AmazonKinesis kinesisClient, String streamName) { byte[] bytes = trade.toJsonAsBytes(); // The bytes could be null if there is an issue with the JSON serialization by the Jackson JSON library. if (bytes == null) { LOG.warn("Could not get JSON bytes for stock trade"); return; } LOG.info("Putting trade: " + trade.toString()); PutRecordRequest putRecord = new PutRecordRequest(); putRecord.setStreamName(streamName); // We use the ticker symbol as the partition key, as explained in the tutorial. putRecord.setPartitionKey(trade.getTickerSymbol()); putRecord.setData(ByteBuffer.wrap(bytes)); try { kinesisClient.putRecord(putRecord); } catch (AmazonClientException ex) { LOG.warn("Error sending record to Amazon Kinesis.", ex); } } public static void main(String[] args) throws Exception { checkUsage(args); String streamName = args[0]; String regionName = args[1]; Region region = RegionUtils.getRegion(regionName); if (region == null) { System.err.println(regionName + " is not a valid AWS region."); System.exit(1); } AWSCredentials credentials = CredentialUtils.getCredentialsProvider().getCredentials(); AmazonKinesis kinesisClient = new AmazonKinesisClient(credentials, ConfigurationUtils.getClientConfigWithUserAgent()); kinesisClient.setRegion(region); // Validate that the stream exists and is active validateStream(kinesisClient, streamName); // Repeatedly send stock trades with a 100 milliseconds wait in between StockTradeGenerator stockTradeGenerator = new StockTradeGenerator(); while (true) { StockTrade trade = stockTradeGenerator.getRandomTrade(); sendStockTrade(trade, kinesisClient, streamName); Thread.sleep(100); } } }