Broker Configuration

To configure ActiveMQ to use the statistics plugin add the following to the ActiveMQ XML configuration:

<plugins>
  <statisticsBrokerPlugin/>
</plugins>

The statistics plugin looks for messages sent to particular destinations.

Query running broker statistics

To query the running statistics of the message broker, the client sends an empty message to a Destination named ActiveMQ.Statistics.Broker, and sets the replyto field with the Destination you want to receive the result on. The statistics plugin will send a  MapMessage filled with the statistics for the running ActiveMQ broker.

Source code

program DestStatistics;

(**
  Requires ActiveMQ 5.3 or higher
  To configure ActiveMQ to use the statistics plugin, add the following to the ActiveMQ XML configuration:
  &lt;broker&gt;
  ...
    &lt;plugins&gt;
      &lt;statisticsBrokerPlugin/&gt;
    &lt;/plugins&gt;
  ...
  &lt;/broker&gt;

  Usage:
  ------
  DestStatistics [destination]
  If no destination is specified, the program returns the broker statistics

  Reference
  ---------
  http://activemq.apache.org/statisticsplugin.html
  https://issues.apache.org/activemq/browse/AMQ-2379
  http://rajdavies.blogspot.com/2009/10/query-statistics-for-apache-activemq.html

  You can also use wildcards too, and receive a separate message for every destination matched.
*)

{$APPTYPE CONSOLE}

uses
  SysUtils,
  BTCommAdapterIndy, BTMessageTransformerXMLMapOmni,
  BTJMSInterfaces, BTJMSConnection, BTSessionIntf, BTSerialIntf,
  BTStompTypes, BTTypes,
  Classes;

var
  Connection: IConnection;
  Session: ISession;
  Producer: IMessageProducer;
  Consumer: IMessageConsumer;
  Destination, ReplyQueue: IQueue;
  JMSMessage: ITextMessage;
  Reply: IMapMessage;
  MapNames: PMStrings;
  I: Integer;
  Key: string;

begin
  Connection := TBTJMSConnection.MakeConnection;
  try
    try
      // Create and assign the message transformer
      SetTransformer(Connection, TBTMessageTransformerXMLMapOmni.Create(nil));

      Connection.Start;
      Session := Connection.CreateSession(False, amAutoAcknowledge);

      // listen on reply queue
      ReplyQueue := Session.CreateQueue('Habari' + '?' +
        BTStompTypes.SH_TRANSFORMATION + '=' + TRANSFORMER_ID_MAP_XML);
      Consumer := Session.CreateConsumer(ReplyQueue);

      // create the pseudo destination
      if ParamCount = 0 then
      begin
        Destination := Session.CreateQueue('ActiveMQ.Statistics.Broker');
      end
      else
      begin
        Destination := Session.CreateQueue('ActiveMQ.Statistics.Destination.' + ParamStr(1));
      end;

      // display destination name
      WriteLn('Request statistics for ' + Destination.QueueName + ' ...');

      // create the message and set reply queue name
      JMSMessage := Session.CreateTextMessage;
      JMSMessage.JMSReplyTo := ReplyQueue;
      Producer := Session.CreateProducer(Destination);
      Producer.Send(JMSMessage);

      // read the result message
      Reply := Consumer.Receive(1000) as IMapMessage;

      // list the map key/values
      while Assigned(Reply) do
      begin
        MapNames := Reply.GetMapNames;
        for I := 0 to Length(MapNames) - 1 do
        begin
          Key := MapNames[I];
          WriteLn(Key + '=' + Reply.GetString(Key));
        end;
        WriteLn;
        Reply := Consumer.Receive(1000) as IMapMessage;
      end;

      WriteLn('No more message on queue ' + ReplyQueue.QueueName);

      Connection.Stop;

    except
      on E: Exception do
        WriteLn(E.Message);
    end;
  finally
    Connection.Close;
  end;

  WriteLn('Press any key');
  ReadLn;
end.

 


Query Statistics for Apache ActiveMQ with Delphi

Discover more from Habarisoft Blog

Subscribe to get the latest posts sent to your email.

One thought on “Query ActiveMQ Broker Statistics with Delphi

Leave a Reply

Your email address will not be published. Required fields are marked *