Skip to content

Instantly share code, notes, and snippets.

@temoto
Created October 14, 2012 23:44
Show Gist options
  • Save temoto/3890179 to your computer and use it in GitHub Desktop.
Save temoto/3890179 to your computer and use it in GitHub Desktop.
cat to ZeroMQ in Go
package main
import (
"bufio"
"flag"
"github.com/alecthomas/gozmq"
"io"
"log"
"os"
)
const ReadBufferSize = 128 << 10
func main() {
endpoint := flag.String("endpoint", "", "")
flag.Parse()
paths := flag.Args()
if len(paths) == 0 {
paths = make([]string, 1)
paths[0] = "-"
}
zmqContext, err := gozmq.NewContext()
if err != nil {
log.Fatalln(err)
}
sender, err := zmqContext.NewSocket(gozmq.DEALER)
if err != nil {
log.Fatalln("zmq.Socket:", err)
}
if err := sender.SetSockOptInt(gozmq.LINGER, 5*1000); err != nil {
log.Fatalln("zmq.SetSockOpt:", err)
}
if err := sender.Connect(*endpoint); err != nil {
log.Fatalln("zmq.Connect:", err)
}
for _, path := range paths {
var f *os.File
if path != "-" {
f, err = os.Open(path)
if err != nil {
log.Fatalln("os.Open:", path, err)
}
} else {
f = os.Stdin
}
br := bufio.NewReaderSize(f, ReadBufferSize)
for {
line, err := br.ReadBytes('\n')
if err != nil && err != io.EOF {
log.Fatalln("file.ReadBytes:", err)
}
if len(line) > 0 {
if err := sender.Send(line, 0); err != nil {
log.Fatalln("zmq.Send:", err)
}
}
if err != nil || len(line) == 0 {
break
}
}
if path != "-" {
if err := f.Close(); err != nil {
log.Fatalln("file.Close:", err)
}
}
}
// Send empty message to denote end of stream.
if err := sender.Send([]byte{}, 0); err != nil {
log.Fatalln("zmq.Send:", err)
}
if err := sender.Close(); err != nil {
log.Fatalln("zmq.socket.Close:", err)
}
zmqContext.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment