oliverdavies.uk/source/_posts/queuing-private-messages-drupal-8.md

85 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Queuing Private Messages in Drupal 8
date: 2018-02-27
excerpt: Introducing the Private Message Queue module for Drupal 8.
tags:
- drupal
- drupal-8
- drupal-modules
- drupal-planet
- open-source
---
My current project at [Microserve][0] is a Drupal 8 website that uses the
[Private Message][1] module for users to send messages to each other.
In some cases though, the threads could contain hundreds of recipients so I
decided that it would be good to queue the message requests so that they can be
processed as part of a background process for better performance. The Private
Message module does not include this, so I've written and released a separate
[Private Message Queue][2] module.
## Queuing a Message
The module provices a `PrivateMessageQueuer` service
(`private_message_queue.queuer`) which queues the items via the `queue()`
method.
The method accepts an array of `User` objects as the messsage recipients, the
message body text and another user as the message owner. (Im currently
considering [whether to make the owner optional][4], and default to the current
user if one is not specified)
Here is an example:
```php
$recipients = $this->getRecipients(); // An array of User objects.
$message = 'Some message text';
$owner = \Drupal::currentUser();
$queuer = \Drupal::service('private_message_queue.queuer');
$queuer->queue($recipients, $message, $owner);
```
These three pieces of data are then saved as part of the queued item. You can
see these by checking the "queue" table in the database or by running
`drush queue-list`.
![](/images/blog/private-message-queue.png)
```
$ drush queue-list
Queue Items Class
private_message_queue 19 Drupal\Core\Queue\DatabaseQueue
```
## Processing the Queue
The module also provides a `PrivateMessageQueue` queue worker, which processes
the queued items. For each item, it creates a new private message setting the
owner and the message body.
It uses the `PrivateMessageThread` class from the Private Message module to find
for an existing thread for the specified recipients, or creates a new thread if
one isn't found. The new message is then added to the thread.
The queue is processed on each cron run, so I recommend adding a module like
[Ultimate Cron][3] so that you can process the queued items frequently (e.g.
every 15 minutes) and run the heavier tasks like checking for updates etc less
frequently (e.g. once a day).
You can also process the queue manually with Drush using the
`drush queue-run <queue-name>` command - e.g.
`drush queue-run private_message_queue`.
```
$ drush queue-run private_message_queue
Processed 19 items from the private_message_queue queue in 3.34 sec.
```
[0]: {{site.companies.microserve.url}}
[1]: https://www.drupal.org/project/private_message
[2]: https://www.drupal.org/project/private_message_queue
[3]: https://www.drupal.org/project/ultimate_cron
[4]: https://www.drupal.org/project/private_message_queue/issues/2948233