<div class="wiki-content maincontent"><p>ActiveBlaze provides infrastructure for fast, reliable peer to peer messaging to meet the demands of high performance and collaborative applications.<br clear="none">
Using the basic building block of a Channel, there exists a functional hierarchy used for different problem domains, each one a super-set of the previous one.</p>

<p>The BlazeChannel supports broadcasting on Topics - either using reliable multicast or point-cast.</p>

<p>To use a BlazeChannel create one from the a factory:</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
import org.apache.activeblaze.*;
...
BlazeChannelFactory factory = new BlazeChannelFactory();
BlazeChannel sender = factory.createChannel();
//start the channel and send a message
sender.start();

String destination = "foo.bar";
BlazeMessage msg = new BlazeMessage("test payload");
sender.broadcast(destination,msg);
//shutdown the sender
sender.shutDown();
</pre>
</div></div>

<p>You can similarly subscribe to Topic messages by using a listener</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
BlazeChannel receiver = factory.createChannel();
receiver.start();

//add a listener

receiver.addBlazeTopicMessageListener(destination, new BlazeMessageListener() {
            public void onMessage(BlazeMessage msg) {
                System.out.println("Got a msg: " + msg);
            }
        });

receiver.shutDown();
</pre>
</div></div></div>

