2016-08-26 20:32:04 +00:00
|
|
|
package main
|
2016-02-13 01:54:50 +00:00
|
|
|
|
|
|
|
import (
|
2016-08-26 20:32:04 +00:00
|
|
|
"fmt"
|
|
|
|
actions "./actions"
|
|
|
|
storage "./storage"
|
|
|
|
serializer "./serializer"
|
|
|
|
data "./data"
|
2016-02-13 01:54:50 +00:00
|
|
|
"github.com/satori/go.uuid"
|
2016-08-26 20:32:04 +00:00
|
|
|
"github.com/pebbe/zmq4"
|
|
|
|
"flag"
|
|
|
|
"os"
|
|
|
|
"path"
|
2016-02-13 01:54:50 +00:00
|
|
|
)
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
var addr = flag.String("addr", "tcp://127.0.0.1:12345", "zeromq address to listen to")
|
|
|
|
var db = flag.String("db", fmt.Sprintf(".%cevents", os.PathSeparator), "path for storage")
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
func PathIsAbsolute(s string) bool {
|
|
|
|
if len(s) > 1 && s[1] == ':' {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return path.IsAbs(s)
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
func main() {
|
|
|
|
fmt.Println("Simple ZeroMQ server for goes.")
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
flag.Parse()
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
storagePath := *db
|
|
|
|
if !PathIsAbsolute(storagePath) {
|
|
|
|
wd, _ := os.Getwd()
|
|
|
|
storagePath = path.Join(wd, storagePath)
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
fmt.Println("Listening on:", *addr)
|
|
|
|
fmt.Println("Storage path:", storagePath)
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
var handler = actions.NewActionsHandler(storage.NewDailyDiskStorage(storagePath), serializer.NewPassthruSerializer())
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
context, err := zmq4.NewContext()
|
2016-02-13 01:54:50 +00:00
|
|
|
if err != nil {
|
2016-08-26 20:32:04 +00:00
|
|
|
panic(err)
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
2016-08-26 20:32:04 +00:00
|
|
|
defer context.Term()
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
replySocket, err := context.NewSocket(zmq4.REP)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer replySocket.Close()
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
err = replySocket.Bind(*addr)
|
2016-02-13 01:54:50 +00:00
|
|
|
if err != nil {
|
2016-08-26 20:32:04 +00:00
|
|
|
panic(err)
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
for {
|
|
|
|
message, err := replySocket.RecvMessageBytes(0)
|
2016-02-13 01:54:50 +00:00
|
|
|
if err != nil {
|
2016-08-26 20:32:04 +00:00
|
|
|
fmt.Println("Error receiving command from client", err)
|
|
|
|
continue
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
command := string(message[0])
|
|
|
|
switch command {
|
|
|
|
case "AddEvent":
|
|
|
|
aggregateId, err := uuid.FromBytes(message[1])
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Wrong format for AggregateId", err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fmt.Println("->", command, aggregateId.String())
|
|
|
|
payload := message[2]
|
|
|
|
err = handler.AddEvent(data.Event{AggregateId: aggregateId, Payload: payload})
|
|
|
|
if err != nil {
|
|
|
|
replySocket.Send(fmt.Sprintf("Error: %v", err), 0)
|
|
|
|
fmt.Println(err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
replySocket.Send("Ok", 0)
|
|
|
|
case "ReadStream":
|
|
|
|
aggregateId, err := uuid.FromBytes(message[1])
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Wrong format for AggregateId", err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fmt.Println("->", command, aggregateId.String())
|
|
|
|
events, err := handler.RetrieveFor(aggregateId)
|
|
|
|
if err != nil {
|
|
|
|
replySocket.Send(fmt.Sprintf("Error: %v", err), 0)
|
|
|
|
fmt.Println(err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
sendEvents(replySocket, events)
|
|
|
|
case "ReadAll":
|
|
|
|
fmt.Println("->", command)
|
|
|
|
events, err := handler.RetrieveAll()
|
|
|
|
if err != nil {
|
|
|
|
replySocket.Send(fmt.Sprintf("Error: %v", err), 0)
|
|
|
|
fmt.Println(err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
sendEvents(replySocket, events)
|
|
|
|
case "Shutdown":
|
|
|
|
fmt.Println("->", command)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
func sendEvents(socket *zmq4.Socket, events []*data.Event) {
|
|
|
|
len := len(events)
|
|
|
|
socket.Send(fmt.Sprintf("%v", len), zmq4.SNDMORE)
|
2016-02-13 01:54:50 +00:00
|
|
|
|
2016-08-26 20:32:04 +00:00
|
|
|
i := 0
|
|
|
|
for ; i < len-1; i++ {
|
|
|
|
socket.SendBytes(events[i].Payload.([]byte), zmq4.SNDMORE)
|
2016-02-13 01:54:50 +00:00
|
|
|
}
|
2016-08-26 20:32:04 +00:00
|
|
|
socket.SendBytes(events[i].Payload.([]byte), 0)
|
|
|
|
fmt.Println("<-", len, "events")
|
|
|
|
}
|