<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>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
 import org.apache.activeblaze.*;
 ...

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

]]></script>
</div></div>

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

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
 import org.apache.activeblaze.*;
 ...

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

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

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

 BlazeMessage msg = new BlazeMessage();
 msg.setBytes(&quot;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();
 

]]></script>
</div></div></div>

