Production-oriented webhook routing library for Java, with optional Spring Boot integration.
- 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
- Java: 17+
- Spring Boot baseline: 4.0.2
- Build: Gradle (Version Catalog + Wrapper)
- CI matrix: Java 17, 21, 25
| 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/.
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>")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>")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);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");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]
./gradlew check
./scripts/verify-consumer-smoke.sh
./gradlew apiCompat -PapiBaselineVersion=<released-version>- Index:
docs/index.md - Getting started:
docs/getting-started.md - Spring guide:
docs/spring-boot-guide.md - Dead letter guide:
docs/dead-letter-guide.md - Pure Java guide:
docs/pure-java-guide.md - Configuration reference:
docs/configuration-reference.md - Testing/quality:
docs/testing-and-quality.md - Release checklist:
docs/release-checklist.md
- Contributing:
CONTRIBUTING.md - Security:
SECURITY.md - Issue templates:
.github/ISSUE_TEMPLATE