2016-02-15 21:34:23 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"github.com/pebbe/zmq4"
|
|
|
|
"github.com/satori/go.uuid"
|
|
|
|
"bitbucket.org/nicdex/adaptech-goes"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
fmt.Println("Simple ZeroMQ server for goes.")
|
|
|
|
|
|
|
|
//TODO: config/flag
|
|
|
|
storagePath := path.Join(os.TempDir(), uuid.NewV4().String())
|
2016-02-16 02:56:36 +00:00
|
|
|
storagePath = "c:\\dev\\go\\events"
|
2016-02-15 21:34:23 +00:00
|
|
|
|
|
|
|
goes.SetStorage(goes.NewDiskStorage(storagePath))
|
|
|
|
goes.SetSerializer(goes.NewPassthruSerializer())
|
|
|
|
|
|
|
|
context, err := zmq4.NewContext()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer context.Term()
|
|
|
|
|
|
|
|
replySocket, err := context.NewSocket(zmq4.REP)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer replySocket.Close()
|
|
|
|
|
|
|
|
//TODO: config/flag
|
|
|
|
listenAddr := "tcp://*:12345"
|
|
|
|
err = replySocket.Bind(listenAddr)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for {
|
|
|
|
message, err := replySocket.RecvMessageBytes(0)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error receiving command from client", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
2016-02-16 02:56:36 +00:00
|
|
|
fmt.Println("->", command, aggregateId.String())
|
2016-02-15 21:34:23 +00:00
|
|
|
data := message[2]
|
|
|
|
err = goes.AddEvent(goes.Event{aggregateId, data})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
replySocket.Send("Ok", 0)
|
|
|
|
case "ReadStream":
|
|
|
|
aggregateId, err := uuid.FromBytes(message[1])
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Wrong format for AggregateId", err)
|
|
|
|
break
|
|
|
|
}
|
2016-02-16 02:56:36 +00:00
|
|
|
fmt.Println("->", command, aggregateId.String())
|
2016-02-15 21:34:23 +00:00
|
|
|
events, err := goes.RetrieveFor(aggregateId)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
sendEvents(replySocket, events)
|
|
|
|
case "ReadAll":
|
2016-02-16 02:56:36 +00:00
|
|
|
fmt.Println("->", command)
|
2016-02-15 21:34:23 +00:00
|
|
|
events, err := goes.RetrieveAll()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
sendEvents(replySocket, events)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func sendEvents(socket *zmq4.Socket, events []*goes.Event) {
|
|
|
|
len := len(events)
|
2016-02-16 02:56:36 +00:00
|
|
|
socket.Send(fmt.Sprintf("%v", len), zmq4.SNDMORE)
|
2016-02-15 21:34:23 +00:00
|
|
|
|
|
|
|
i := 0
|
|
|
|
for ; i < len-1; i++ {
|
|
|
|
socket.SendBytes(events[i].Payload.([]byte), zmq4.SNDMORE)
|
|
|
|
}
|
|
|
|
socket.SendBytes(events[i].Payload.([]byte), 0)
|
2016-02-16 02:56:36 +00:00
|
|
|
fmt.Println("<-", len, "events")
|
2016-02-15 21:34:23 +00:00
|
|
|
}
|