Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

No Format
  /*
   * Creates a JMS connection with the default user identity. The connection is
    * created in stopped mode. No messages will be delivered until the
    * Connection.start method is explicitly called.
   *
    * @return a newly created JMS connection. May return null
   *
    */
   public Connection createConnection();
	
  /*
   * Creates a JMS connection with the specified user identity. The connection is
    * created in stopped mode. No messages will be delivered until the 
   * Connection.start method is explicitly called.
   * 
   * @parameter userName - the caller's user name
   * @parameter password - the caller's password
   * 
   * @return a newly created JMS connection. May return null
   */
   public Connection createConnection(String userName, String password);
	
  /*
   * Gets the JMS Connection with the specified user identity, configured in components.xml
   * The connection is returned in start mode.
   *
    * @return the initially created JMS Connection object. May return null
   *
    */
   public Connection getConnection();

Usage with Spring (Sakai 2.5)

No Format
  <!-- definition of a message producer -->
  <bean id="org.sakaiproject.messageservice.test.MessageProducer"
    class="org.sakaiproject.messageservice.test.MessageProducerImpl">
      <property name="connectionFactory"
        ref="org.sakaiproject.messageservice.JmsConnectionFactory" />
      <property name="queueName" value="test.destination" />
  </bean>

  <!-- definition of listner container -->
  <bean id="listenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"
    depends-on="org.sakaiproject.messageservice.JmsConnectionFactory">
      <property name="concurrentConsumers" value="1" />
      <property name="maxConcurrentConsumers" value="1" />
      <property name="connectionFactory"
        ref="org.sakaiproject.messageservice.JmsConnectionFactory" />
      <property name="destinationName" value="test.destination" />
      <!-- set pubSubDomain to false to create a queue instead of a Publish/Subscribe topic -->
      <property name="pubSubDomain" value="true"/>
      <property name="messageListener">
	<bean class="org.sakaiproject.messageservice.test.MessageListenerImpl"/>
      </property>
  </bean>

...

  • JMS Connection Object
    • Usually there is no need to create more than one JMS Connection object, and the ActiveMQ documentation and AQM Forum posts recommend to create/use only one connection object per server. Thus, in Sakai, we should use only one connection by calling getConnection(). In rare cases, it's justified to create a second connection.
  • JMS Session

Configuring

  • Sakai Properties

    Property

    Default Value

    Comments

    jms.useJMX

    false

    If you have tomcat configured to allow JMX access, I would recommend to enable this setting as it greatly helps during the development process

    jms.brokerURL

    tcp://localhost:61616

    -

    jms.brokerDataPath

    sakai-home location

    This is either in "tomcat/sakai" or the location defined by JAVA_OPTS "-Dsakai.home=/path/to/sakai-home/"changing the persistence adapter
    The persistence adapter can be changed in sakai.properties or local.properties.
    property name:
    targetBeanName@org.sakaiproject.messageservice.activemq.PersistenceAdapter
    default value:
    org.sakaiproject.messageservice.activemq.AMQPersistenceAdapter
    possible persistence adapters:
    org.sakaiproject.messageservice.activemq.AMQPersistenceAdapter
    org.sakaiproject.messageservice.activemq.JournalPersistenceAdapter
    org.sakaiproject.messageservice.activemq.JdbcPersistenceAdapter
  • enable clustered broker
    By default the broker is configured to run in standalone mode. To enable a clustered environment and auto discovery the following change have to be applied to activemq-beans.xml
    No Format
    
      <bean id="org.sakaiproject.messageservice.JmsConnectionFactory"
        class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="discovery:(multicast://sakai)"/>
      </bean>
    
      <bean id="org.sakaiproject.messageservice.activemq.TransportConnector"
        class="org.apache.activemq.broker.TransportConnector"
        lazy-init="true">
        <property name="name" value="default" />
        <property name="uri" ref="org.sakaiproject.messageservice.api.BrokerUrl" />
        <property name="discoveryUri" ref="org.sakaiproject.messageservice.api.DiscoveryUrl"/>
      </bean>
    
      <bean id="org.sakaiproject.messageservice.activemq.NetworkConnectorListFactory"
        class="org.springframework.beans.factory.config.BeanReferenceFactoryBean"
        lazy-init="true">
        <property name="targetBeanName"
          value="org.sakaiproject.messageservice.activemq.DiscoveryNetworkConnectorList" />
      </bean>
    
    
  • changing other Broker properties

    Property

    Default

    Comments

    persistent@org.sakaiproject.messageservice.broker.BrokerService

    true

     

    useJmx@org.sakaiproject.messageservice.broker.BrokerService

    true

     

    targetBeanName@org.sakaiproject.messageservice.api.BrokerUrlStringFactory

    org.sakaiproject.messageservice.api.BrokerUrlString
    (tcp://localhost:61616?wireFormat.maxInactivityDuration=0)

    other valid bean name, that defines a url string

  • On each application node, you need to enable the following ports and protocols in your host based firewall
    • TCP port 61616
    • UDP port 6155
    • e.g. Linux iptables
      No Format
      -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 61616 -j ACCEPT
      -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp -s 192.168.1.0/24 --dport 6155 -j ACCEPT
      

...