Messenger facade: MessengerFactory.createMessenger() now takes app-region as parameter

* Allows single factory to be specified and individual consumers to use it to create appropriate application-region-scoped messengers.
* New interface more appropriate for where non-DI use will be required, e.g. Ehcache peer providers.



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@33846 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Matt Ward
2012-02-13 11:08:20 +00:00
parent b9cfc43929
commit ac387f5f7b
10 changed files with 46 additions and 63 deletions

View File

@@ -179,6 +179,10 @@
</property>
</bean>
<bean id="messengerFactory"
class="org.alfresco.repo.cluster.JGroupsMessengerFactory"
depends-on="jgroupsChannelFactory"/>
<bean id="encryptionChecker" class="org.alfresco.encryption.EncryptionChecker">
<property name="transactionService" ref="transactionService"/>
<property name="keyStoreChecker" ref="keyStoreChecker"/>

View File

@@ -69,15 +69,14 @@ public class HazelcastMessenger<T extends Serializable> implements Messenger<T>,
receiverDelegate.onReceive(message);
}
protected String getTopicName()
{
return topic.getName();
}
@Override
public boolean isConnected()
{
return true;
}
protected ITopic<T> getTopic()
{
return topic;
}
}

View File

@@ -21,38 +21,32 @@ package org.alfresco.repo.cluster;
import java.io.Serializable;
import org.alfresco.util.PropertyCheck;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ITopic;
/**
* Hazelcast-based implementation of the {@link MessengerFactory} interface.
* The factory must be configured with an {@link ITopic} - which
* should be configured with a topic name that corresponds to an application
* region.
* The factory must be configured with a {@link HazelcastInstance} - which
* is the underlying factory for {@link ITopic} creation.
*
* @author Matt Ward
*/
public class HazelcastMessengerFactory implements MessengerFactory
{
private ITopic<Object> topic;
private HazelcastInstance hazelcast;
@Override
public <T extends Serializable> Messenger<T> createMessenger(String appRegion)
{
ITopic<T> topic = hazelcast.getTopic(appRegion);
return new HazelcastMessenger<T>(topic);
}
/**
* @param topic the topic to set
* @param hazelcast the hazelcast to set
*/
public void setTopic(ITopic<Object> topic)
public void setHazelcast(HazelcastInstance hazelcast)
{
this.topic = topic;
}
/*
* @see org.alfresco.repo.cluster.MessengerFactory#createMessenger()
*/
@Override
public <T extends Serializable> Messenger<T> createMessenger()
{
PropertyCheck.mandatory(this, "topic", topic);
return new HazelcastMessenger(topic);
this.hazelcast = hazelcast;
}
}

View File

@@ -19,14 +19,16 @@
package org.alfresco.repo.cluster;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ITopic;
@@ -39,20 +41,23 @@ import com.hazelcast.core.ITopic;
public class HazelcastMessengerFactoryTest
{
private HazelcastMessengerFactory factory;
private @Mock ITopic<Object> topic;
private @Mock HazelcastInstance hazelcast;
private @Mock ITopic<String> topic;
@Before
public void setUp()
{
factory = new HazelcastMessengerFactory();
factory.setTopic(topic);
factory.setHazelcast(hazelcast);
}
@Test
public void topicWrappedInMessenger()
{
when(topic.getName()).thenReturn("app-region");
HazelcastMessenger messenger = (HazelcastMessenger) factory.createMessenger();
assertEquals("app-region", messenger.getTopicName());
when(hazelcast.<String>getTopic("app-region")).thenReturn(topic);
Messenger<String> messenger = factory.createMessenger("app-region");
assertSame(topic, ((HazelcastMessenger<String>) messenger).getTopic());
}
}

View File

@@ -80,7 +80,7 @@ public class HazelcastTest implements MessageListener<String>
topic.addMessageListener(this);
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
Messenger<String> messenger = messengerFactory.createMessenger();
Messenger<String> messenger = messengerFactory.createMessenger("testregion");
messenger.send("Full test including spring.");
helper.checkMessageReceivedWas("Full test including spring.");

View File

@@ -22,9 +22,8 @@ package org.alfresco.repo.cluster;
import java.io.Serializable;
import org.alfresco.repo.jgroups.AlfrescoJGroupsChannelFactory;
import org.alfresco.util.PropertyCheck;
import org.alfresco.util.ParameterCheck;
import org.jgroups.Channel;
import org.springframework.beans.factory.annotation.Required;
/**
* JGroups implementation of the {@link MessengerFactory} interface.
@@ -33,20 +32,11 @@ import org.springframework.beans.factory.annotation.Required;
*/
public class JGroupsMessengerFactory implements MessengerFactory
{
private String appRegion;
@Override
public <T extends Serializable> Messenger<T> createMessenger()
public <T extends Serializable> Messenger<T> createMessenger(String appRegion)
{
PropertyCheck.mandatory(this, "appRegion", appRegion);
ParameterCheck.mandatory("appRegion", appRegion);
Channel channel = AlfrescoJGroupsChannelFactory.getChannel(appRegion);
return new JGroupsMessenger<T>(channel);
}
@Required
public void setAppRegion(String appRegion)
{
this.appRegion = appRegion;
}
}

View File

@@ -78,7 +78,7 @@ public class JGroupsTest extends ReceiverAdapter
ch.setReceiver(this);
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
Messenger<String> messenger = messengerFactory.createMessenger();
Messenger<String> messenger = messengerFactory.createMessenger("testregion");
messenger.send("Full test including spring.");
helper.checkMessageReceivedWas("Full test including spring.");
@@ -97,8 +97,8 @@ public class JGroupsTest extends ReceiverAdapter
AlfrescoJGroupsChannelFactory.rebuildChannels();
JGroupsMessengerFactory messengerFactory = new JGroupsMessengerFactory();
messengerFactory.setAppRegion("testregion");
Messenger<String> messenger = messengerFactory.createMessenger();
Messenger<String> messenger = messengerFactory.createMessenger("testregion");
messenger.send("This is a test payload.");
helper.checkMessageReceivedWas("This is a test payload.");

View File

@@ -28,5 +28,5 @@ import java.io.Serializable;
*/
public interface MessengerFactory
{
<T extends Serializable> Messenger<T> createMessenger();
<T extends Serializable> Messenger<T> createMessenger(String appRegion);
}

View File

@@ -4,7 +4,7 @@
<beans>
<bean id="messengerFactory" class="org.alfresco.repo.cluster.HazelcastMessengerFactory">
<property name="topic" ref="messengerTopic"/>
<property name="hazelcast" ref="hazelcastInstance"/>
</bean>
<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
@@ -19,8 +19,4 @@
</bean>
</constructor-arg>
</bean>
<bean id="messengerTopic" factory-bean="hazelcastInstance" factory-method="getTopic">
<constructor-arg value="testregion"/>
</bean>
</beans>

View File

@@ -16,12 +16,7 @@
</property>
</bean>
<!--
This could also be done as a spring FactoryBean, so that anything this is wired up to will
gain a Messenger instance that it can use to send messages.
-->
<bean id="messengerFactory" class="org.alfresco.repo.cluster.JGroupsMessengerFactory">
<property name="appRegion" value="testregion"/>
</bean>
<bean id="messengerFactory"
class="org.alfresco.repo.cluster.JGroupsMessengerFactory"
depends-on="jgroupsChannelFactory"/>
</beans>