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
Insert excerpt | ||||||
---|---|---|---|---|---|---|
|
...
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>
|
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
- I asked about JMS session usage in the ActiveMQ forum, and here is the thread:
Configuring
...
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
...
- 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.xmlNo 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
...