/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 io.jafka.consumer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import io.jafka.api.FetchRequest;
import io.jafka.api.MultiFetchRequest;
import io.jafka.api.MultiFetchResponse;
import io.jafka.api.OffsetRequest;
import io.jafka.common.ErrorMapping;
import io.jafka.common.annotations.ClientSide;
import io.jafka.common.annotations.ThreadSafe;
import io.jafka.message.ByteBufferMessageSet;
import io.jafka.network.Receive;
import io.jafka.utils.KV;
/**
* Simple message consumer
*
* @author adyliu (imxylz@gmail.com)
* @since 1.0
*/
@ThreadSafe
@ClientSide
public class SimpleConsumer extends SimpleOperation implements IConsumer {
public SimpleConsumer(String host, int port) {
super(host,port);
}
public SimpleConsumer(String host, int port, int soTimeout, int bufferSize) {
super(host, port, soTimeout, bufferSize);
}
public ByteBufferMessageSet fetch(FetchRequest request) throws IOException {
KV<Receive, ErrorMapping> response = send(request);
return new ByteBufferMessageSet(response.k.buffer(), request.offset, response.v);
}
public long[] getOffsetsBefore(String topic, int partition, long time, int maxNumOffsets) throws IOException {
KV<Receive, ErrorMapping> response = send(new OffsetRequest(topic, partition, time, maxNumOffsets));
return OffsetRequest.deserializeOffsetArray(response.k.buffer());
}
public MultiFetchResponse multifetch(List<FetchRequest> fetches) throws IOException {
KV<Receive, ErrorMapping> response = send(new MultiFetchRequest(fetches));
List<Long> offsets = new ArrayList<Long>();
for (FetchRequest fetch : fetches) {
offsets.add(fetch.offset);
}
return new MultiFetchResponse(response.k.buffer(), fetches.size(), offsets);
}
@Override
public long getLatestOffset(String topic, int partition) throws IOException {
long[] result = getOffsetsBefore(topic, partition, -1, 1);
return result.length == 0 ? -1 : result[0];
}
}