Class JMS

  • All Implemented Interfaces:
    javax.jms.MessageListener

    public class JMS
    extends Protocol
    implements javax.jms.MessageListener
    Implementation of the transport protocol using the Java Message Service (JMS). This implementation depends on the JMS server that will distribute messages published to the specific topic to all topic subscribers.

    Protocol parameters are:

    • topicName - (required), full JNDI name of the topic to be used for message publishing;
    • cf - (optional), full JNDI name of the topic connection factory that will create topic connection, default value is "ConnectionFactory";
    • jndiCtx - (optional), value of the javax.naming.Context.INITIAL_CONTEXT_FACTORY property; you can specify it as the JVM system property -Djava.naming.factory.initial=factory.class.Name;
    • providerURL - (optional), value of the javax.naming.Context.PROVIDER_URL property; you can specify it as the JVM system property -Djava.naming.provider.url=some_url
    • ttl - (required), time to live in milliseconds. Default value is 0, that means that messages will never expire and will be accumulated by a JMS server.

    Note, when you are using the JMS protocol, try to avoid using protocols that open server socket connections, like FD_SOCK. I belive that FD is more appropriate failure detector for JMS case.

    Author:
    Roman Rokytskyy (rrokytskyy@acm.org)
    • Constructor Detail

      • JMS

        public JMS()
        Empty constructor.
    • Method Detail

      • getName

        public java.lang.String getName()
        Get the name of the protocol.
        Specified by:
        getName in class Protocol
        Returns:
        always returns the "JMS" string.
      • toString

        public java.lang.String toString()
        Get the string representation of the protocol.
        Overrides:
        toString in class java.lang.Object
        Returns:
        string representation of the protocol (not very useful though).
      • setProperties

        public boolean setProperties​(java.util.Properties props)
        Set protocol properties. Properties are:
        • topicName - (required), full JNDI name of the topic to be used for message publishing;
        • cf - (optional), full JNDI name of the topic connection factory that will create topic connection, default value is "ConnectionFactory";
        • jndiCtx - (optional), value of the javax.naming.Context.INITIAL_CONTEXT_FACTORY property; you can specify it as the JVM system property -Djava.naming.factory.initial=factory.class.Name;
        • providerURL - (optional), value of the javax.naming.Context.PROVIDER_URL property; you can specify it as the JVM system property -Djava.naming.provider.url=some_url
        Overrides:
        setProperties in class Protocol
      • onMessage

        public void onMessage​(javax.jms.Message jmsMessage)
        Implementation of the javax.jms.MessageListener interface. This method receives the JMS message, checks the destination group name. If the group name is the same as the group name of this channel, it checks the destination address. If destination address is either multicast or is the same as local address then message is unwrapped and passed up the protocol stack. Otherwise it is ignored.
        Specified by:
        onMessage in interface javax.jms.MessageListener
        Parameters:
        jmsMessage - instance of javax.jms.Message.
      • handleDownEvent

        protected java.lang.Object handleDownEvent​(Event evt)
        Handle down event, if it is not a Event.MSG type.
        Parameters:
        evt - event to handle.
      • down

        public java.lang.Object down​(Event evt)
        Called by the protocol above this. We check the event type, and if it is message, we publish it in the topic, otherwise we let the handleDownEvent(Event) take care of it.
        Overrides:
        down in class Protocol
        Parameters:
        evt - event to process.
      • sendMessage

        protected void sendMessage​(Message msg)
        Publish message in the JMS topic. We set the message source and destination addresses if they were null.
        Parameters:
        msg - message to publish.
      • start

        public void start()
                   throws java.lang.Exception
        Start the JMS protocol. This method instantiates the JNDI initial context and looks up the topic connection factory and topic itself. If this step is successful, it creates a connection to JMS server, opens a session and obtains publisher and subscriber instances.
        Overrides:
        start in class Protocol
        Throws:
        javax.jms.JMSException - if something goes wrong with JMS.
        javax.naming.NamingException - if something goes wrong with JNDI.
        java.lang.IllegalArgumentException - if the connection factory or topic cannot be found under specified names.
        java.lang.Exception - Thrown if protocol cannot be started successfully. This will cause the ProtocolStack to fail, so Channel.connect(String) will throw an exception
      • stop

        public void stop()
        Stops the work of the JMS protocol. This method closes JMS session and connection and deregisters itself from the message notification.
        Overrides:
        stop in class Protocol
      • generateLocalAddress

        protected java.lang.String generateLocalAddress()
                                                 throws java.net.UnknownHostException
        Generate random local address. This method takes host name and appends it with randomly generated integer.
        Returns:
        randomly generated local address.
        Throws:
        java.net.UnknownHostException