ScroogeXHTML for the Java™ platform 4.3 – fast RTF to HTML/XHTML converter

Habarisoft released its RTF to HTML/XHTML converter library, ScroogeXHTML for the Java™ platform, version 4.3.

Release Notes:

  • Removed legacy debug mode code to reduce library code size
  • Dependency to slf4j updated to 1.7.7
  • Installer updated to IzPack 5.0.0 rc2
  • Removed unnecessary setFont and getFont methods from Fonttable class
  • Removed needless valueOf for in valueOf(getCurFontNr())
  • Java 5: use import static java.util.Collections.unmodifiableMap
  • Added private constructors for utility classes

On-line demo

The page allows to upload a RTF file and convert it to different output formats (including HTML5, HTML 4.01 and XHTML).

API documentation

The online API documentation is available at

Two server deployment licenses included

For the deployment on client/server production systems, the Single Developer license already includes two full server deployment licenses. License types are explained on

Delphi version

The RTF to HTML / XHTML library is also available for Delphi at

How to: Habari Client for RabbitMQ evaluation with CloudAMQP

Habari Client for RabbitMQ is a library for Delphi and Free Pascal which provides access to the RabbitMQ open source message broker. Habarisoft offers example aplications for this client library including chat and performance tests, which need an installation of RabbitMQ. But while the RabbitMQ server installation itself is very simple, it also requires an installed Erlang run time environment, and so the preparing steps for client library evaluation take some time.

Fortunately, there is an easy way to avoid the RabbitMQ installation: CloudAMQP, a service which provides managed RabbitMQ servers in the cloud.

After a simple registration, clients can connect to the server using various standard protocols (AMQP, MQTT, STOMP). The CloudAMQ console page displays a connection URL for AMQP connections, which can be used with Habari Client for RabbitMQ chat application after small changes.

A valid URL for the Habari Chat demo application for CloudAMQP has the form stomp://<Server>?<VHost>.



Connection configuration






With the free CloudAMQP plan you can use up to three connections (chat applications) simultaneously.

Habari Client for RabbitMQ

ActiveMQ, Qpid, HornetQ and RabbitMQ in Comparison

An article by Thomas Beyer (also available in German language) gives a short introduction into popular messaging solutions which are available as free open source projects.

“Newer architectures and the standardized AMQP protocol have led to a flood of message brokers. All brokers take claim to be fast, robust and reliable. But what really distinguish the broker? How do I choose the right broker? Should we continue to use established brokers such as the ActiveMQ or try a more modern one? This article attempts to answer these questions and help the reader in selecting a suitable broker.”

Article URL:

Apache ActiveMQ 5.10.0 released

Apache ActiveMQ 5.10.0 resolves more than 234 issues, mostly bug fixes and improvements. It has the following new features:

  • Java 8 support
  • Apache Shiro Security Plugin -
  • Hardened MQTT support
  • Hardened AMQP support
  • Hardened LevelDB store
  • Improved RAR/JCA adapter
  • Improved Runtime configuration plugin
  • Improved Web console


A Delphi and Free Pascal STOMP based client library is available from Habarisoft.

Habari Client Libraries


RabbitMQ use cases: NYTimes

Michael Laing, a Systems Architect at NYTimes, gave a great decription of their use of RabbitMQ and their overall architecture on the RabbitMQ mailing list, which later also appeared on High Scalability -  NYTimes Architecture: No Head, No Master, No Single Point of Failure

We use Rabbit MQ as our message passing system. Right now, the messages we handle are things like Breaking News Alerts and Live Video alerts. Our internal clients send the fabrik these messages over AMQP. We then send them around our stack, ensuring they are delivered.

We have Rabbit in all layers of our stack, with shovels connecting them. Our own internal code helps route the messages based on there services level. Some messages, like Breaking News, must go out as quickly as possible. So we spread these out over out clusters AND shovel them to clusters in other regions for processing. From there the messages get send to the front end for delivery.

We also use Rabbit for individual messages. If you are a registered NYTimes users, we can send you personally a message. Things like credit card expiring.


Query ActiveMQ Broker Statistics with Delphi

Broker Configuration

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


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:

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


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


  BTCommAdapterIndy, BTMessageTransformerXMLMapOmni,
  BTJMSInterfaces, BTJMSConnection, BTSessionIntf, BTSerialIntf,
  BTStompTypes, BTTypes,

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

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

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

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

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

      // 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);

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

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

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


      on E: Exception do

  WriteLn('Press any key');


Query Statistics for Apache ActiveMQ with Delphi

RabbitMQ 3.3.1 free open source message broker released

The RabbitMQ team announced the release of RabbitMQ 3.3.1. This release fixes a number of bugs in 3.3.0 and earlier versions, including security bugs in the MQTT and shovel plugins. Binary and source distributions of the new release can be found on the download page.

For application integration in Delphi and Free Pascal, Habarisoft offers a commercial client library for RabbitMQ 3.2.4 and newer.