package com.leansoft.luxun.producer; import java.nio.ByteBuffer; import java.util.List; import java.util.Random; //import org.apache.log4j.Logger; import org.apache.thrift.TException; import com.leansoft.luxun.api.generated.ProduceRequest; import com.leansoft.luxun.client.AbstractClient; import com.leansoft.luxun.common.exception.MessageSizeTooLargeException; import com.leansoft.luxun.message.MessageList; import com.leansoft.luxun.mx.SyncProducerStats; public class SyncProducer extends AbstractClient { private static final Random randomGenerator = new Random(); private final SyncProducerConfig config; private int sentOnConnection = 0; private long lastConnectionTime; public SyncProducer(SyncProducerConfig config) { super(config.getHost(), config.getPort(), config.getSocketTimeoutMs(), config.getConnectTimeoutMs()); this.config = config; this.lastConnectionTime = System.currentTimeMillis() - (long) (randomGenerator.nextDouble() * config.reconnectTimeInterval); } public void send(String topic, MessageList messageList) { ByteBuffer buffer = messageList.toThriftBuffer(); if (buffer.remaining() > config.maxMessageSize) { throw new MessageSizeTooLargeException("payload size of " + buffer.remaining() + " larger than " + config.maxMessageSize); } ProduceRequest produceRequest = new ProduceRequest(); produceRequest.setTopic(topic); produceRequest.setItem(buffer); send(produceRequest); } public void multiSend(List<ProduceRequest> requests) { for(ProduceRequest produceRequest : requests) { send(produceRequest); } } private void send(ProduceRequest produceRequest) { synchronized(lock) { long startTime = System.nanoTime(); getOrMakeConnection(); try { this.luxunClient.asyncProduce(produceRequest); // ProduceResponse produceResponse = this.luxunClient.produce(produceRequest); // Result result = produceResponse.getResult(); // if (result.getResultCode() != ResultCode.SUCCESS) { // RuntimeException runtimeException = ErrorMapper.toException(result.getErrorCode(), result.getErrorMessage()); // throw runtimeException; // } } catch (TException e) { // no way to tell if write succeeded. Disconnect and re-throw exception to let client handle retry disconnect(); throw new RuntimeException(e); } sentOnConnection++; if (config.getReconnectEnable()) { if (sentOnConnection >= config.reconnectCount// || (config.reconnectTimeInterval >= 0 && System.currentTimeMillis() - lastConnectionTime >= config.reconnectTimeInterval)) { reconnect(); sentOnConnection = 0; lastConnectionTime = System.currentTimeMillis(); } } final long endTime = System.nanoTime(); SyncProducerStats.recordProduceRequest(endTime - startTime); } } }