<?xml version="1.0"?>
<atom:feed xmlns:atom="http://www.w3.org/2005/Atom" xmlns:html="http://www.w3.org/1999/xhtml">
  <atom:id>http://bill.welliver.org/atom/pike/JMS interface</atom:id>
  <atom:title type="text">electronic.alchemy :: JMS interface</atom:title>
  <atom:updated>2026-04-04T07:23:37-04:00</atom:updated>
  <atom:link href="http://bill.welliver.org/atom/pike/JMS interface" type="application/atom+xml"></atom:link>
  <atom:link href="http://bill.welliver.org/space/pike/JMS interface" type="text/html"></atom:link>
  <atom:link href="http://bill.welliver.org/rss/pike/JMS interface" type="application/rss+xml"></atom:link>
  <atom:generator uri="http://modules.gotpike.org/blahblah/Public.Syndication.ATOM" version="0.1">Public.Syndication.ATOM (Pike v8.0 release 702)</atom:generator>
  <atom:icon>http://bill.welliver.org/favicon.ico</atom:icon>
  <atom:logo>http://bill.welliver.org/static/images/alchemy.gif</atom:logo>
  <atom:subtitle type="xhtml"><html:div xmlns:html="http://www.w3.org/1999/xhtml"><html:p>It's pretty easy to take advantage of Java products from within Pike thanks to the Java module. The interface isn't completely seamless, but it's far easier than reinventing the wheel.</html:p><html:p class="paragraph"/>
