simple-bus/asynchronous
Generic PHP classes and interfaces for processing messages asynchronously with a SimpleBus MessageBus. Provides building blocks to queue, publish, and handle messages outside the request cycle; integrates with SimpleBus components and documented usage guides.
Installation:
composer require simple-bus/asynchronous
Ensure you already have simple-bus/message-bus installed (this package depends on it).
Basic Configuration:
$this->app->bind(\SimpleBus\Asynchronous\Queue\QueueInterface::class, function ($app) {
return new \SimpleBus\Asynchronous\Queue\LaravelQueue($app['queue']);
});
First Use Case:
use SimpleBus\Asynchronous\Queue\QueueInterface;
class AsyncCommandHandler
{
public function __construct(private QueueInterface $queue) {}
public function handle(YourCommand $command)
{
$this->queue->dispatch(new AsyncMessage($command->data));
}
}
Worker Setup:
SimpleBus\Asynchronous\Message:
php artisan queue:work --queue=simplebus
config/queue.php has a simplebus connection configured (e.g., database, redis, or sync).Dispatching Messages:
QueueInterface to dispatch messages asynchronously:
$this->queue->dispatch(new YourAsyncMessage($payload));
SimpleBus\Message\Message.Message Design:
JsonSerializable or Arrayable).class SendEmailMessage implements \SimpleBus\Message\Message, \JsonSerializable
{
public function __construct(private string $email, private string $content) {}
public function jsonSerialize(): array
{
return ['email' => $this->email, 'content' => $this->content];
}
}
Handling Messages:
use SimpleBus\Asynchronous\Message\MessageHandler;
class SendEmailHandler implements MessageHandler
{
public function handle(SendEmailMessage $message)
{
Mail::to($message->email)->send(new Email($message->content));
}
}
$this->app->bind(\SimpleBus\MessageBus::class, function ($app) {
$bus = new \SimpleBus\MessageBus([
new \SimpleBus\Asynchronous\Message\MessageHandler(
new SendEmailHandler(),
SendEmailMessage::class
),
]);
return $bus;
});
Integration with Laravel Jobs (Optional):
class ProcessOrderJob implements ShouldQueue
{
use DispatchesJobs;
public function handle()
{
$this->dispatch(new ProcessOrderMessage($orderId));
}
}
Error Handling:
Queue::failCallback(function ($connection, $queue, $job, $exception) {
Log::error("Async job failed: " . $exception->getMessage());
});
Serialization Issues:
JsonSerializable, Arrayable, or basic types).Queue Connection Mismatch:
QueueInterface is not bound to the correct Laravel queue connection, messages may disappear.QueueInterface binding:
$this->app->bind(\SimpleBus\Asynchronous\Queue\QueueInterface::class, function ($app) {
return new \SimpleBus\Asynchronous\Queue\LaravelQueue($app['queue'], 'simplebus');
});
Handler Registration:
MessageBus will result in unhandled messages.$bus->register(new \SimpleBus\Asynchronous\Message\MessageHandler(
new YourHandler(),
YourMessage::class
));
Worker Stuck in Processing:
ShouldQueue job wrapper.Testing Async Workflows:
Queue::fake() and expectsJobs():
public function test_async_message()
{
Queue::fake();
$this->app->make(AsyncCommandHandler::class)->handle(new YourCommand());
Queue::assertPushed(AsyncMessage::class);
}
Batch Processing:
batch():
$this->queue->dispatchBatch([
new AsyncMessage($data1),
new AsyncMessage($data2),
]);
Delayed Dispatch:
delay() to schedule messages:
$this->queue->dispatch(new AsyncMessage($data))->delay(now()->addMinutes(10));
Monitoring:
// Example: Log message dispatch
$this->queue->dispatch(new AsyncMessage($data), function ($message) {
Log::info("Dispatched async message: " . get_class($message));
});
Extending Functionality:
class RabbitMqQueue implements QueueInterface
{
public function dispatch(Message $message, ?Closure $callback = null)
{
// Custom RabbitMQ logic
}
}
Performance Tuning:
--batch=N) for optimal throughput.How can I help you explore Laravel packages today?