Dans le RabbitMQ/AMQP Java, vous pouvez créer un AMQP.BasicProperties.Builder
, Et l'utiliser pour build()
une instance de AMQP.BasicProperties
. Cette l'instance de propriétés construites peut ensuite être utilisée pour toutes sortes de choses importantes. Il existe de nombreuses méthodes de style "constructeur" disponibles sur cette classe de générateur:
BasicProperties.Builder propsBuilder = new BasicProperties.Builder();
propsBuilder
.appId(???)
.clusterId(???)
.contentEncoding(???)
.contentType(???)
.correlationId(???)
.deliveryMode(2)
.expiration(???)
.headers(???)
.messageId(???)
.priority(???)
.replyTo(???)
.timestamp(???)
.type(???)
.userId(???);
Je cherche quels champs ces méthodes de génération aident à "construire", et surtout, quelles valeurs valides existent pour chaque champ . Par exemple, qu'est-ce qu'un clusterId
et quelles sont ses valeurs valides? Qu'est-ce que type
et quelles sont ses valeurs valides? Etc.
J'ai passé toute la matinée à récurer:
Dans tous ces documents, je ne trouve pas de définitions claires (à part quelques vagues explications de ce que priority
, contentEncoding
et deliveryMode
sont) de ce que chacun de ces champs sont et quelles sont leurs valeurs valides. Est-ce que quelqu'un sait? Plus important encore, quelqu'un sait-il où ces informations sont même documentées? Merci d'avance!
Habituellement, j'utilise une approche très simple pour mémoriser quelque chose. Je fournirai tous les détails ci-dessous, mais voici une simple image du champ et des valeurs de BasicProperties. J'ai également essayé de mettre en évidence correctement le contexte de file d'attente/serveur et d'application.
Si vous voulez que je l'améliore un peu - laissez simplement un petit commentaire. Ce que je veux vraiment, c'est fournir une clé visuelle et simplifier la compréhension.
Description de haut niveau ( source 1 , source 2 ):
Veuillez noter que Clust ID est obsolète, je vais donc l'exclure.
BTW, j'ai finalement réussi à revoir le dernier code de serveur ( rabbitmq-server-3.1.5), il y a un exemple dans rabbit_stomp_test_util.erl:
content_type = <<"text/plain">>,
content_encoding = <<"UTF-8">>,
delivery_mode = 2,
priority = 1,
correlation_id = <<"123">>,
reply_to = <<"something">>,
expiration = <<"my-expiration">>,
message_id = <<"M123">>,
timestamp = 123456,
type = <<"freshly-squeezed">>,
user_id = <<"joe">>,
app_id = <<"joe's app">>,
headers = [{<<"str">>, longstr, <<"foo">>},
{<<"int">>, longstr, <<"123">>}]
Bon à savoir, quelqu'un veut connaître tous les détails. Parce qu'il est préférable d'utiliser des attributs de message bien connus lorsque cela est possible au lieu de placer des informations dans le corps du message. BTW, les propriétés de base des messages sont loin d'être claires et utiles. Je dirais qu'il vaut mieux en utiliser un personnalisé.
Bon exemple ( source )
Mise à jour - Champ d'expiration
Remarque importante: l'expiration appartient au contexte de la file d'attente. Le message peut donc être abandonné par les serveurs.
README dit ce qui suit:
expiration
est un raccourci; puisque RabbitMQ s'attend à ce que ce soit une chaîne codée, nous traduisons unttl
en la représentation sous forme de chaîne de sa valeur entière.
Sources:
Au moment de la rédaction:
Dans cette réponse:
contentType
et contentEncoding
- ce qui est sûr, car ce sont des champs standard avec de bonnes descriptions dans AMQP 1.0.Le texte suivant est paraphrasé par ces sources par moi pour être un peu plus concis ou clair.
Comme vous pouvez le voir ci-dessus, la grande majorité de ces propriétés n'ont pas de valeurs énumérées/contraintes/recommandées car elles sont "réservées à l'application" et ne sont pas utilisées par RabbitMQ. Vous avez donc un travail facile. Vous êtes libre d'écrire/lire des valeurs utiles à votre application - tant qu'elles correspondent au type de données et se compilent :). ContentType
et contentEncoding
sont conformes à l'utilisation HTTP standard. DeliveryMode
et priority
sont des nombres contraints.
Remarque: des constantes utiles mais simples pour AMQP.BasicProperties sont disponibles dans la classe MessageProperties .
À votre santé :)
MISE À JOUR AU POST:
Avec un grand merci à Renat (voir les commentaires), nous avons examiné le code du serveur erlang dans rabbit_amqqueue_process.erl et la documentation sur RabbitMQ TTL Extensions to AMQP . Expiration du message (time- à vivre) peut être spécifié
par file d'attente via:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);
ou par message via:
byte[] messageBodyBytes = "Hello, world!".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties();
properties.setExpiration("60000");
channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
Ici, le ttl/expiration est en millisecondes, donc 60 sec dans chaque cas. Avoir mis à jour la définition ci-dessus de expiration pour refléter cela.
La spécification AMQP
définit un modèle générique et extensible pour les propriétés.
Les propriétés AMQP sont quelque peu similaires dans leur concept aux en-têtes HTTP, en ce qu'elles représentent des métadonnées sur les messages en question. Tout comme en HTTP, ils sont encadrés séparément à la charge utile du message. Mais ils sont fondamentalement une carte clé/valeur.
Certains courtiers comme RabbitMQ interpréteront certaines propriétés de message comme expiration
pour ajouter une valeur spécifique au fournisseur supplémentaire (dans ce cas, application d'un TTL ).
Mais au final, les propriétés AMQP ne sont qu'un gros tas de paires clé/valeur qui sont envoyées en toute sécurité avec chaque message, si vous choisissez de le faire. La documentation de votre courtier AMQP vous dira lesquels ils interprètent spécialement et comment envoyer les vôtres.
Cela étant dit, si vous posez cette question en premier lieu, vous n'avez probablement pas besoin de vous en préoccuper. Vous pourrez envoyer des messages avec succès sans avoir à vous soucier de définir des propriétés de message.