EventBus is a simple and efficient event-driven system for Go applications.
It allows you to publish and subscribe to events seamlessly.
To install the library, run:
go get github.com/Raezil/GoEventBus
mkdir eventbus-demo
cd eventbus-demo
go mod init eventbus-demo
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
gbus "github.com/Raezil/GoEventBus"
"github.com/gorilla/mux"
)
// HouseWasSold represents an event for a house sale.
type HouseWasSold struct{}
// NewDispatcher sets up event handlers.
func NewDispatcher() *gbus.Dispatcher {
return &gbus.Dispatcher{
HouseWasSold{}: func(data map[string]interface{}) (gbus.Result, error) {
price, ok := data["price"].(int)
if !ok {
return gbus.Result{}, fmt.Errorf("invalid or missing 'price'")
}
message := fmt.Sprintf("House sold for %d!", price)
log.Println(message)
return gbus.Result{Message: message}, nil
},
}
}
func main() {
dispatcher := NewDispatcher()
eventStore := gbus.NewEventStore(dispatcher)
router := mux.NewRouter()
router.HandleFunc("/house-sold", func(w http.ResponseWriter, r *http.Request) {
eventStore.Publish(gbus.NewEvent(HouseWasSold{}, map[string]interface{}{"price": 100}))
if err := eventStore.Broadcast(); err != nil {
log.Printf("Error broadcasting event: %v", err)
http.Error(w, "Event processing failed", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "House sold event published"})
})
log.Println("Server running on :8080")
log.Fatal(http.ListenAndServe(":8080", router))
}
go run main.go
Now, visiting http://localhost:8080/house-sold
will trigger the event and process it.
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0-management
package main
import (
"fmt"
"log"
. "github.com/Raezil/GoEventBus"
)
func NewDispatcher() *RabbitDispatcher {
return &RabbitDispatcher{
"HouseWasSold": func(data map[string]interface{}) (Result, error) {
price, ok := data["price"].(float64)
if !ok {
return Result{}, fmt.Errorf("invalid or missing 'price'")
}
return Result{Message: fmt.Sprintf("House sold for %.2f", price)}, nil
},
}
}
func main() {
dispatcher := NewDispatcher()
rabbitStore, err := NewRabbitEventStore(dispatcher, "amqp://guest:guest@localhost:5672/", "events_queue")
if err != nil {
log.Fatalf("Failed to initialize RabbitEventStore: %v", err)
}
rabbitStore.Publish(&Event{Id: "12345", Projection: "HouseWasSold", Args: map[string]interface{}{"price": 100.0}})
rabbitStore.Publish(&Event{Id: "123456", Projection: "HouseWasSold", Args: map[string]interface{}{"price": 200.0}})
go rabbitStore.Broadcast()
select {}
}
go run main.go