Documentation
¶
Overview ¶
Package watercc является вспомогательной библиотекой для перехода от RabbitMQ к более универсальному сервису, поддерживающими разные серверы коммуникации.
Кроме изменения интерфейса библиотека так же предлагает готовые объекты, реализующие не только приём и отправку сообщений, но и RPC сервер и клиент, построенные поверх них.
Example ¶
package main
import (
"context"
"fmt"
"runtime"
"time"
"github.com/peterdev80/watercc"
"github.com/ThreeDotsLabs/watermill/message"
)
// amqpURI описывает адрес для подключения к RabbitMQ.
var amqpURI = "amqp://guest:guest@localhost:5672/"
func main() {
// инициализируем подписку на сообщения
subscriber, err := watercc.NewSubscriber(amqpURI, "a1.a2.a3", false)
if err != nil {
panic(err)
}
// инициализируем обработку сообщений
router, err := watercc.NewRouter()
if err != nil {
panic(err)
}
// регистрируем обработчик сообщений
router.AddNoPublisherHandler(
"my_handler", // уникальное название обработчика сообщений
"new_topic", // название темы для чтения сообщений (совпадает с темой в примере публикации)
subscriber, // подписка на приём сообщений
// обработчик входящих сообщений, публикующий их в консоль
func(msg *message.Message) error {
fmt.Printf("-> [%s] %q\n", msg.UUID, msg.Payload)
return nil
},
)
// инициализируем контекст для обработки входящих запросов
ctx, cancel := context.WithTimeout(context.Background(), time.Second*6)
defer cancel()
// запускаем обработку входящих запросов в отдельном потоке
go func() {
if err := router.Run(ctx); err != nil {
panic(err)
}
}()
runtime.Gosched() // позволяем запуститься потоку
// инициализируем новый публикатор сообщений
publisher, err := watercc.NewPublisher(amqpURI, "a1.a2.a3", false)
if err != nil {
panic(err)
}
defer publisher.Close()
// публикуем тестовые сообщения с небольшой задержкой
for messageCounter := 1; messageCounter < 5; messageCounter++ {
// задержка перед публикацией
time.Sleep(time.Second * 1)
// формируем сообщение
id := fmt.Sprintf("msg:%02d", messageCounter) // генерируем идентификатор сообщения
body := fmt.Sprintf("Hello, number %d!", messageCounter) // формируем тест сообщения
msg := message.NewMessage(id, []byte(body)) // инициализируем сообщение
// и публикуем его с использованием темы "new_topic"
if err := publisher.Publish("new_topic", msg); err != nil {
panic(err)
}
}
<-ctx.Done() // ожидаем завершения обработки
}
Output: -> [msg:01] "Hello, number 1!" -> [msg:02] "Hello, number 2!" -> [msg:03] "Hello, number 3!" -> [msg:04] "Hello, number 4!"
Index ¶
- func NewPublisher(amqpURI string, topic string, durrable bool) (message.Publisher, error)
- func NewRouter() (*message.Router, error)
- func NewSubscriber(amqpURI string, topic string, durrable bool) (message.Subscriber, error)
- func SetLogger(l watermill.LoggerAdapter)
- type Client
- type Handler
- type Server
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewPublisher ¶
NewPublisher сгенерировать издателя.
func NewRouter ¶
NewRouter возвращает новый инициализированный message.Router для обработки запросов. Это вспомогательная функция для вызова message.NewRouter с настройками по умолчанию и стандартным логом.
func NewSubscriber ¶
NewSubscriber возвращает инициализированного подписчика для получения сообщений на обработку.
func SetLogger ¶
func SetLogger(l watermill.LoggerAdapter)
SetLogger устанавливает новую систему логов для всей библиотеки.
Не является потокобезопасным, поэтому рекомендуется производить изменения лога в самом начале работы с библиотекой.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client для отсылки запросов на удалённый сервер и получения ответа на них.
func NewClient ¶
NewClient возвращает нового инициализированного клиента для отсылки запросов и получения ответов.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server используется как асинхронный обработчик входящих команд и генерации ответов на них.
Example ¶
package main
import (
"context"
"fmt"
"strings"
"github.com/peterdev80/watercc"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)
// amqpURI описывает адрес для подключения к RabbitMQ.
var amqpURI = "amqp://guest:guest@localhost:5672/"
func main() {
// инициализируем RPC сервер с именем "rpc_command"
server, err := watercc.NewServer(amqpURI, "rpc_command")
if err != nil {
panic(err)
}
defer server.Close()
// регистрируем для него обработчик команды
handler := func(m *message.Message) (*message.Message, error) {
str := strings.ToUpper(string(m.Payload))
return message.NewMessage(watermill.NewUUID(), []byte(str)), nil
}
server.Register("UpperCase", handler)
// инициализируем клиента для работы с сервером "rpc_command"
client, err := watercc.NewClient(amqpURI, "rpc_command")
if err != nil {
panic(err)
}
defer client.Close()
// отсылаем команду на сервер и ожидаем получение ответа
resp, err := client.Send(context.Background(), "UpperCase", []byte("Hello world"))
if err != nil {
panic(err)
}
fmt.Println(string(resp.Payload))
}
Output: HELLO WORLD
func (*Server) Close ¶
Close останавливает обработку входящих сообщений и закрывает соединение с сервером.
func (*Server) Register ¶
Register регистрирует новый именованный обработчик.
Название команды может быть пустым. В этом случае она регистрируется как команда по умолчанию.
func (*Server) Unregister ¶
Unregister удаляет обработчик с заданным именем. Если такая команда не зарегистрирована, то она игнорируется.