handler

package
v1.67.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 23, 2026 License: MIT Imports: 5 Imported by: 0

README

Package handler

Пакет handler предоставляет инструменты для обработки входящих STOMP-сообщений с использованием middleware и результатной семантики (Ack / Requeue).

Types

Result

Структура Result определяет, каким образом обрабатывать входящее сообщение после выполнения логики хендлера.

Fields:

Ack bool

Сообщение успешно обработано и будет подтверждено (ACK).

Requeue bool

Сообщение не обработано, требуется повторная доставка (NACK).

Err error

Ошибка, связанная с повторной доставкой.

Methods:

Ack() Result

Создаёт результат, означающий успешную обработку сообщения (будет отправлен ACK).

Requeue(err error) Result

Создаёт результат, означающий необходимость повторной доставки сообщения (будет отправлен NACK).

HandlerAdapter

Интерфейс HandlerAdapter определяет контракт для обработки STOMP-сообщений.

AdapterFunc

Адаптер для использования обычной функции в качестве HandlerAdapter.

Methods:

(a AdapterFunc) Handle(ctx, msg)

Вызов соответствующей функции и возврат результата обработки.

ResultHandler

Структура ResultHandler реализует конечную обработку сообщения, включая выполнение middleware-цепочки, вызов хендлера и вызов Ack() / Nack() у delivery в зависимости от результата.

Methods:

NewHandler(logger log.Logger, adapter HandlerAdapter, middlewares ...Middleware) ResultHandler

Создаёт экземпляр ResultHandler, оборачивая адаптер через указанные middleware.

(r ResultHandler) Handle(ctx context.Context, delivery *consumer.Delivery)

Вызывает адаптер и в зависимости от результата вызывает Ack() или Nack() у delivery. Ошибки логируются.

Middleware

Middleware — функция, принимающая HandlerAdapter и возвращающая обёрнутый HandlerAdapter.

Log

Логирует действия хендлера (ACK или Requeue) с указанием destination.

Recovery

Предотвращает падение сервиса при панике в обработчике, преобразуя ее в ошибку.

Usage

Default usage flow
package main

import (
	"context"
	"errors"
	"github.com/go-stomp/stomp/v3"
	"github.com/txix-open/isp-kit/log"
	"github.com/txix-open/isp-kit/stompx/consumer"
	"github.com/txix-open/isp-kit/stompx/handler"
)

func main() {
	logger := log.New(log.Config{})

	h := handler.NewHandler(logger, handler.AdapterFunc(func(ctx context.Context, msg *stomp.Message) handler.Result {
		if string(msg.Body) == "fail" {
			return handler.Requeue(errors.New("failed to handle message"))
		}
		return handler.Ack()
	}), handler.Log(logger))

	// Эмуляция входящего сообщения
	delivery := &consumer.DeliveryMock{
		Message: &stomp.Message{
			Body:        []byte("hello"),
			Destination: "/queue/example",
		},
	}

	h.Handle(context.Background(), delivery)
}
DeliveryMock (пример тестового использования)
package consumer

import "github.com/go-stomp/stomp/v3"

// DeliveryMock используется в тестах для имитации доставки сообщений.
type DeliveryMock struct {
	Message *stomp.Message
	Acked   bool
	Nacked  bool
}

func (d *DeliveryMock) Source() *stomp.Message {
	return d.Message
}

func (d *DeliveryMock) Ack() error {
	d.Acked = true
	return nil
}

func (d *DeliveryMock) Nack() error {
	d.Nacked = true
	return nil
}

Documentation

Overview

Package handler provides functionality for processing STOMP messages and handling results.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AdapterFunc

type AdapterFunc func(ctx context.Context, msg *stomp.Message) Result

AdapterFunc is an adapter type that allows using functions as handler adapters.

func (AdapterFunc) Handle

func (a AdapterFunc) Handle(ctx context.Context, msg *stomp.Message) Result

Handle calls the underlying function.

type HandlerAdapter

type HandlerAdapter interface {
	Handle(ctx context.Context, msg *stomp.Message) Result
}

HandlerAdapter defines the interface for adapting message processing logic.

type Middleware

type Middleware func(next HandlerAdapter) HandlerAdapter

Middleware is a function that wraps a HandlerAdapter with additional functionality.

func Log

func Log(logger log.Logger) Middleware

Log creates a middleware that logs message processing results.

func Recovery added in v1.53.0

func Recovery() Middleware

Recovery creates a middleware that recovers from panics and requeues the message.

type Result

type Result struct {
	// Ack indicates the message should be acknowledged.
	Ack bool
	// Requeue indicates the message should be requeued (negatively acknowledged).
	Requeue bool
	// Err contains an error if the processing failed.
	Err error
}

Result represents the outcome of message processing.

func Ack

func Ack() Result

Ack returns a Result indicating successful processing.

func Requeue

func Requeue(err error) Result

Requeue returns a Result indicating the message should be requeued with an error.

type ResultHandler

type ResultHandler struct {
	// contains filtered or unexported fields
}

ResultHandler wraps a handler adapter with middleware support and result processing.

func NewHandler

func NewHandler(logger log.Logger, adapter HandlerAdapter, middlewares ...Middleware) ResultHandler

NewHandler creates a new ResultHandler with the provided logger, adapter, and optional middleware.

func (ResultHandler) Handle

func (r ResultHandler) Handle(ctx context.Context, delivery *consumer.Delivery)

Handle processes a message delivery based on the adapter's result.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL