<div class="wiki-content maincontent"><p>The foundation of message and event parsing in ActiveBlaze is the BlazeMessage. <br clear="none">
A BlazeMessage is a a Map of key value pairs, where the keys are strings and the values are primitive objects.</p>

<p>The values supported are:</p>
<ul><li>byte</li><li>bytes[]</li><li>char</li><li>short</li><li>int</li><li>long</li><li>float</li><li>double</li><li>Map (supports recursion)</li></ul>


<p>You can create a BlazeMessage by its default constructor - e.g.</p>

<structured-macro ac:macro-id="a611d08e-785c-4bdb-861c-cfa37d3c08c8" ac:name="code" ac:schema-version="1"><plain-text-body>
 import org.apache.activeblaze.*;
 ...

 BlazeMessage msg = new BlazeMessage();
 msg.setFloatValue("rate",0.94f);

</plain-text-body></structured-macro>

<p>There's a few utility methods to support passing around standard objects - e.g.</p>

<structured-macro ac:macro-id="94118c88-1bcb-4e3e-bdfc-e352b945c4ea" ac:name="code" ac:schema-version="1"><plain-text-body>
 import org.apache.activeblaze.*;
 ...

 BlazeMessage msg = new BlazeMessage("test string");
 String text = msg.getText();

 BlazeMessage msg = new BlazeMessage();
 msg.setText("test string");
 String text = msg.getText();
 
 ...

 byte[] data = getSomeData();
 BlazeMessage msg = new BlazeMessage(data);
 byte[] result  = msg.getBytes();

 BlazeMessage msg = new BlazeMessage();
 msg.setBytes("data);
 byte[] result = msg.getData();

 ...

 Date date = new Date();
 BlazeMessage msg = new BlazeMessage(date);
 Date result = msg.getObject();

 BlazeMessage msg = new BlazeMessage();
 msg.setObject(date);
 Object result = msg.getObject();
 

</plain-text-body></structured-macro></div>

