Skip to end of metadata
Go to start of metadata

Tiny Link


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


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

Source Code

Documentation JMS v1.1


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"
      <property name="connectionFactory"
        ref="org.sakaiproject.messageservice.JmsConnectionFactory" />
      <property name="queueName" value="test.destination" />

  <!-- definition of listner container -->
  <bean id="listenerContainer"
      <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"/>

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


  • changing the persistence adapter
    The persistence adapter can be changed in or
    property name:
    default value:
    possible persistence adapters:
  • 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"
        <property name="brokerURL" value="discovery:(multicast://sakai)"/>
      <bean id="org.sakaiproject.messageservice.activemq.TransportConnector"
        <property name="name" value="default" />
        <property name="uri" ref="org.sakaiproject.messageservice.api.BrokerUrl" />
        <property name="discoveryUri" ref="org.sakaiproject.messageservice.api.DiscoveryUrl"/>
      <bean id="org.sakaiproject.messageservice.activemq.NetworkConnectorListFactory"
        <property name="targetBeanName"
          value="org.sakaiproject.messageservice.activemq.DiscoveryNetworkConnectorList" />
  • changing other Broker properties










    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 --dport 61616 -j ACCEPT
      -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp -s --dport 6155 -j ACCEPT

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

Using MessageService in existing Sakai services and tools