4 releases

Uses new Rust 2024

new 0.3.5 Mar 8, 2026
0.3.0 Mar 8, 2026
0.2.1 Mar 4, 2026
0.2.0 Mar 2, 2026

#976 in Network programming


Used in 7 crates

Apache-2.0

585KB
11K SLoC

camel-core

Core routing engine for rust-camel

Overview

camel-core is the heart of the rust-camel framework. It provides the CamelContext for managing routes, the Registry for component registration, and the core route execution engine. This crate orchestrates all the other components to enable message routing.

This is the main crate you'll use when building a rust-camel application. It brings together components, processors, and routes into a cohesive integration framework.

Features

  • CamelContext: Central context for managing routes and components
  • Registry: Component registry for endpoint resolution
  • Route: Route definitions and lifecycle management
  • RouteController: Start, stop, suspend, and resume routes
  • Pipeline composition: Tower-based middleware composition
  • Hot-reload: Live route updates with ArcSwap (no downtime)
  • Supervision: Auto-recovery with configurable exponential backoff
  • Tracer Integration: Automatic message flow tracing support
  • Health Monitoring: Service health checks via health_check() method
  • Bean Integration: BeanRegistry support for YAML DSL bean step resolution

Installation

Add to your Cargo.toml:

[dependencies]
camel-core = "0.2"

Usage

Creating a Camel Context

use camel_core::CamelContext;
use camel_builder::RouteBuilder;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create the context
    let mut ctx = CamelContext::new();

    // Register components
    ctx.register_component("timer", Box::new(camel_component_timer::TimerComponent::new()));
    ctx.register_component("log", Box::new(camel_component_log::LogComponent::new()));
    ctx.register_component("mock", Box::new(camel_component_mock::MockComponent::new()));

    // Build and add routes
    let route = RouteBuilder::from("timer:hello?period=1000")
        .log("Timer fired!", camel_processor::LogLevel::Info)
        .to("mock:result")
        .build()?;

    ctx.add_route(route).await?;

    // Start all routes
    ctx.start().await?;

    // ... run your application

    // Graceful shutdown
    ctx.stop().await?;

    Ok(())
}

Route Lifecycle Management

// Start a specific route
ctx.start_route("my-route").await?;

// Suspend a route (pauses consumer intake, allows in-flight exchanges to complete)
ctx.suspend_route("my-route").await?;

// Resume a suspended route (restarts consumer intake)
ctx.resume_route("my-route").await?;

// Stop a route
ctx.stop_route("my-route").await?;

// Check route status
let status = ctx.route_status("my-route");

Health Monitoring

CamelContext provides a health_check() method to monitor the status of all registered services.

Usage

use camel_core::context::CamelContext;
use camel_api::{HealthStatus, ServiceStatus};

let ctx = CamelContext::new();

// Add services (they implement the Lifecycle trait)
// ctx.with_lifecycle(prometheus_service);

// Check health of all services
let report = ctx.health_check();

match report.status {
    HealthStatus::Healthy => println!("All services are healthy"),
    HealthStatus::Unhealthy => {
        for service in &report.services {
            if service.status != ServiceStatus::Started {
                println!("Service {} is {:?}", service.name, service.status);
            }
        }
    }
}

Integration with Prometheus

When using camel-prometheus, the health check is automatically exposed via HTTP endpoints:

  • /healthz - Kubernetes liveness probe
  • /readyz - Kubernetes readiness probe (returns 503 if unhealthy)
  • /health - Detailed JSON health report

See the camel-prometheus crate for Kubernetes integration examples.

Core Types

Type Description
CamelContext Main context for route management
Registry Component and endpoint registry
Route A configured route
RouteDefinition Route builder output
RouteController Lifecycle management trait
SupervisingRouteController Auto-recovery with exponential backoff for crashed consumers
DefaultRouteController Default implementation with optional BeanRegistry (with_beans())

Architecture

┌─────────────────────────────────────┐
│           CamelContext              │
│  ┌─────────────────────────────┐   │
│  │         Registry            │   │
│  │  ┌───────┐ ┌───────┐       │   │
│  │  │Timer  │ │ Log   │  ...  │   │
│  │  │Comp   │ │ Comp  │       │   │
│  │  └───────┘ └───────┘       │   │
│  └─────────────────────────────┘   │
│  ┌─────────────────────────────┐   │
│  │         Routes              │   │
│  │  Route 1  │  Route 2...│   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

Advanced Features

SupervisingRouteController

Wraps any route controller with automatic recovery using configurable exponential backoff. When a consumer crashes, it automatically restarts after a delay that increases with each failure.

Hot-reload System

Live route updates without service restart using ArcSwap and ReloadCoordinator. Update route definitions at runtime with zero downtime.

ControlBus Integration

Dynamic route lifecycle management via the control bus pattern. Start, stop, suspend, and resume routes programmatically.

Bean Integration

Use DefaultRouteController::with_beans() to enable bean step resolution in YAML DSL routes:

use camel_core::DefaultRouteController;
use camel_bean::BeanRegistry;

let mut bean_registry = BeanRegistry::new();
bean_registry.register("orderService", OrderService);

let controller = DefaultRouteController::with_beans(bean_registry);
// Pass controller to CamelContext::with_controller()

See examples/bean-demo for a complete example.

Documentation

License

Apache-2.0

Contributing

Contributions are welcome! Please see the main repository for details.

Dependencies

~14–31MB
~326K SLoC