Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

23.2.5. Configuration d'un worker

Il est possible de préciser comment Hibernate Search interagit avec Lucene par la configuration de worker. Il existe plusieurs composants architecturaux et points d'extension possibles. Voyons cela de plus près.
Il y a tout d'abord un Worker. Une implémentation de l'interface Worker est responsable de recevoir tous les changements d'entité, de les mettre en file d'attente selon le contexte et de les appliquer une fois que le contexte prend fin. Le contexte le plus intuitif, en connexion à ORM, est la transaction. Pour cette raison, Hibernate Search utilisera par défaut le TransactionalWorker pour scoper tous les changements par transaction. On peut, cependant, imaginer un scénario où le contexte dépend, par exemple, du nombre de changements d'entités ou d'autres événements d'applications (cycle de vie). Pour cette raison, l'implémentation Worker est configurable, comme on peut le voir dans Tableau 23.1, « Configuration de l'étendue ».

Tableau 23.1. Configuration de l'étendue

Property Description
hibernate.search.worker.scope Le nom de classe complet de l'implémentation de Worker à utiliser. Si cette propriété n'est pas définie, est vide ou transaction, le TransactionalWorker par défaut sera utilisé.
hibernate.search.worker.* Toutes les propriétés de configuration ayant comme préfixe hibernate.search.worker sont passées au worker pendant l'initialisation. Cela permet d'ajouter des paramètres spécifiques au worker et personnalisés.
hibernate.search.worker.batch_size Définit le nombre maximal d'opérations d'indexation par lots de contexte. Une fois la limite atteinte, l'indexation se déclenchera même si le contexte n'est pas encore terminé. Cette propriété ne fonctionne que si l'implémentation du worker délègue le travail en file d'attente à BatchedQueueingProcessor (ce que fait le TransactionalWorker)
Une fois qu'un contexte se termine, il est temps de préparer et d'appliquer les modifications d'index. Cela peut être fait, de façon synchrone ou asynchrone, à partir d'un nouveau thread. Les mises à jour synchrones ont l'avantage que l'index est en synchronisation avec les bases de données en permanence . Les mises à jour asynchrones, en revanche, peuvent aider à minimiser le temps de réponse utilisateur. L'inconvénient est qu'il puisse y avoir des divergences entre les états d'indexes et de bases de données. Étudions les options de configuration indiquées dans Tableau 23.2, « Configuration d'exécution ».

Note

Les options suivantes peuvent être différentes pour chaque index; en fait, elles ont besoin du préfixe indexName, ou bien, utiliser default pour définir la valeur par défaut pour tous les indexes.

Tableau 23.2. Configuration d'exécution

Property Description
hibernate.search.<indexName>.​worker.execution
sync: exécution synchronisée (valeur par défaut)
async: exécution asynchronisée
hibernate.search.<indexName>.​worker.thread_pool.size Le backend peut appliquer des mises à jour depuis le même contexte de transaction (ou lot) en parallèle, à l'aide d'un pool de threads. La valeur par défaut est 1. Vous pouvez expérimenter avec des valeurs plus grandes si vous avez beaucoup d'opérations par transaction.
hibernate.search.<indexName>.​worker.buffer_queue.max Définit le nombre maximal de files d'attente de travail si le pool de threads n'est pas alimenté. Utile uniquement pour une exécution asynchrone. Par défaut à l'infini. Si la limite est atteinte, le travail sera effectué par le thread principal.
Jusqu'à présent, tout le travail est fait dans la même Machine virtuelle (VM), quel que soit le mode d'exécution. Le montant total de travail ne change pas pour la machine virtuelle. Heureusement, il y a une meilleure approche: la délégation. Il est possible d'envoyer le travail d'indexation sur un autre serveur en configurant hibernate.search.default.worker.backend - voir Tableau 23.3, « Configuration Backend ». Encore une fois, cette option peut être configurée différemment pour chaque index.

Tableau 23.3. Configuration Backend

Property Description
hibernate.search.<indexName>.​worker.backend
lucene: le backend par défaut qui exécute les mises à jour des indexes dans une même VM. Utilisé également quand la propriété est indéfinie ou vide.
jms: JMS backend. Les mises à jour d'indexes sont envoyées dans une file d'attente JMS afin d'être traitées par un master d'indexation. Voir Tableau 23.4, « Configuration de JMS Backend » pour obtenir des options de configuration supplémentaires et Section 23.2.5.1, « JMS Master/Esclave Backend » pour obtenir une description plus détaillée pour cette installation.
blackhole: une configuration test/developer qui ignore tout le travail d'indexation
Vous pouvez également spécifier le nom complet d'une classe qui implémente BackendQueueProcessor. De cette façon, vous pouvez implémenter votre propre couche de communication. L'implémentation est chargée de retourner une instance Runnable (exécutable) qui, sur l'exécution, traitera le travail de l'index.

Tableau 23.4. Configuration de JMS Backend

Property Description
hibernate.search.<indexName>.​worker.jndi.* Définit les propriétés JNDI pour initier InitialContext (si besoin est). JNDI n'est utilisé que par JMS Backend.
hibernate.search.<indexName>.​worker.jms.connection_factory Obligatoire avec JMS Backend. Définit le nom JNDI pour rechercher la fabrique de connexions JMS (/ ConnectionFactory par défaut dans Red Hat JBoss Enterprise Application Platform)
hibernate.search.<indexName>.​worker.jms.queue Obligatoire avec JMS Backend. Définit le nom JNDI pour rechercher la file d'attente JMS. La file d'attente sera utilisée pour poster les messages travail.

Avertissement

Comme vous l'avez sans doute remarqué, certaines des propriétés indiquées sont corrélées, ce qui signifie que toutes les combinaisons de valeurs de propriété ne sont pas forcément logiques. En fait, vous pouvez vous retrouver avec une configuration non fonctionnelle. Cela est particulièrement vrai dans le cas où vous fournissiez vos propres implémentations de certains des interfaces illustrées. Assurez-vous d'étudier le code existant avant d'écrire votre propre implémentation de Worker ou de BackendQueueProcessor.

23.2.5.1. JMS Master/Esclave Backend

Cette section décrit comment configurer l'architecture d'Hibernate Search Master/Esclave.
JMS Backend Configuration

Figure 23.3. Configuration de JMS Backend