Sakai MessageService

Tiny Link

Info

The Sakai MessageService integrates JMS with Sakai and exposes the JMS API as a service. ActiveMQ is used as the JMS implementation.
Moire info about this related to events here: JMS Event Service

News

  • 2008-02-13 : Switch to full spring configuration.
    • org.sakaiproject.messageservice.JmsConnectionFactory accessible via Spring declaration.
    • Retained org.sakaiproject.messageservice.api.MessageService for direct JMS implementation.
    • Changed ActiveMQ to version 5.1 to fix 'hanging' broker and client during shutdown problem.
  • 2008-02-04 : Applied some Bugfixes to the messageservice based cluster service. This should be ready for initial testing now
  • 2008-01-29 : Extended MessageService API to allow to create a connection with username and password
  • 2008-01-26 :
    • Extended MessageService API by adding "public Connection getConnection()"
    • Created MessageService sakai_2-4-x branch, which uses ActiveMQ v4.1.1
  • 2008-01-23 :
    • Finished first round of converting Sakai Cluster Service to use the Message Service. Performed initial testing in a two node setup.
    • Requested Sakai Foundation JIRA Branch for Sakai Cluster Service using Message Service: http://bugs.sakaiproject.org/jira/browse/SAK-12797

Source Code

Documentation JMS v1.1

Usage

The MessageService API is very simple and exposes the following methods:

  /*
   * 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)

  <!-- 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>

MessageService (JMS) Best Practices

  • 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

  • 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
      <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
      -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
      

Building The MessageService sakai_2-4-x Branch (Maven 1)

Using MessageService in existing Sakai services and tools

Labels

jms jms Delete
messageservice messageservice Delete
event event Delete
cluster cluster Delete
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.