Adding a simple server for goes using zeromq and an agnostic serializer
This commit is contained in:
parent
0a6a591340
commit
c8168779af
|
@ -64,3 +64,21 @@ func (me *JsonSerializer) Deserialize(serialized []byte) (interface{}, error) {
|
|||
obj := reflect.Indirect(reflect.ValueOf(objPtr)).Interface()
|
||||
return obj, nil
|
||||
}
|
||||
|
||||
type PassthruSerializer struct {}
|
||||
|
||||
func NewPassthruSerializer() Serializer {
|
||||
return &PassthruSerializer{}
|
||||
}
|
||||
|
||||
func (me PassthruSerializer) Serialize(obj interface{}) ([]byte, error) {
|
||||
serialized, ok := obj.([]byte)
|
||||
if !ok {
|
||||
return nil, errors.New("Object is not a slice of bytes")
|
||||
}
|
||||
return serialized, nil
|
||||
}
|
||||
|
||||
func (me PassthruSerializer) Deserialize(serialized []byte) (interface{}, error) {
|
||||
return serialized, nil
|
||||
}
|
||||
|
|
97
simpleserver/simpleserver.go
Normal file
97
simpleserver/simpleserver.go
Normal file
|
@ -0,0 +1,97 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pebbe/zmq4"
|
||||
"github.com/satori/go.uuid"
|
||||
"bitbucket.org/nicdex/adaptech-goes"
|
||||
"os"
|
||||
"path"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("Simple ZeroMQ server for goes.")
|
||||
|
||||
//TODO: config/flag
|
||||
storagePath := path.Join(os.TempDir(), uuid.NewV4().String())
|
||||
|
||||
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
|
||||
}
|
||||
fmt.Println(command, aggregateId.String())
|
||||
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
|
||||
}
|
||||
fmt.Println(command, aggregateId.String())
|
||||
events, err := goes.RetrieveFor(aggregateId)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
sendEvents(replySocket, events)
|
||||
case "ReadAll":
|
||||
fmt.Println(command)
|
||||
events, err := goes.RetrieveAll()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
sendEvents(replySocket, events)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sendEvents(socket *zmq4.Socket, events []*goes.Event) {
|
||||
len := len(events)
|
||||
lenBytes := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(lenBytes, uint64(len))
|
||||
socket.SendBytes(lenBytes, zmq4.SNDMORE)
|
||||
|
||||
i := 0
|
||||
for ; i < len-1; i++ {
|
||||
socket.SendBytes(events[i].Payload.([]byte), zmq4.SNDMORE)
|
||||
}
|
||||
socket.SendBytes(events[i].Payload.([]byte), 0)
|
||||
}
|
Loading…
Reference in New Issue
Block a user