├── .gitignore ├── consumer └── main.go ├── go.mod ├── go.sum ├── publisher └── main.go └── shared.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /consumer/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/masnun/gopher-and-rabbit" 6 | "github.com/streadway/amqp" 7 | "log" 8 | "os" 9 | ) 10 | 11 | func handleError(err error, msg string) { 12 | if err != nil { 13 | log.Fatalf("%s: %s", msg, err) 14 | } 15 | 16 | } 17 | 18 | func main() { 19 | conn, err := amqp.Dial(gopher_and_rabbit.Config.AMQPConnectionURL) 20 | handleError(err, "Can't connect to AMQP") 21 | defer conn.Close() 22 | 23 | amqpChannel, err := conn.Channel() 24 | handleError(err, "Can't create a amqpChannel") 25 | 26 | defer amqpChannel.Close() 27 | 28 | queue, err := amqpChannel.QueueDeclare("add", true, false, false, false, nil) 29 | handleError(err, "Could not declare `add` queue") 30 | 31 | err = amqpChannel.Qos(1, 0, false) 32 | handleError(err, "Could not configure QoS") 33 | 34 | messageChannel, err := amqpChannel.Consume( 35 | queue.Name, 36 | "", 37 | false, 38 | false, 39 | false, 40 | false, 41 | nil, 42 | ) 43 | handleError(err, "Could not register consumer") 44 | 45 | stopChan := make(chan bool) 46 | 47 | go func() { 48 | log.Printf("Consumer ready, PID: %d", os.Getpid()) 49 | for d := range messageChannel { 50 | log.Printf("Received a message: %s", d.Body) 51 | 52 | addTask := &gopher_and_rabbit.AddTask{} 53 | 54 | err := json.Unmarshal(d.Body, addTask) 55 | 56 | if err != nil { 57 | log.Printf("Error decoding JSON: %s", err) 58 | } 59 | 60 | log.Printf("Result of %d + %d is : %d", addTask.Number1, addTask.Number2, addTask.Number1+addTask.Number2) 61 | 62 | if err := d.Ack(false); err != nil { 63 | log.Printf("Error acknowledging message : %s", err) 64 | } else { 65 | log.Printf("Acknowledged message") 66 | } 67 | 68 | } 69 | }() 70 | 71 | // Stop for program termination 72 | <-stopChan 73 | 74 | } 75 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/masnun/gopher-and-rabbit 2 | 3 | require github.com/streadway/amqp v0.0.0-20190214183023-884228600bc9 4 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/streadway/amqp v0.0.0-20190214183023-884228600bc9 h1:wR6aLKdbJ5E8m+NZWkVeT49ExjlqUe0B41zfM5/m44I= 2 | github.com/streadway/amqp v0.0.0-20190214183023-884228600bc9/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY= 3 | -------------------------------------------------------------------------------- /publisher/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/masnun/gopher-and-rabbit" 6 | "github.com/streadway/amqp" 7 | "log" 8 | "math/rand" 9 | "time" 10 | ) 11 | 12 | func handleError(err error, msg string) { 13 | if err != nil { 14 | log.Fatalf("%s: %s", msg, err) 15 | } 16 | 17 | } 18 | 19 | func main() { 20 | conn, err := amqp.Dial(gopher_and_rabbit.Config.AMQPConnectionURL) 21 | handleError(err, "Can't connect to AMQP") 22 | defer conn.Close() 23 | 24 | amqpChannel, err := conn.Channel() 25 | handleError(err, "Can't create a amqpChannel") 26 | 27 | defer amqpChannel.Close() 28 | 29 | queue, err := amqpChannel.QueueDeclare("add", true, false, false, false, nil) 30 | handleError(err, "Could not declare `add` queue") 31 | 32 | rand.Seed(time.Now().UnixNano()) 33 | 34 | addTask := gopher_and_rabbit.AddTask{Number1: rand.Intn(999), Number2: rand.Intn(999)} 35 | body, err := json.Marshal(addTask) 36 | if err != nil { 37 | handleError(err, "Error encoding JSON") 38 | } 39 | 40 | err = amqpChannel.Publish("", queue.Name, false, false, amqp.Publishing{ 41 | DeliveryMode: amqp.Persistent, 42 | ContentType: "text/plain", 43 | Body: body, 44 | }) 45 | 46 | if err != nil { 47 | log.Fatalf("Error publishing message: %s", err) 48 | } 49 | 50 | log.Printf("AddTask: %d+%d", addTask.Number1, addTask.Number2) 51 | 52 | } 53 | -------------------------------------------------------------------------------- /shared.go: -------------------------------------------------------------------------------- 1 | package gopher_and_rabbit 2 | 3 | type Configuration struct { 4 | AMQPConnectionURL string 5 | } 6 | 7 | type AddTask struct { 8 | Number1 int 9 | Number2 int 10 | } 11 | 12 | var Config = Configuration{ 13 | AMQPConnectionURL: "amqp://guest:guest@localhost:5672/", 14 | } 15 | --------------------------------------------------------------------------------