<html:b class="bold">News</html:b><html:p class="paragraph"/>
<html:i class="ital">17 February 2007</html:i>: The <html:a href="/space/pike/Fins">Fins</html:a> application framework now has support for asynchronous message handling using JMS. So now, the barrier to using JMS and Pike is even lower!.<html:p class="paragraph"/>
I was able to create a message producer and consumer with the <html:a href="ActiveMQ" class="wiki_link_external">http://activemq.codehaus.org</html:a> JMS server; it took about an hour (assuming you understand how JMS works!), and seems to work well enough. Because JMS is a specification, you can use any JMS compliant message broker here, like TIBCO EMS, MQSeries or OpenJMS.<html:p class="paragraph"/>
This simple message consumer uses JNDI to get the queue connection. It simply waits on for incoming messages to be delivered, then prints them out.<html:p class="paragraph"/>
Now Pike can play along with all of your other messaging enabled applications!&#xD;
<html:div class="code"><html:pre><html:pre>&#xD;
<html:font color="red">//&#xD;
</html:font><html:font color="red">// simple message consumer using JNDI and JMS&#xD;
</html:font><html:font color="red">//&#xD;
</html:font><html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">x</html:font></html:b> = Java.pkg[<html:i><html:font color="darkred">"javax/naming/InitialContext"</html:font></html:i>]();&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">factory</html:font></html:b> = x-&gt;_method(<html:i><html:font color="darkred">"lookup"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljava/lang/String;)Ljava/lang/Object;"</html:font></html:i>)(<html:i><html:font color="darkred">"ConnectionFactory"</html:font></html:i>);&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">t</html:font></html:b> = x-&gt;_method(<html:i><html:font color="darkred">"lookup"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljava/lang/String;)Ljava/lang/Object;"</html:font></html:i>)(<html:i><html:font color="darkred">"MyQueue"</html:font></html:i>);&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qc</html:font></html:b> = factory-&gt;createQueueConnection();&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">s</html:font></html:b> = qc-&gt;createQueueSession(0, 0);&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">sub</html:font></html:b> = s-&gt;createReceiver(t);&#xD;
write(<html:i><html:font color="darkred">"getting ready to receive&amp;#110;"</html:font></html:i>);&#xD;
qc-&gt;start();&#xD;
<html:b><html:font color="darkblue">do</html:font></html:b>{&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m</html:font></html:b> = sub-&gt;receive();<html:p class="paragraph"/>
  <html:b><html:font color="darkblue">if</html:font></html:b>(m)&#xD;
  {&#xD;
    write(<html:i><html:font color="darkred">"--&gt; message %O to %O: %O&amp;#110;"</html:font></html:i>, &#xD;
      (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)m-&gt;getJMSMessageID(), &#xD;
      (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)m-&gt;getJMSDestination()-&gt;toString(), &#xD;
      (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)m-&gt;getText()); &#xD;
  }&#xD;
} <html:b><html:font color="darkblue">while</html:font></html:b>(1);&#xD;
<html:b><html:font color="darkblue">return</html:font></html:b> 0;&#xD;
}<html:p class="paragraph"/>
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
Here's the message producer:<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
<html:font color="red">// &#xD;
</html:font><html:font color="red">// simple message producer using JNDI and JMS&#xD;
</html:font><html:font color="red">//&#xD;
</html:font><html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">x</html:font></html:b> = Java.pkg[<html:i><html:font color="darkred">"javax/naming/InitialContext"</html:font></html:i>]();&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">factory</html:font></html:b> = x-&gt;_method(<html:i><html:font color="darkred">"lookup"</html:font></html:i>,     <html:i><html:font color="darkred">"(Ljava/lang/String;)Ljava/lang/Object;"</html:font></html:i>)(<html:i><html:font color="darkred">"ConnectionFactory"</html:font></html:i>);&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">t</html:font></html:b> = x-&gt;_method(<html:i><html:font color="darkred">"lookup"</html:font></html:i>,     <html:i><html:font color="darkred">"(Ljava/lang/String;)Ljava/lang/Object;"</html:font></html:i>)(<html:i><html:font color="darkred">"MyQueue"</html:font></html:i>);&#xD;
write(<html:i><html:font color="darkred">"topic: %O&amp;#110;"</html:font></html:i>, (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)t-&gt;toString());&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qc</html:font></html:b> = factory-&gt;createQueueConnection();&#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">s</html:font></html:b> = qc-&gt;createQueueSession(0,0); &#xD;
<html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">sub</html:font></html:b> = s-&gt;createSender(t);&#xD;
write(<html:i><html:font color="darkred">"getting ready to send&amp;#110;"</html:font></html:i>);&#xD;
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">i=0</html:font></html:b>;&#xD;
<html:b><html:font color="darkblue">do</html:font></html:b>{&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m</html:font></html:b> = s-&gt;createTextMessage();&#xD;
  m-&gt;setText(<html:i><html:font color="darkred">"this is a test "</html:font></html:i> <html:ins class="inserted"> i++ </html:ins><html:i><html:font color="darkred">".&amp;#110;"</html:font></html:i>);&#xD;
  sub-&gt;send(m);&#xD;
  sleep(1);&#xD;
} <html:b><html:font color="darkblue">while</html:font></html:b>(1);&#xD;
<html:b><html:font color="darkblue">return</html:font></html:b> 0;&#xD;
}&#xD;
</html:pre></html:pre></html:div><html:p class="paragraph"/>
&#xD;
For those of you who like to do things the hard way (perhaps squeezing a little extra performance in the process, here's the full-up manual version. You'll note that the low level interface to Java is a very close mapping of JNI:<html:p class="paragraph"/>
<html:div class="code"><html:pre><html:pre>&#xD;
#define FINDCLASS(X) (jvm-&gt;find_class(X)||(jvm-&gt;exception_describe(),jvm-&gt;exception_clear(),error(<html:i><html:font color="darkred">"Failed to load class "</html:font></html:i> X <html:i><html:font color="darkred">".&amp;#110;"</html:font></html:i>),0))<html:p class="paragraph"/>
static <html:b><html:font color="darkblue">constant</html:font></html:b> jvm = Java.machine;<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">initial_context_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/naming/InitialContext"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">queue_connection_factory_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/jms/QueueConnectionFactory"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">queue_connection_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/jms/QueueConnection"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">queue_session_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/jms/QueueSession"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">queue_receiver_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/jms/QueueReceiver"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">message_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"javax/jms/TextMessage"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">initial_context_init</html:font></html:b> = initial_context_class-&gt;get_method(<html:i><html:font color="darkred">"&lt;init&gt;"</html:font></html:i>, <html:i><html:font color="darkred">"()V"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">initial_context_lookup</html:font></html:b> = initial_context_class-&gt;get_method(<html:i><html:font color="darkred">"lookup"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljava/lang/String;)Ljava/lang/Object;"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qcf_create_queue_connection</html:font></html:b> = queue_connection_factory_class-&gt;get_method(<html:i><html:font color="darkred">"createQueueConnection"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljavax/jms/QueueConnection;"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qc_create_queue_session</html:font></html:b> = queue_connection_class-&gt;get_method(<html:i><html:font color="darkred">"createQueueSession"</html:font></html:i>, <html:i><html:font color="darkred">"(ZI)Ljavax/jms/QueueSession;"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qs_create_receiver</html:font></html:b> = queue_session_class-&gt;get_method(<html:i><html:font color="darkred">"createReceiver"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljavax/jms/Queue;)Ljavax/jms/QueueReceiver;"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">r_receive</html:font></html:b> = queue_receiver_class-&gt;get_method(<html:i><html:font color="darkred">"receive"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljavax/jms/Message;"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">c_start</html:font></html:b> = queue_connection_class-&gt;get_method(<html:i><html:font color="darkred">"start"</html:font></html:i>, <html:i><html:font color="darkred">"()V"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m_get_message_id</html:font></html:b> = message_class-&gt;get_method(<html:i><html:font color="darkred">"getJMSMessageID"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljava/lang/String;"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m_get_destination</html:font></html:b> = message_class-&gt;get_method(<html:i><html:font color="darkred">"getJMSDestination"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljavax/jms/Destination;"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m_get_text</html:font></html:b> = message_class-&gt;get_method(<html:i><html:font color="darkred">"getText"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljava/lang/String;"</html:font></html:i>);<html:p class="paragraph"/>
<html:font color="red">/* for exception handling */</html:font>&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">stringwriter_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"java/io/StringWriter"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">printwriter_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"java/io/PrintWriter"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">throwable_class</html:font></html:b> = FINDCLASS(<html:i><html:font color="darkred">"java/lang/Throwable"</html:font></html:i>);<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">stringwriter_init</html:font></html:b> = <html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown">writer_class-&gt;get_method</html:font></html:b>(<html:i><html:font color="darkred">"&lt;init&gt;"</html:font></html:i>, <html:i><html:font color="darkred">"()V"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">printwriter_init</html:font></html:b> = printwriter_class-&gt;get_method(<html:i><html:font color="darkred">"&lt;init&gt;"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljava/io/Writer;)V"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">printwriter_flush</html:font></html:b> = printwriter_class-&gt;get_method(<html:i><html:font color="darkred">"flush"</html:font></html:i>, <html:i><html:font color="darkred">"()V"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">throwable_printstacktrace</html:font></html:b> = throwable_class-&gt;get_method(<html:i><html:font color="darkred">"printStackTrace"</html:font></html:i>, <html:i><html:font color="darkred">"(Ljava/io/PrintWriter;)V"</html:font></html:i>);&#xD;
static <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">throwable_getmessage</html:font></html:b> = throwable_class-&gt;get_method(<html:i><html:font color="darkred">"getMessage"</html:font></html:i>, <html:i><html:font color="darkred">"()Ljava/lang/String;"</html:font></html:i>);<html:p class="paragraph"/>
<html:p class="paragraph"/>
static <html:b><html:font color="darkgreen">void </html:font></html:b><html:b><html:font color="darkbrown">check_exception</html:font></html:b>()&#xD;
{&#xD;
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">e</html:font></html:b> = jvm-&gt;exception_occurred();&#xD;
  <html:b><html:font color="darkblue">if</html:font></html:b>(e) {&#xD;
    jvm-&gt;exception_clear();&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">sw</html:font></html:b> = <html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown">writer_class-&gt;alloc</html:font></html:b>();&#xD;
    <html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown">writer_init</html:font></html:b>(sw);&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">pw</html:font></html:b> = printwriter_class-&gt;alloc();&#xD;
    printwriter_init(pw, sw);&#xD;
    throwable_printstacktrace(e, pw);&#xD;
    printwriter_flush(pw);&#xD;
    <html:b><html:font color="darkgreen">array </html:font></html:b><html:b><html:font color="darkbrown">bt</html:font></html:b> = backtrace();&#xD;
    <html:font color="red">// FIXME: KLUDGE: Sometimes the cast fails for some reason.  &#xD;
</html:font>    <html:b><html:font color="darkgreen">string </html:font></html:b><html:b><html:font color="darkbrown">s</html:font></html:b> = <html:i><html:font color="darkred">"Unknown Java exception (StringWriter failed)"</html:font></html:i>;&#xD;
    <html:b><html:font color="darkblue">catch</html:font></html:b> {&#xD;
      s = (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)sw;&#xD;
    };&#xD;
    <html:b><html:font color="darkblue">throw</html:font></html:b>(({s, bt[..sizeof(bt)-2]}));&#xD;
  }&#xD;
}<html:p class="paragraph"/>
<html:b><html:font color="darkgreen">int </html:font></html:b><html:b><html:font color="darkbrown">main</html:font></html:b>()&#xD;
{<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">initial_context</html:font></html:b> = initial_context_class-&gt;alloc();<html:p class="paragraph"/>
  initial_context_init-&gt;call_nonvirtual(initial_context);&#xD;
  check_exception();<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">factory</html:font></html:b> = initial_context_lookup-&gt;call_nonvirtual(initial_context, <html:i><html:font color="darkred">"ConnectionFactory"</html:font></html:i>);&#xD;
  check_exception();<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">queue</html:font></html:b> = initial_context_lookup-&gt;call_nonvirtual(initial_context, <html:i><html:font color="darkred">"MyQueue"</html:font></html:i>);&#xD;
  check_exception();<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qc</html:font></html:b> = qcf_create_queue_connection-&gt;call_nonvirtual(factory);&#xD;
  check_exception();<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">qs</html:font></html:b> = qc_create_queue_session-&gt;call_nonvirtual(qc, 0, 0);&#xD;
  check_exception();<html:p class="paragraph"/>
  <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">receiver</html:font></html:b> = qs_create_receiver-&gt;call_nonvirtual(qs, queue);&#xD;
  check_exception();<html:p class="paragraph"/>
  write(<html:i><html:font color="darkred">"getting ready to receive&amp;#110;"</html:font></html:i>);<html:p class="paragraph"/>
  c_start-&gt;call_nonvirtual(qc);&#xD;
  check_exception();<html:p class="paragraph"/>
  do&#xD;
  {&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">m</html:font></html:b> = r_receive-&gt;call_nonvirtual(receiver);&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">id</html:font></html:b> = m_get_message_id(m);&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">dest</html:font></html:b> = m_get_destination(m);&#xD;
    <html:b><html:font color="darkgreen">object </html:font></html:b><html:b><html:font color="darkbrown">text</html:font></html:b> = m_get_text(m);&#xD;
    write(<html:i><html:font color="darkred">"--&gt; message %O to %O: %O&amp;#110;"</html:font></html:i>, (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)id, (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)dest, (<html:b><html:font color="darkgreen">string</html:font></html:b><html:b><html:font color="darkbrown"/></html:b>)text);&#xD;
  } <html:b><html:font color="darkblue">while</html:font></html:b> (1);<html:p class="paragraph"/>
  <html:b><html:font color="darkblue">return</html:font></html:b> 0;<html:p class="paragraph"/>
}<html:p class="paragraph"/>
</html:pre></html:pre></html:div>
</html:div></atom:subtitle>
</atom:feed>
