Installation:
composer require enqueue/mongodb
Ensure MongoDB is running locally or accessible via connection string.
Basic Configuration:
use Enqueue\MongoDB\MongoDBConnectionFactory;
use Enqueue\Client\Producer;
$connection = MongoDBConnectionFactory::createConnection(
'mongodb://localhost:27017',
'enqueue'
);
$producer = new Producer($connection);
First Use Case:
$producer->send(new Message('Hello MongoDB Queue!'));
src/MongoDBConnectionFactory.php – Core connection logic.src/MongoDBContext.php – Context for queue operations.src/MongoDBConnection.php – Connection management.Producer Workflow:
Producer to dispatch jobs to MongoDB collections (e.g., jobs, delayed_jobs).$producer->send(new Message('task', ['data' => 'payload']));
Consumer Workflow:
Consumer to process messages from MongoDB:
$consumer = new Consumer($connection);
$consumer->consume(function (Message $message, Context $context) {
// Process message
$context->ack();
});
Delayed Jobs:
delayed_jobs collection for scheduled tasks:
$producer->send(new Message('delayed_task', ['delay' => 3600])); // Delay 1 hour
Error Handling:
Context:
$context->reject($message, new Exception('Failed'), 3); // Retry 3 times
Service Provider:
use Enqueue\MongoDB\MongoDBConnectionFactory;
use Illuminate\Support\ServiceProvider;
class MongoDBQueueServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton('mongodb.connection', function () {
return MongoDBConnectionFactory::createConnection(
config('queue.mongodb.connection'),
config('queue.mongodb.database')
);
});
}
}
Queue Configuration:
'queue' => [
'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'connection' => 'mongodb://localhost:27017',
'database' => 'enqueue',
'queue' => 'default', // Optional: Custom collection name
],
],
],
Job Dispatch:
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessOrder implements ShouldQueue {
use Queueable;
public function handle() {
// Job logic
}
}
ProcessOrder::dispatch();
Connection Management:
mongo --host localhost --port 27017 --eval 'db.runCommand({ping: 1})'
.env or config files.Collection Naming:
jobs, delayed_jobs) must exist. Create them manually if needed:
$collection = $connection->getCollection('jobs');
$collection->createIndex(['priority' => -1, 'delay' => 1]);
Message Serialization:
Concurrency Issues:
findAndModify or transactions (MongoDB 4.0+) for critical operations.Log Messages:
Enable debug logging for the enqueue/mongodb package:
$connection->setLogger(new Monolog\Logger('mongodb', [new Monolog\Handler\StreamHandler('storage/logs/mongodb.log')]));
Check Collections:
mongoexport --db enqueue --collection jobs --out jobs.json
Common Errors:
OperationFailure: Likely a connection issue or invalid collection name.Timeout: Increase MongoDB’s socketTimeoutMS or check network latency.Custom Collections:
Override default collections via MongoDBConnectionFactory:
$connection = MongoDBConnectionFactory::createConnection(
'mongodb://localhost:27017',
'enqueue',
'custom_jobs', // Custom queue collection
'custom_delayed' // Custom delayed collection
);
Middleware:
Add processing logic via Middleware:
$connection->addMiddleware(new class implements Middleware {
public function handle(Message $message, Context $context, callable $next) {
// Pre-process
$result = $next($message, $context);
// Post-process
return $result;
}
});
Bulk Operations: Use MongoDB’s bulk write API for efficiency:
$bulk = new \MongoDB\Driver\BulkWrite;
$bulk->insert([new Message('task1'), new Message('task2')]);
$connection->getCollection('jobs')->executeBulkWrite($bulk);
How can I help you explore Laravel packages today?