// Produce sends given produce request to kafka node and returns related // response. Sending request with no ACKs flag will result with returning nil // right after sending request, without waiting for response. // Calling this method on closed connection will always return ErrClosed. func (c *connection) Produce(req *proto.ProduceReq) (*proto.ProduceResp, error) { var ok bool if req.CorrelationID, ok = <-c.nextID; !ok { return nil, c.stopErr } if req.RequiredAcks == proto.RequiredAcksNone { _, err := req.WriteTo(c.rw) return nil, err } respc, err := c.respWaiter(req.CorrelationID) if err != nil { c.logger.Error("msg", "failed waiting for response", "error", err) return nil, fmt.Errorf("wait for response: %s", err) } if _, err := req.WriteTo(c.rw); err != nil { c.logger.Error("msg", "cannot write", "error", err) c.releaseWaiter(req.CorrelationID) return nil, err } b, ok := <-respc if !ok { return nil, c.stopErr } return proto.ReadProduceResp(bytes.NewReader(b)) }
// Produce sends given produce request to kafka node and returns related // response. Sending request with no ACKs flag will result with returning nil // right after sending request, without waiting for response. // Calling this method on closed connection will always return ErrClosed. func (c *connection) Produce(req *proto.ProduceReq) (*proto.ProduceResp, error) { var ok bool if req.CorrelationID, ok = <-c.nextID; !ok { return nil, c.stopErr } if _, err := req.WriteTo(c.conn); err != nil { return nil, err } if req.RequiredAcks == proto.RequiredAcksNone { return nil, nil } b, ok := <-c.respc[req.CorrelationID] if !ok { return nil, c.stopErr } return proto.ReadProduceResp(bytes.NewReader(b)) }