Generates Dead Letter Queue components for PHP 8.4. Creates failed message capture, retry strategy with exponential backoff, failure classification, and unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdCreates Dead Letter Queue pattern infrastructure for capturing and retrying failed messages.
| Scenario | Example |
|---|---|
| Poison messages | Messages that always cause handler failures |
| Processing failures | Temporary infrastructure issues (DB down, timeout) |
| Audit trail | Track all failed message processing attempts |
| Retry mechanism | Automatic retry with exponential backoff |
| Monitoring | Alert on DLQ threshold exceeded |
Determine:
Domain Layer (src/Domain/Shared/DeadLetter/)
FailureType.php — Enum (Transient, Permanent, Unknown)DeadLetterMessage.php — Message entityApplication Layer (src/Application/Shared/DeadLetter/)
DeadLetterStoreInterface.php — Storage portDeadLetterHandler.php — Exception handlerRetryStrategy.php — Retry configuration and backoff calculationFailureClassifier.php — Exception classificationDlqProcessor.php — Retry processorInfrastructure Layer (src/Infrastructure/DeadLetter/)
DatabaseDeadLetterStore.php — PDO implementationTests
DeadLetterMessageTest.phpRetryStrategyTest.phpFailureClassifierTest.phpDlqProcessorTest.php| Layer | Path |
|---|---|
| Domain Types | src/Domain/Shared/DeadLetter/ |
| Application | src/Application/Shared/DeadLetter/ |
| Infrastructure | src/Infrastructure/DeadLetter/ |
| Unit Tests | tests/Unit/{Layer}/{Path}/ |
Message → Handler fails → DeadLetterHandler → Store to DLQ
↓
DlqProcessor retries
↓
Success → Remove from DLQ
Failure → Re-store with incremented attempts
Max exceeded → Mark as permanently failed
| Component | Pattern | Example |
|---|---|---|
| Failure Enum | FailureType | FailureType |
| Message Entity | DeadLetterMessage | DeadLetterMessage |
| Store Interface | DeadLetterStoreInterface | DeadLetterStoreInterface |
| Handler | DeadLetterHandler | DeadLetterHandler |
| Strategy | RetryStrategy | RetryStrategy |
| Classifier | FailureClassifier | FailureClassifier |
| Processor | DlqProcessor | DlqProcessor |
| Test | {ClassName}Test | RetryStrategyTest |
final class DeadLetterMessage
{
public function __construct(
public readonly string $id,
public readonly string $originalBody,
public readonly string $originalRoutingKey,
public readonly array $originalHeaders,
public readonly string $errorMessage,
public readonly string $errorTrace,
public readonly FailureType $failureType,
public readonly int $attemptCount,
public readonly \DateTimeImmutable $failedAt,
public readonly ?\DateTimeImmutable $nextRetryAt,
public readonly ?\DateTimeImmutable $resolvedAt = null,
) {}
public function isRetryable(int $maxAttempts): bool;
public function withIncrementedAttempt(\DateTimeImmutable $nextRetryAt): self;
}
interface DeadLetterStoreInterface
{
public function store(DeadLetterMessage $message): void;
/** @return array<DeadLetterMessage> */
public function findRetryable(int $limit = 100): array;
public function markRetried(string $id, \DateTimeImmutable $nextRetryAt): void;
public function markResolved(string $id): void;
public function purge(\DateTimeImmutable $before): int;
public function countByType(FailureType $type): int;
}
CREATE TABLE dead_letter_messages (
id VARCHAR(255) PRIMARY KEY,
original_body TEXT NOT NULL,
original_routing_key VARCHAR(255) NOT NULL,
original_headers JSONB NOT NULL DEFAULT '{}',
error_message TEXT NOT NULL,
error_trace TEXT,
failure_type VARCHAR(50) NOT NULL,
attempt_count INTEGER NOT NULL DEFAULT 1,
failed_at TIMESTAMP(6) NOT NULL,
next_retry_at TIMESTAMP(6),
resolved_at TIMESTAMP(6)
);
CREATE INDEX idx_dlq_retryable ON dead_letter_messages (failure_type, next_retry_at)
WHERE resolved_at IS NULL AND failure_type != 'permanent';
CREATE INDEX idx_dlq_failed_at ON dead_letter_messages (failed_at);
For complete PHP templates and test examples, see:
references/templates.md — All component templatesreferences/examples.md — Message broker integration example and unit testsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.