89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/Shopify/sarama"
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2"
|
|
cloudevents "github.com/cloudevents/sdk-go/v2"
|
|
"github.com/cloudevents/sdk-go/v2/binding"
|
|
)
|
|
|
|
// In order to run this test, look at documentation in https://github.com/cloudevents/sdk-go/blob/master/v2/samples/kafka/README.md
|
|
func main() {
|
|
saramaConfig := sarama.NewConfig()
|
|
saramaConfig.Version = sarama.V2_0_0_0
|
|
|
|
ctx := context.Background()
|
|
|
|
// With NewProtocol you can use the same client both to send and receive.
|
|
protocol, err := kafka_sarama.NewProtocol([]string{"127.0.0.1:9092"}, saramaConfig, "output-topic", "input-topic")
|
|
if err != nil {
|
|
log.Fatalf("failed to create protocol: %s", err.Error())
|
|
}
|
|
|
|
defer protocol.Close(context.Background())
|
|
|
|
// Pipe all incoming message, eventually transforming them
|
|
go func() {
|
|
for {
|
|
// Blocking call to wait for new messages from protocol
|
|
inputMessage, err := protocol.Receive(ctx)
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
return // Context closed and/or receiver closed
|
|
}
|
|
log.Printf("Error while receiving a inputMessage: %s", err.Error())
|
|
continue
|
|
}
|
|
defer inputMessage.Finish(nil)
|
|
|
|
outputMessage := inputMessage
|
|
|
|
// If encoding is unknown, then the inputMessage is a non cloudevent
|
|
// and we need to convert it
|
|
if inputMessage.ReadEncoding() == binding.EncodingUnknown {
|
|
// We need to get the inputMessage internals
|
|
// Because the message could be wrapped by the protocol implementation
|
|
// we need to unwrap it and then cast to the message representation
|
|
// specific to the protocol
|
|
kafkaMessage := binding.UnwrapMessage(inputMessage).(*kafka_sarama.Message)
|
|
|
|
// Now let's create a new event
|
|
event := cloudevents.NewEvent()
|
|
event.SetID(uuid.New().String())
|
|
event.SetTime(time.Now())
|
|
event.SetType("generated.examples")
|
|
event.SetSource("https://github.com/cloudevents/sdk-go/v2/samples/kafka/sender")
|
|
|
|
err := event.SetData(kafkaMessage.ContentType, kafkaMessage.Value)
|
|
if err != nil {
|
|
log.Printf("Error while setting the event data: %s", err.Error())
|
|
continue
|
|
}
|
|
outputMessage = binding.ToMessage(&event)
|
|
}
|
|
|
|
// Send outputMessage directly to output-topic
|
|
err = protocol.Send(ctx, outputMessage)
|
|
if err != nil {
|
|
log.Printf("Error while forwarding the inputMessage: %s", err.Error())
|
|
}
|
|
}
|
|
}()
|
|
|
|
// Start the Kafka Consumer Group invoking OpenInbound()
|
|
go func() {
|
|
if err := protocol.OpenInbound(ctx); err != nil {
|
|
log.Printf("failed to StartHTTPReceiver, %v", err)
|
|
}
|
|
}()
|
|
|
|
<-ctx.Done()
|
|
}
|