Skip to content

Modular webhook routing library for Java and Spring Boot with resilience, dead-letter queue, and metrics.

License

Notifications You must be signed in to change notification settings

limehee/hookrouter

Repository files navigation

hookrouter

Production-oriented webhook routing library for Java, with optional Spring Boot integration.

Why this library

  • Explicit routing priority with fallback: type-mappings -> category-mappings -> default-mappings
  • Pure Java core contracts for custom runtime/transport use cases
  • Spring Boot integration for configuration, dispatch pipeline, resilience, and metrics
  • Resilience4j support (retry, timeout, circuit breaker, rate limiter, bulkhead)
  • Dead-letter handling and reprocessing support
  • Fail-fast configuration validation with Spring metadata/IDE hints

Baseline

  • Java: 17+
  • Spring Boot baseline: 4.0.2
  • Build: Gradle (Version Catalog + Wrapper)
  • CI matrix: Java 17, 21, 25

Modules

Module Purpose
hookrouter-core Domain models, registries, and extension contracts
hookrouter-spring Spring runtime pipeline, routing, resilience, dead-letter, metrics

Additional sample modules are under samples/.

Install

Spring integration

Maven:

<dependency>
  <groupId>io.github.limehee</groupId>
  <artifactId>hookrouter-spring</artifactId>
  <version>${hookrouter.version}</version>
</dependency>

Gradle (Groovy DSL):

implementation 'io.github.limehee:hookrouter-spring:<version>'

Gradle (Kotlin DSL):

implementation("io.github.limehee:hookrouter-spring:<version>")

Core only (pure Java)

Maven:

<dependency>
  <groupId>io.github.limehee</groupId>
  <artifactId>hookrouter-core</artifactId>
  <version>${hookrouter.version}</version>
</dependency>

Gradle (Groovy DSL):

implementation 'io.github.limehee:hookrouter-core:<version>'

Gradle (Kotlin DSL):

implementation("io.github.limehee:hookrouter-core:<version>")

Quick Start (Spring)

hookrouter:
  platforms:
    slack:
      endpoints:
        general:
          url: "https://hooks.slack.com/services/xxx/yyy/zzz"
  default-mappings:
    - platform: "slack"
      webhook: "general"
Notification<OrderCreatedContext> notification = Notification
    .<OrderCreatedContext>builder("demo.order.created")
    .category("demo.order")
    .context(new OrderCreatedContext(orderId, customerName))
    .build();

notificationPublisher.publish(notification);

Quick Start (Pure Java)

NotificationTypeRegistry registry = new NotificationTypeRegistry();
registry.register(NotificationTypeDefinition.builder()
    .typeId("demo.event")
    .title("Demo Event")
    .defaultMessage("Demo")
    .category("general")
    .build());

Notification<String> notification = Notification.of("demo.event", "general", "payload");

Architecture

flowchart LR
    A[Business Service] --> B[NotificationPublisher]
    B --> C[Spring Event]
    C --> D[NotificationListener]
    D --> E[RoutingPolicy]
    D --> F[FormatterRegistry]
    D --> G[WebhookDispatcher]
    G --> H[Resilience Layer]
    H --> I[WebhookSender]
    G --> J[DeadLetterProcessor]
Loading

Build and Verify

./gradlew check
./scripts/verify-consumer-smoke.sh
./gradlew apiCompat -PapiBaselineVersion=<released-version>

Documentation

Project Policies

About

Modular webhook routing library for Java and Spring Boot with resilience, dead-letter queue, and metrics.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks