JMS message de taille
Je suis actuellement en train de travailler sur la limitation de bande passante fonctionnalité (ne me demandez pas pourquoi, ce n'est pas ma décision) pour l'application de laquelle l'utilisation de JMS (framework Spring JMS et Active MQ savoir), à l'envoi de messages avec une charge utile entre le serveur et les clients.
J'ai trouvé beaucoup de limitation des méthodes pour limiter les messages JMS (mais aucun d'entre eux basée sur la bande passante réelle de la charge), mais je n'ai pas trouver un moyen de limiter les flux de messages. J'ai donc décidé d'écrire Seau percé algorithme sur mon propre.
Est-il une façon comment obtenir la taille de JMS message? Autre que "sizeof" mise en œuvre en Java (En Java, ce qui est la meilleure façon de déterminer la taille d'un objet?)
Notre client souhaite limiter la bande passante en sortie de producteurs (disons, les clients ont à 100 mbits de bande passante, mais il souhaitez utiliser seulement 10 mbit). Ça me rend fou. JMS est faite pour fournir des messages dès que possible, de sorte que je ne comprends pas vraiment cette demande. Mais, malheureusement, ce n'est pas sur ma décision.
OriginalL'auteur Sorceror | 2011-08-17
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous avez tout au sérieux meilleure alternative pour déterminer la JMS message de la taille de la mesure de ses sérialisé taille.
Mais vous pouvez ajouter quelques optimisations si vous le souhaitez. Il existe plusieurs types de messages (par exemple, MapMessage, ObjectMessage, TextMessage).
La taille de message texte est la longueur de son texte. La taille de la carte de message est la taille totale de tous ses domaines. Les champs sont primitives ou java.util.Date, de sorte qu'il n'est pas un problème pour les mesurer.
Objet du message contient la sérialisation de l'objet, de sorte que vous pouvez mesurer sa taille par écrit à ByteOutputStream.
Je pense que la mise en œuvre de seau percé à l'aide de JMS peut être simplifiée si vous utilisez la fonctionnalité cachée de la plupart des fournisseurs JMS pour envoyer des messages retardés. Vous pouvez mesurer le message quand enqueueing et de décider quand vous voulez à l'abonné de recevoir.
Veuillez lire ici pour les détails de comment envoyer des messages retardés: http://alexradzin.blogspot.com/2010/10/send-delayed-jms-messages.html
OriginalL'auteur AlexR
Parce que des messages JMS sont sérialisées dans le processus d'envoi, la meilleure façon d'obtenir la taille du message est par ObjectOutputStream.
OriginalL'auteur Sorceror
En plus du commentaire précédent par @AlexR, BytesMessage a un getBodyLength() la méthode
http://download.oracle.com/javaee/1.4/api/javax/jms/BytesMessage.html#getBodyLength
et vous pouvez probablement estimation typiques de la taille d'en-tête en transit par la capture de quelques objets créés à l'aide de la Session.createMessage() - c'est à dire le type de message JMS avec pas de charge utile. Je pense que je serais tenté de travailler directement avec une charge utile dans un byte[], à l'aide d'un BytesMessage, et compresser via un ZipOutputStream si la bande passante est critique. En outre, JMS permet astuces pour supprimer le message d'horodatage et de l'id du message, ce qui peut aider à réduire la taille de message par exemple
http://download.oracle.com/javaee/1.4/api/javax/jms/MessageProducer.html#setDisableMessageTimestamp%28boolean%29
bien que les fournisseurs ne sont pas nécessaires pour le soutenir,
Une fois, j'ai travaillé avec de très avec une bande passante limitée de JMS sur WebSphere MQ everyplace, et il a été possible d'obtenir le message de taille assez petite, de cette façon - bien que le natif de fil de fer format a également été optimisé pour la taille, dans ce cas,
getBodyLength()
mais je suis peur que cela ne fonctionne que pourBytesMessage
instances, qui, je suppose, je n'ai pas..OriginalL'auteur strmqm