{"id":42,"date":"2016-05-06T08:56:05","date_gmt":"2016-05-06T08:56:05","guid":{"rendered":"http:\/\/symbioticindia.in\/docu\/?p=42"},"modified":"2016-05-06T08:56:05","modified_gmt":"2016-05-06T08:56:05","slug":"exposing-openjms-to-php","status":"publish","type":"post","link":"http:\/\/symbioticindia.in\/docu\/2016\/05\/06\/exposing-openjms-to-php\/","title":{"rendered":"Exposing OpenJMS to PHP"},"content":{"rendered":"<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>Introduction<\/strong><\/p>\n<p>I recently got involved in a project where reliable communication between etherogenous platforms was required. Having already worked with JMS, I had to find a way to expose its services to the frontend(a PHP base web application). Some time before I had come across XFire, and had been looking for a chance to work on it. This was that chance.<br \/>\nI know SOAP can sometimes be cumbersome, but XFire really makes its use easy, and PHP well supports it( we&#8217;ll use the nusoap library).<br \/>\nIn this article I&#8217;ll make an introduction on how to easily merge together OpenJMS,XFire and PHP to get a generic, immediately usable messaging system.<br \/>\nIf someone will be interested in it, further articles will follow on this topic.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: small;\"><br \/>\n<strong>Overview<\/strong><br \/>\nTo make this as simple as possible, I&#8217;m going to cover not a line more than what is really needed to achieve our goal, so just a few words about the involved technologies.<\/p>\n<p>JMS (java message service) is :&#8221;<em>a messaging standard that allows application components based on the Java 2 Platform, Enterprise Edition (J2EE) to create,send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous<\/em>&#8220;(<a href=\"http:\/\/java.sun.com\/products\/jms\/\">ref.<\/a>).<br \/>\nWhat we need is a way to allow non-java technologies(in our case PHP) to access the functionalities exposed by JMS. This time we&#8217;ll use SOAP.<\/p>\n<p>SOAP(simple object access protocol) is :<em>a protocol for exchanging XML-based messages over a computer network, normally using HTTP. SOAP forms the foundation layer of the Web services stack, providing a basic messaging framework that more abstract layers can build on. SOAP can be used to facilitate a Service-Oriented architectural pattern <\/em>&#8220;(<a href=\"http:\/\/en.wikipedia.org\/wiki\/SOAP\">ref.<\/a>).<\/p>\n<p><strong>Used platforms<\/strong><\/span><br \/>\nThe JMS implementation we&#8217;re going to use is <a href=\"http:\/\/openjms.sourceforge.net\/\">OpenJMS<\/a>. There are plenty of other valid JMS implementations; personally I find OpenJMS to be a good choice, is open source and easy to use .<br \/>\nSOAP services will be handled by <a href=\"http:\/\/xfire.codehaus.org\/\">XFire<\/a>, which allows us to expose even POJOs as web services at a snap.<br \/>\n<a href=\"http:\/\/php.net\/\">PHP<\/a> will be our front end platform. The PHP part just handles soap calls, and it&#8217;s quite easy to adapt this part for other languages with soap extensions(basically every language has at least one).<\/p>\n<p><span style=\"font-size: small;\"><strong>Before we start writing code<\/strong><br \/>\nFirst thing to do is to download both OpenJMS(<a href=\"http:\/\/openjms.sourceforge.net\/downloads.html\">here<\/a>) and XFire(<a href=\"http:\/\/xfire.codehaus.org\/Download\">here<\/a>). From XFire we just need its libraries, but with OpenJMS we also need to start up the server. Nothing easier, we&#8217;re not going to configure anything. Unzip OpenJMS distribution and just start it(startup.sh or startup.bat) from its <em>bin<\/em> directory.<\/p>\n<p><\/span><\/p>\n<h4><strong>Writing the OpenJms functionalities wrapper<\/strong><\/h4>\n<p><span style=\"font-size: small;\">We need to get\/post a message from\/to a queue\/topic. We have 4 combination, 2 for getting, 2 for posting.<br \/>\nLet&#8217;s first define an interface:<\/p>\n<p><\/span><\/p>\n<div>\n<pre><span class=\"syntax0\"><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">import<\/span> javax.jms.JMSException;\r\n<span class=\"gutter\">   2:<\/span><span class=\"syntax9\">import<\/span> javax.jms.TextMessage;\r\n<span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> javax.naming.NamingException;\r\n<span class=\"gutter\">   4:<\/span>\r\n<span class=\"gutterH\">   5:<\/span><span class=\"syntax3\">\/**<\/span>\r\n<span class=\"gutter\">   6:<\/span> <span class=\"syntax3\">*<\/span>\r\n<span class=\"gutter\">   7:<\/span> <span class=\"syntax3\">*<\/span> <span class=\"syntax12\">@author<\/span> <span class=\"syntax3\">beanizer<\/span>\r\n<span class=\"gutter\">   8:<\/span> <span class=\"syntax3\">*\/<\/span>\r\n<span class=\"gutter\">   9:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax10\">interface<\/span> OpenJMSService <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutterH\">  10:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage[] <span class=\"syntax6\">getMsgFromQueue<\/span>(String queue) <span class=\"syntax8\">throws<\/span> NamingException,\r\n                  JMSException;\r\n<span class=\"gutter\">  11:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage <span class=\"syntax6\">postMsgToQueue<\/span>(String queue,String msg) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException;\r\n<span class=\"gutter\">  12:<\/span>\r\n<span class=\"gutter\">  13:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage[] <span class=\"syntax6\">getMsgFromTopic<\/span>(String topic,String consumer) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException;\r\n<span class=\"gutter\">  14:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage <span class=\"syntax6\">postMsgToTopic<\/span>(String topic,String msg) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException;\r\n<span class=\"gutterH\">  15:<\/span>    \r\n<span class=\"gutter\">  16:<\/span><span class=\"syntax18\">}<\/span> <\/span><\/pre>\n<\/div>\n<p><span style=\"font-size: small;\"><\/p>\n<p>Note that:<br \/>\n1) We&#8217;re going to work only on text messages (more message types are available through JMS)<br \/>\n2) We&#8217;re not going to handle exceptions here. The thrown exceptions will be magically encapsulated by XFire and sent back to the client in the soap response<br \/>\n3) The interface will be used by XFire to build the SOAP wsdl and service.<\/p>\n<p>It&#8217;s now time to implement the concrete class:<br \/>\n<\/span><\/p>\n<div>\n<pre><span class=\"syntax0\"><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">import<\/span> java.util.Hashtable;\r\n<span class=\"gutter\">   2:<\/span><span class=\"syntax9\">import<\/span> javax.jms.*;\r\n<span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> javax.naming.Context;\r\n<span class=\"gutter\">   4:<\/span><span class=\"syntax9\">import<\/span> javax.naming.InitialContext;\r\n<span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">import<\/span> javax.naming.NamingException;\r\n<span class=\"gutter\">   6:<\/span>\r\n<span class=\"gutter\">   7:<\/span><span class=\"syntax3\">\/**<\/span>\r\n<span class=\"gutter\">   8:<\/span> <span class=\"syntax3\">*<\/span>\r\n<span class=\"gutter\">   9:<\/span> <span class=\"syntax3\">*<\/span> <span class=\"syntax12\">@author<\/span> <span class=\"syntax3\">beanizer<\/span>\r\n<span class=\"gutterH\">  10:<\/span> <span class=\"syntax3\">*\/<\/span>\r\n<span class=\"gutter\">  11:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax10\">class<\/span> OpenJMSServiceImpl <span class=\"syntax8\">implements<\/span> OpenJMSService<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  12:<\/span>    Context context;\r\n<span class=\"gutter\">  13:<\/span>    Session session;\r\n<span class=\"gutter\">  14:<\/span>    Connection connection;\r\n<span class=\"gutterH\">  15:<\/span>    MessageConsumer receiver<span class=\"syntax18\">=<\/span><span class=\"syntax14\">null<\/span>;\r\n<span class=\"gutter\">  16:<\/span>    <span class=\"syntax3\">\/**<\/span> <span class=\"syntax3\">Creates<\/span> <span class=\"syntax3\">a<\/span> <span class=\"syntax3\">new<\/span> <span class=\"syntax3\">instance<\/span> <span class=\"syntax3\">of<\/span> <span class=\"syntax3\">OpenJMSServiceImpl<\/span> <span class=\"syntax3\">*\/<\/span>\r\n<span class=\"gutter\">  17:<\/span>    <span class=\"syntax8\">public<\/span> <span class=\"syntax6\">OpenJMSServiceImpl<\/span>() <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  18:<\/span>        Hashtable properties <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">Hashtable<\/span>();\r\n<span class=\"gutter\">  19:<\/span>        properties.<span class=\"syntax6\">put<\/span>(Context.INITIAL_CONTEXT_FACTORY, <span class=\"syntax13\">\"<\/span>\r\n                  <span class=\"syntax13\">org.exolab.jms.jndi.InitialContextFactory<\/span><span class=\"syntax13\">\"<\/span>);\r\n<span class=\"gutterH\">  20:<\/span>        properties.<span class=\"syntax6\">put<\/span>(Context.PROVIDER_URL, <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">tcp:\/\/localhost:3035\/<\/span><span class=\"syntax13\">\"<\/span>);\r\n<span class=\"gutter\">  21:<\/span>        <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  22:<\/span>            context <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">InitialContext<\/span>(properties); \r\n<span class=\"gutter\">  23:<\/span>            ConnectionFactory factory <span class=\"syntax18\">=<\/span>(ConnectionFactory)context.<span class=\"syntax6\">lookup<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">ConnectionFactory<\/span><span class=\"syntax13\">\"<\/span>);\r\n<span class=\"gutter\">  24:<\/span>            connection <span class=\"syntax18\">=<\/span> (Connection)factory.<span class=\"syntax6\">createConnection<\/span>();\r\n<span class=\"gutterH\">  25:<\/span>            session <span class=\"syntax18\">=<\/span> (Session)connection.<span class=\"syntax6\">createSession<\/span>(<span class=\"syntax14\">false<\/span>\r\n                  , Session.AUTO_ACKNOWLEDGE);\r\n<span class=\"gutter\">  26:<\/span>            connection.<span class=\"syntax6\">start<\/span>();\r\n<span class=\"gutter\">  27:<\/span>        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (Exception ex) <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  28:<\/span>            ex.<span class=\"syntax6\">printStackTrace<\/span>();\r\n<span class=\"gutter\">  29:<\/span>        <span class=\"syntax18\">}<\/span>    \r\n<span class=\"gutterH\">  30:<\/span>        \r\n<span class=\"gutter\">  31:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  32:<\/span> <\/span><\/pre>\n<\/div>\n<p><span style=\"font-size: small;\"><br \/>\nHere we initialize a connection and a session to the OpenJMS server running on localhost at port 3035.<br \/>\nThe URL used on line 20 depends on the OpenJMS server configuration. We&#8217;re using the default, but keep in mind that OpenJMS could be on a different machine, different port, and could even use a different protocol(i.e. RMI).<br \/>\nWe&#8217;re using generic items for : ConnectionFactory,Connection and Session. Specific items for both topics and queues exist, but in this case we&#8217;re trying to simplify things.<br \/>\nOn line 25, the first parameter(false) tells that we&#8217;re not going to use a transactioned session.<\/p>\n<p><\/span><\/p>\n<div>\n<pre><span class=\"gutter\">  33:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage[] <span class=\"syntax6\">getMsgFromTopic<\/span>(String topicName,String consumer) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  34:<\/span>        Topic destination<span class=\"syntax18\">=<\/span>(Topic) context.<span class=\"syntax6\">lookup<\/span>(topicName);\r\n<span class=\"gutterH\">  35:<\/span>        <span class=\"syntax8\">try<\/span><span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  36:<\/span>            receiver<span class=\"syntax18\">=<\/span>session.<span class=\"syntax6\">createDurableSubscriber<\/span>(destination,consumer);\r\n<span class=\"gutter\">  37:<\/span>        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span>(Exception ex)<span class=\"syntax18\">{<\/span><span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  38:<\/span>        <span class=\"syntax8\">return<\/span> (<span class=\"syntax6\">getMsg<\/span>(receiver));\r\n<span class=\"gutter\">  39:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutterH\">  40:<\/span>    <span class=\"syntax8\">public<\/span> javax.jms.TextMessage[] <span class=\"syntax6\">getMsgFromQueue<\/span>(String queueName) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  41:<\/span>        Queue destination<span class=\"syntax18\">=<\/span>(Queue) context.<span class=\"syntax6\">lookup<\/span>(queueName);\r\n<span class=\"gutter\">  42:<\/span>        MessageConsumer receiver<span class=\"syntax18\">=<\/span>session.<span class=\"syntax6\">createConsumer<\/span>(destination);\r\n<span class=\"gutter\">  43:<\/span>        <span class=\"syntax8\">return<\/span> (<span class=\"syntax6\">getMsg<\/span>(receiver));\r\n<span class=\"gutter\">  44:<\/span>\r\n<span class=\"gutterH\">  45:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  46:<\/span>\r\n<span class=\"gutter\">  47:<\/span>    \r\n<span class=\"gutter\">  48:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage <span class=\"syntax6\">postMsgToTopic<\/span>(String topicName, String msg) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  49:<\/span>       Topic destination<span class=\"syntax18\">=<\/span> (Topic)context.<span class=\"syntax6\">lookup<\/span>(topicName); \r\n<span class=\"gutterH\">  50:<\/span>        MessageProducer sender <span class=\"syntax18\">=<\/span> session.<span class=\"syntax6\">createProducer<\/span>(destination); \r\n<span class=\"gutter\">  51:<\/span>        <span class=\"syntax8\">return<\/span> <span class=\"syntax6\">postMsg<\/span>(sender,msg);\r\n<span class=\"gutter\">  52:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  53:<\/span>    \r\n<span class=\"gutter\">  54:<\/span>    \r\n<span class=\"gutterH\">  55:<\/span>    <span class=\"syntax8\">public<\/span> TextMessage <span class=\"syntax6\">postMsgToQueue<\/span>(String queueName, String msg) <span class=\"syntax8\">throws<\/span>\r\n                  NamingException,JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  56:<\/span>        Queue destination<span class=\"syntax18\">=<\/span> (Queue)context.<span class=\"syntax6\">lookup<\/span>(queueName); \r\n<span class=\"gutter\">  57:<\/span>        MessageProducer sender <span class=\"syntax18\">=<\/span> session.<span class=\"syntax6\">createProducer<\/span>(destination); \r\n<span class=\"gutter\">  58:<\/span>        <span class=\"syntax8\">return<\/span> <span class=\"syntax6\">postMsg<\/span>(sender,msg);\r\n<span class=\"gutter\">  59:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutterH\">  60:<\/span><\/pre>\n<\/div>\n<p><span style=\"font-size: small;\"><br \/>\nThe above snippet implements the 4 methods that will be exposed as SOAP methods.<br \/>\nAs you can see, message retrieving is demanded to the generic method &#8220;getMsg&#8221;(explained below), as the generic session created can be used by both topics and queues, so the specific methods just need to create a proper MessageConsumer.<br \/>\nSame thing for posting messages, a MessageProducer is created this time and passed to the generic function &#8220;postMsg&#8221;.<br \/>\nOn &#8220;getMsgFromTopic&#8221; we use an instance scoped MessageConsumer because a DurableSubscriber is valid at a session level, so we try to create it and if it already exists an (ignored) exception is thrown and trapped. Not very elegant&#8230;<\/p>\n<p><\/span><\/p>\n<div>\n<pre><span class=\"gutter\">  61:<\/span>\r\n<span class=\"gutter\">  62:<\/span>    <span class=\"syntax8\">private<\/span> TextMessage <span class=\"syntax6\">postMsg<\/span>(MessageProducer sender, String msg) <span class=\"syntax8\">throws<\/span> \r\n                  JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  63:<\/span>        TextMessage   message <span class=\"syntax18\">=<\/span> session.<span class=\"syntax6\">createTextMessage<\/span>(msg);\r\n<span class=\"gutter\">  64:<\/span>        sender.<span class=\"syntax6\">send<\/span>(message); \r\n<span class=\"gutterH\">  65:<\/span>        sender.<span class=\"syntax6\">close<\/span>();\r\n<span class=\"gutter\">  66:<\/span>        <span class=\"syntax8\">return<\/span> message;\r\n<span class=\"gutter\">  67:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  68:<\/span>    \r\n<span class=\"gutter\">  69:<\/span>    <span class=\"syntax8\">private<\/span> javax.jms.TextMessage[] <span class=\"syntax6\">getMsg<\/span>(MessageConsumer receiver) <span class=\"syntax8\">throws<\/span>\r\n                  JMSException<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutterH\">  70:<\/span>        javax.jms.Message message<span class=\"syntax18\">=<\/span>receiver.<span class=\"syntax6\">receive<\/span>(<span class=\"syntax5\">100<\/span>);\r\n<span class=\"gutter\">  71:<\/span>        TextMessage text<span class=\"syntax18\">=<\/span> (message <span class=\"syntax8\">instanceof<\/span> TextMessage) ?\r\n                  (TextMessage) message : <span class=\"syntax14\">null<\/span>;\r\n<span class=\"gutter\">  72:<\/span>        javax.jms.TextMessage[] msgs<span class=\"syntax18\">=<\/span><span class=\"syntax18\">{<\/span>text<span class=\"syntax18\">}<\/span>;\r\n<span class=\"gutter\">  73:<\/span>        <span class=\"syntax8\">return<\/span> (msgs);\r\n<span class=\"gutter\">  74:<\/span>    <span class=\"syntax18\">}<\/span>    \r\n<span class=\"gutterH\">  75:<\/span>\r\n<span class=\"gutter\">  76:<\/span><span class=\"syntax18\">}<\/span><\/pre>\n<\/div>\n<p>These are the generic methods we were talking about. They just post\/retrieve a message. In both cases a text message(the received or the sent) is passed back to the caller.<br \/>\nOn &#8220;getMsg&#8221; I&#8217;m using a TextMessage array as return type to make the function compatible with an eventual multi message retrieving method.<\/p>\n<p>This is a very basic implementation, lots of things are missing and other should be considered(finalizing, closing sessions\/connections etc.), but it&#8217;s maybe good enough as a starting point.<br \/>\nLet&#8217;s go on with the XFire section now.<\/p>\n<h4><strong>Exposing the service via XFire<\/strong><\/h4>\n<p><span style=\"font-size: small;\">The following simple class is everything we need to expose our <em>OpenJMSService<\/em> interface as a SOAP service through XFire.<\/p>\n<p><\/span><\/p>\n<pre><span class=\"syntax0\"><span class=\"gutter\">   1:<\/span>\r\n<span class=\"gutter\">   2:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.XFire;\r\n<span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.XFireFactory;\r\n<span class=\"gutter\">   4:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.client.XFireProxyFactory;\r\n<span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.server.http.XFireHttpServer;\r\n<span class=\"gutter\">   6:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.service.Service;\r\n<span class=\"gutter\">   7:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.service.binding.ObjectServiceFactory;\r\n<span class=\"gutter\">   8:<\/span><span class=\"syntax9\">import<\/span> org.codehaus.xfire.service.invoker.BeanInvoker;\r\n<span class=\"gutter\">   9:<\/span>\r\n<span class=\"gutterH\">  10:<\/span><span class=\"syntax3\">\/**<\/span>\r\n<span class=\"gutter\">  11:<\/span> <span class=\"syntax3\">*<\/span>\r\n<span class=\"gutter\">  12:<\/span> <span class=\"syntax3\">*<\/span> <span class=\"syntax12\">@author<\/span> <span class=\"syntax3\">beanizer<\/span>\r\n<span class=\"gutter\">  13:<\/span> <span class=\"syntax3\">*\/<\/span>\r\n<span class=\"gutter\">  14:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax10\">class<\/span> Main <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutterH\">  15:<\/span>    XFireHttpServer server;\r\n<span class=\"gutter\">  16:<\/span>    <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">main<\/span>(String[] args) <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  17:<\/span>        Main starter <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">Main<\/span>();\r\n<span class=\"gutter\">  18:<\/span>        <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  19:<\/span>            starter.<span class=\"syntax6\">start<\/span>();\r\n<span class=\"gutterH\">  20:<\/span>        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (Exception ex) <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  21:<\/span>            ex.<span class=\"syntax6\">printStackTrace<\/span>();\r\n<span class=\"gutter\">  22:<\/span>        <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  23:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  24:<\/span>    <span class=\"syntax8\">public<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">start<\/span>() <span class=\"syntax8\">throws<\/span> Exception\r\n<span class=\"gutterH\">  25:<\/span>    <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  26:<\/span>        <span class=\"syntax2\">\/\/<\/span> <span class=\"syntax2\">Create<\/span> <span class=\"syntax2\">an<\/span> <span class=\"syntax2\">XFire<\/span> <span class=\"syntax2\">Service<\/span>\r\n<span class=\"gutter\">  27:<\/span>        ObjectServiceFactory serviceFactory <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">ObjectServiceFactory<\/span>();\r\n<span class=\"gutter\">  28:<\/span>        XFire xfire <span class=\"syntax18\">=<\/span> XFireFactory.<span class=\"syntax6\">newInstance<\/span>().<span class=\"syntax6\">getXFire<\/span>();\r\n<span class=\"gutter\">  29:<\/span>        \r\n<span class=\"gutterH\">  30:<\/span>        Service service <span class=\"syntax18\">=<\/span> serviceFactory.<span class=\"syntax6\">create<\/span>(OpenJMSService.<span class=\"syntax10\">class<\/span>);\r\n<span class=\"gutter\">  31:<\/span>        service.<span class=\"syntax6\">setInvoker<\/span>(<span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BeanInvoker<\/span>(<span class=\"syntax8\">new<\/span> <span class=\"syntax6\">OpenJMSServiceImpl<\/span>()));\r\n<span class=\"gutter\">  32:<\/span>        xfire.<span class=\"syntax6\">getServiceRegistry<\/span>().<span class=\"syntax6\">register<\/span>(service);\r\n<span class=\"gutter\">  33:<\/span>        \r\n<span class=\"gutter\">  34:<\/span>        <span class=\"syntax2\">\/\/<\/span> <span class=\"syntax2\">Start<\/span> <span class=\"syntax2\">the<\/span> <span class=\"syntax2\">HTTP<\/span> <span class=\"syntax2\">server<\/span>\r\n<span class=\"gutterH\">  35:<\/span>        server <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">XFireHttpServer<\/span>();\r\n<span class=\"gutter\">  36:<\/span>        server.<span class=\"syntax6\">setPort<\/span>(<span class=\"syntax5\">8191<\/span>);\r\n<span class=\"gutter\">  37:<\/span>        server.<span class=\"syntax6\">start<\/span>();\r\n<span class=\"gutter\">  38:<\/span>    <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  39:<\/span>    <span class=\"syntax8\">public<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">stop<\/span>() <span class=\"syntax8\">throws<\/span> Exception\r\n<span class=\"gutterH\">  40:<\/span>    <span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  41:<\/span>        server.<span class=\"syntax6\">stop<\/span>();\r\n<span class=\"gutter\">  42:<\/span>    <span class=\"syntax18\">}<\/span>    \r\n<span class=\"gutter\">  43:<\/span><span class=\"syntax18\">}<\/span> <\/span><\/pre>\n<p>Xfire allows us to avoid the hassle of setting up a servlet engine, by providing an embedded http server(Jetty). The above code is pretty self-explaining; after creating an XFire object through a factory, we register a service (our OpenJMSService service) on it and just start the embedded http server. That&#8217;s all!!!<br \/>\nJust put in your classpath the required XFire and OpenJMS jars and launch our <em>Main<\/em> class. Main.java, OpenJMSService.java and OpenJMSServiceImpl.java must reside in the same directory(you can arrange them differently in packages if you prefer).<\/p>\n<p>Now we can call our service with any SOAP client. Let&#8217;s see how to do it with PHP.<\/p>\n<h4><\/h4>\n<p><strong>Accessing the SOAP service from PHP<\/strong><\/p>\n<p><span style=\"font-size: small;\">First, from a system shell start OpenJMS admin GUI (admin.sh or admin.bat in <em>bin<\/em>) and create a queue with name &#8220;myqueue&#8221; and a topic with name &#8220;mytopic&#8221; containig a consumer named &#8220;cons1&#8221;.<br \/>\nThe following simple class is everything we need to access our <em>OpenJMSService<\/em> SOAP service from PHP.<\/p>\n<p><\/span><\/p>\n<pre><span class=\"syntax0\"><span class=\"gutter\">   1:<\/span><span class=\"syntax17\">&lt;?php<\/span>\r\n<span class=\"gutter\">   2:<\/span>        <span class=\"syntax8\">include_once<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">nusoap<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">php<\/span><span class=\"syntax13\">\"<\/span>)<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   3:<\/span>\r\n<span class=\"gutter\">   4:<\/span>        <span class=\"syntax8\">class<\/span> <span class=\"syntax11\">OpenJms4PHP<\/span><span class=\"syntax18\">{<\/span>\r\n<span class=\"gutterH\">   5:<\/span>                <span class=\"syntax8\">var<\/span> <span class=\"syntax10\">$<\/span><span class=\"syntax10\">proxy<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   6:<\/span>                <span class=\"syntax8\">var<\/span> <span class=\"syntax10\">$<\/span><span class=\"syntax10\">params<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   7:<\/span>                <span class=\"syntax8\">var<\/span> <span class=\"syntax10\">$<\/span><span class=\"syntax10\">sess<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   8:<\/span>                <span class=\"syntax8\">var<\/span> <span class=\"syntax10\">$<\/span><span class=\"syntax10\">client<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   9:<\/span>                \r\n<span class=\"gutterH\">  10:<\/span>                <span class=\"syntax8\">function<\/span> <span class=\"syntax6\">OpenJms4PHP<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">endpoint<\/span>)<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  11:<\/span>                        <span class=\"syntax11\">$this<\/span><span class=\"syntax10\">-&gt;client<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax11\">soapclient<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">endpoint<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax8\">true<\/span>)<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">  12:<\/span>                        <span class=\"syntax11\">$this<\/span><span class=\"syntax10\">-&gt;proxy<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax11\">$this<\/span><span class=\"syntax11\">-&gt;client<\/span><span class=\"syntax6\">-&gt;getProxy<\/span>()<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">  13:<\/span>                        \r\n<span class=\"gutter\">  14:<\/span>                <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutterH\">  15:<\/span>                <span class=\"syntax8\">function<\/span> <span class=\"syntax6\">PostMsgToQueue<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">queueName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">msg<\/span>)<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  16:<\/span>                        <span class=\"syntax8\">return<\/span> <span class=\"syntax11\">$this<\/span><span class=\"syntax11\">-&gt;proxy<\/span><span class=\"syntax6\">-&gt;PostMsgToQueue<\/span>(<span class=\"syntax8\">array<\/span>(\r\n                  <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in0<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">queueName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in1<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">msg<\/span>))<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">  17:<\/span>                <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  18:<\/span>                <span class=\"syntax8\">function<\/span> <span class=\"syntax6\">PostMsgToTopic<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">topicName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">msg<\/span>)<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  19:<\/span>                        <span class=\"syntax8\">return<\/span> <span class=\"syntax11\">$this<\/span><span class=\"syntax11\">-&gt;proxy<\/span><span class=\"syntax6\">-&gt;PostMsgToTopic<\/span>(<span class=\"syntax8\">array<\/span>(\r\n                  <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in0<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">topicName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in1<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">msg<\/span>))<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutterH\">  20:<\/span>                <span class=\"syntax18\">}<\/span>               \r\n<span class=\"gutter\">  21:<\/span>                <span class=\"syntax8\">function<\/span> <span class=\"syntax6\">getMsgFromTopic<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">topicName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">consumerName<\/span>)<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutter\">  22:<\/span>                        <span class=\"syntax8\">return<\/span> <span class=\"syntax11\">$this<\/span><span class=\"syntax11\">-&gt;proxy<\/span><span class=\"syntax6\">-&gt;getMsgFromTopic<\/span>(<span class=\"syntax8\">array<\/span>(\r\n                  <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in0<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">topicName<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in1<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">consumerName<\/span>))<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">  23:<\/span>                <span class=\"syntax18\">}<\/span>               \r\n<span class=\"gutter\">  24:<\/span>                <span class=\"syntax8\">function<\/span> <span class=\"syntax6\">getMsgFromQueue<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">queueName<\/span>)<span class=\"syntax18\">{<\/span>\r\n<span class=\"gutterH\">  25:<\/span>                        <span class=\"syntax8\">return<\/span> <span class=\"syntax11\">$this<\/span><span class=\"syntax11\">-&gt;proxy<\/span><span class=\"syntax6\">-&gt;getMsgFromQueue<\/span>(<span class=\"syntax8\">array<\/span>(\r\n                  <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">in0<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span><span class=\"syntax10\">$<\/span><span class=\"syntax10\">queueName<\/span>))<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">  26:<\/span>                <span class=\"syntax18\">}<\/span>               \r\n<span class=\"gutter\">  27:<\/span>                \r\n<span class=\"gutter\">  28:<\/span>        <span class=\"syntax18\">}<\/span>\r\n<span class=\"gutter\">  29:<\/span><span class=\"syntax17\">?&gt;<\/span> <\/span><\/pre>\n<p><span style=\"font-size: small;\"><br \/>\nNusoap is an excellent soap library for PHP. PHP5 includes its own soap classes. You can use them if you prefer, only minimal changes are needed.<br \/>\nAfter creating a soap object, we retrieve the proxy, and just call the exposed methods. We&#8217;ll get back an array containing the returned object, which can also be an error.<\/p>\n<p>Here a simple example of usage:<\/p>\n<p><\/span><\/p>\n<pre><span class=\"syntax0\"><span class=\"gutter\">   1:<\/span><span class=\"syntax17\">&lt;?php<\/span>\r\n<span class=\"gutter\">   2:<\/span>        <span class=\"syntax8\">include_once<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">OpenJms4PHP.php<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   3:<\/span>        <span class=\"syntax11\">$jms<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax8\">new<\/span> <span class=\"syntax6\">OpenJms4PHP<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">http<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">127<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">0<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">0<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">1<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\">8191<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">OpenJMSService<\/span><span class=\"syntax13\">?<\/span><span class=\"syntax13\">wsdl<\/span><span class=\"syntax13\">\"<\/span>)<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   4:<\/span>        <span class=\"syntax10\">$<\/span><span class=\"syntax10\">result<\/span><span class=\"syntax18\">=<\/span><span class=\"syntax11\">$jms<\/span><span class=\"syntax6\">-&gt;PostMsgToTopic<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">mytopic<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">,<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">PHP2OpenJMSService<\/span> <span class=\"syntax13\">test<\/span> <span class=\"syntax13\">message<\/span><span class=\"syntax13\">\"<\/span>)<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutterH\">   5:<\/span>        <span class=\"syntax8\">echo<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">&lt;<\/span><span class=\"syntax13\">pre<\/span><span class=\"syntax13\">&gt;<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   6:<\/span>        <span class=\"syntax9\">print_r<\/span>(<span class=\"syntax10\">$<\/span><span class=\"syntax10\">result<\/span>)<span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   7:<\/span>        <span class=\"syntax8\">echo<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">&lt;<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">pre<\/span><span class=\"syntax13\">&gt;<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax18\">;<\/span>\r\n<span class=\"gutter\">   8:<\/span><span class=\"syntax17\">?&gt;<\/span> <\/span><\/pre>\n<p><span style=\"font-size: small;\"><\/p>\n<p>The URL passed to the contructor of OpenJms4PHP is the XFire server one (on localhost and port 8191, the default).<\/p>\n<p><strong>Conclusions<\/strong><br \/>\nWith an interface, 2 small java classes and a PHP script, we&#8217;ve built the (still incomplete) root for a trivial to use messaging system.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction I recently got involved in a project where reliable communication between etherogenous platforms was required. Having already worked with JMS, I had to find a way to expose its services to the frontend(a PHP base web application). Some time before I had come across XFire, and had been looking for a chance to work ..<\/p>\n<div class=\"clear-fix\"><\/div>\n<p><a href=\"http:\/\/symbioticindia.in\/docu\/2016\/05\/06\/exposing-openjms-to-php\/\" title=\"read more...\">Read more<\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,9,6],"tags":[],"class_list":["post-42","post","type-post","status-publish","format-standard","hentry","category-java","category-jms","category-php"],"_links":{"self":[{"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/posts\/42","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/comments?post=42"}],"version-history":[{"count":1,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":43,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/posts\/42\/revisions\/43"}],"wp:attachment":[{"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/symbioticindia.in\/docu\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}