使用序列号和分区ID从Kinesis获取记录

时间:2016-07-06 05:38:25

标签: java amazon-web-services lambda amazon-kinesis

我编写了一个代码来获取从kinesis流到lambda函数的记录,该函数提供Data,分区ID和序列号的输出有效负载,然后我尝试调用第二个lambda来获取序列号和分区ID Lambda,然后第二个lambda从kinesis流中提取数据。我一直坚持使用序列号和分区ID从kinesis流中获取数据。

以下是将一个lambda调用到另一个lambda的代码。

public class LambdaFunctionHandler implements RequestHandler<KinesisEvent, Object> {
        private static final String regionName = "us-east-1";
        private static final String functionName = "Test1";


    @Override
    public Object handleRequest(KinesisEvent input, Context context) {
        context.getLogger().log("Input: " + input);
        List<KinesisEventRecord> records = input.getRecords();
        for (KinesisEventRecord rec : records){
            ByteBuffer recdata = rec.getKinesis().getData();
             String data = new String( recdata.array(), Charset.forName("UTF-8") );
            context.getLogger().log("Data: " +data);
            context.getLogger().log("Partition key: " +rec.getKinesis().getPartitionKey());
            context.getLogger().log("Sequence Number: " +rec.getKinesis().getSequenceNumber());
        }

        //call another lambda function
        try {
            AWSLambdaClient lambda = new AWSLambdaClient();
            Region region = Region.getRegion(Regions.fromName(regionName));
            lambda.setRegion(region);
            InvokeRequest invokeRequest = new InvokeRequest();
            invokeRequest.setFunctionName(functionName);
            invokeRequest.setPayload("\" AWS Lambda Test - internal call\"");
            System.out.println(
                    lambda.invoke(invokeRequest).getPayload());
        } catch (Exception e) {
            System.out.println(e.getMessage());

        }

        // TODO: implement your handler
        return null;
    }

}

这是我尝试使用序列号和分区ID获取记录的代码。

public class LambdaFunctionHandler implements RequestHandler<KinesisEvent, Object> {
private static final String streamName = "Test";
private static final String partitionKey = "123456676454";
private static final String sequenceNumber = "12345"

public Object handleRequest(KinesisEvent input, Context context) {
    context.getLogger().log("Input: " + input);
    GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
    getRecordsRequest.setStreamName(streamName);
    getRecordsRequest.setPartitionKey(partitionKey);
    getRecordsRequest.setsequenceNumber(sequenceNumber);
    KinesisEvent.getRecord(getRecord);

}
        }

请让我知道一种使用序列号和分区ID从kinesis流中获取记录的方法。

1 个答案:

答案 0 :(得分:1)

您无法决定要读取的流,也不能确定Lambda函数内部的位置。 在Lambda函数运行之前,您需要在kinesis流和此lambda函数之间创建映射。 这将在每次新记录到达时触发lambda。

基本上,Lambda函数无法决定自己的输入。