1. Run4C3Demo
src/main/java/com/example/outboxdeepdive/demo/Run4C3Demo.javaVerdrahtet Order-Service, Outbox, Broker und Billing-Consumer zu einem ausführbaren End-to-End-Szenario.
- Typ
- class Run4C3Demo
- Verwendet
- PlaceOrderService, InMemoryOutboxRepository, OutboxPublisher, FakeBroker, BillingConsumer
- Verwendet von
- —
- Einstiege
- main(String[] args)
package com.example.outboxdeepdive.demo;
import com.example.outboxdeepdive.billing.*;
import com.example.outboxdeepdive.broker.*;
import com.example.outboxdeepdive.order.*;
import com.example.outboxdeepdive.outbox.*;
import com.example.outboxdeepdive.shared.*;
import java.time.Instant;
public final class Run4C3Demo {
public static void main(String[] args) {
var orders = new InMemoryOrderRepository();
var outbox = new InMemoryOutboxRepository();
var broker = new FakeBroker();
var service = new PlaceOrderService(orders, outbox);
var publisher = new OutboxPublisher(outbox, broker, 10, 3);
Instant now = Instant.parse("2026-01-01T10:00:00Z");
service.placeOrder("O-100", Money.eur("129.90"), now);
broker.failNextPublishes(1);
publisher.publishDue(now); // failed, retry scheduled
publisher.publishDue(now.plusSeconds(5)); // still not due
publisher.publishDue(now.plusSeconds(20)); // sent
var idem = new InMemoryIdempotencyStore();
var invoices = new InvoiceRepository();
var consumer = new BillingConsumer(idem, invoices);
var event = broker.published().getFirst();
consumer.onMessage(event);
consumer.onMessage(event); // duplicate delivery must not create second invoice
System.out.println("RUN4C3_DEMO_OK orders=" + orders.size() + " outbox=" + outbox.all().size() + " broker=" + broker.published().size() + " invoices=" + invoices.invoices().size());
}
}