mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -179,6 +179,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="messengerFactory"
|
||||||
|
class="org.alfresco.repo.cluster.JGroupsMessengerFactory"
|
||||||
|
depends-on="jgroupsChannelFactory"/>
|
||||||
|
|
||||||
<bean id="encryptionChecker" class="org.alfresco.encryption.EncryptionChecker">
|
<bean id="encryptionChecker" class="org.alfresco.encryption.EncryptionChecker">
|
||||||
<property name="transactionService" ref="transactionService"/>
|
<property name="transactionService" ref="transactionService"/>
|
||||||
<property name="keyStoreChecker" ref="keyStoreChecker"/>
|
<property name="keyStoreChecker" ref="keyStoreChecker"/>
|
||||||
|
@@ -69,15 +69,14 @@ public class HazelcastMessenger<T extends Serializable> implements Messenger<T>,
|
|||||||
receiverDelegate.onReceive(message);
|
receiverDelegate.onReceive(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getTopicName()
|
|
||||||
{
|
|
||||||
return topic.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isConnected()
|
public boolean isConnected()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected ITopic<T> getTopic()
|
||||||
|
{
|
||||||
|
return topic;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,38 +21,32 @@ package org.alfresco.repo.cluster;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.alfresco.util.PropertyCheck;
|
import com.hazelcast.core.HazelcastInstance;
|
||||||
|
|
||||||
import com.hazelcast.core.ITopic;
|
import com.hazelcast.core.ITopic;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hazelcast-based implementation of the {@link MessengerFactory} interface.
|
* Hazelcast-based implementation of the {@link MessengerFactory} interface.
|
||||||
* The factory must be configured with an {@link ITopic} - which
|
* The factory must be configured with a {@link HazelcastInstance} - which
|
||||||
* should be configured with a topic name that corresponds to an application
|
* is the underlying factory for {@link ITopic} creation.
|
||||||
* region.
|
|
||||||
*
|
*
|
||||||
* @author Matt Ward
|
* @author Matt Ward
|
||||||
*/
|
*/
|
||||||
public class HazelcastMessengerFactory implements MessengerFactory
|
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;
|
this.hazelcast = hazelcast;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @see org.alfresco.repo.cluster.MessengerFactory#createMessenger()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public <T extends Serializable> Messenger<T> createMessenger()
|
|
||||||
{
|
|
||||||
PropertyCheck.mandatory(this, "topic", topic);
|
|
||||||
return new HazelcastMessenger(topic);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,14 +19,16 @@
|
|||||||
|
|
||||||
package org.alfresco.repo.cluster;
|
package org.alfresco.repo.cluster;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.runners.MockitoJUnitRunner;
|
import org.mockito.runners.MockitoJUnitRunner;
|
||||||
|
|
||||||
|
import com.hazelcast.core.HazelcastInstance;
|
||||||
import com.hazelcast.core.ITopic;
|
import com.hazelcast.core.ITopic;
|
||||||
|
|
||||||
|
|
||||||
@@ -39,20 +41,23 @@ import com.hazelcast.core.ITopic;
|
|||||||
public class HazelcastMessengerFactoryTest
|
public class HazelcastMessengerFactoryTest
|
||||||
{
|
{
|
||||||
private HazelcastMessengerFactory factory;
|
private HazelcastMessengerFactory factory;
|
||||||
private @Mock ITopic<Object> topic;
|
private @Mock HazelcastInstance hazelcast;
|
||||||
|
private @Mock ITopic<String> topic;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp()
|
public void setUp()
|
||||||
{
|
{
|
||||||
factory = new HazelcastMessengerFactory();
|
factory = new HazelcastMessengerFactory();
|
||||||
factory.setTopic(topic);
|
factory.setHazelcast(hazelcast);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void topicWrappedInMessenger()
|
public void topicWrappedInMessenger()
|
||||||
{
|
{
|
||||||
when(topic.getName()).thenReturn("app-region");
|
when(hazelcast.<String>getTopic("app-region")).thenReturn(topic);
|
||||||
HazelcastMessenger messenger = (HazelcastMessenger) factory.createMessenger();
|
|
||||||
assertEquals("app-region", messenger.getTopicName());
|
Messenger<String> messenger = factory.createMessenger("app-region");
|
||||||
|
|
||||||
|
assertSame(topic, ((HazelcastMessenger<String>) messenger).getTopic());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -80,7 +80,7 @@ public class HazelcastTest implements MessageListener<String>
|
|||||||
topic.addMessageListener(this);
|
topic.addMessageListener(this);
|
||||||
|
|
||||||
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
|
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
|
||||||
Messenger<String> messenger = messengerFactory.createMessenger();
|
Messenger<String> messenger = messengerFactory.createMessenger("testregion");
|
||||||
messenger.send("Full test including spring.");
|
messenger.send("Full test including spring.");
|
||||||
|
|
||||||
helper.checkMessageReceivedWas("Full test including spring.");
|
helper.checkMessageReceivedWas("Full test including spring.");
|
||||||
|
@@ -22,9 +22,8 @@ package org.alfresco.repo.cluster;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.alfresco.repo.jgroups.AlfrescoJGroupsChannelFactory;
|
import org.alfresco.repo.jgroups.AlfrescoJGroupsChannelFactory;
|
||||||
import org.alfresco.util.PropertyCheck;
|
import org.alfresco.util.ParameterCheck;
|
||||||
import org.jgroups.Channel;
|
import org.jgroups.Channel;
|
||||||
import org.springframework.beans.factory.annotation.Required;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JGroups implementation of the {@link MessengerFactory} interface.
|
* JGroups implementation of the {@link MessengerFactory} interface.
|
||||||
@@ -33,20 +32,11 @@ import org.springframework.beans.factory.annotation.Required;
|
|||||||
*/
|
*/
|
||||||
public class JGroupsMessengerFactory implements MessengerFactory
|
public class JGroupsMessengerFactory implements MessengerFactory
|
||||||
{
|
{
|
||||||
private String appRegion;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@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);
|
Channel channel = AlfrescoJGroupsChannelFactory.getChannel(appRegion);
|
||||||
return new JGroupsMessenger<T>(channel);
|
return new JGroupsMessenger<T>(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Required
|
|
||||||
public void setAppRegion(String appRegion)
|
|
||||||
{
|
|
||||||
this.appRegion = appRegion;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -78,7 +78,7 @@ public class JGroupsTest extends ReceiverAdapter
|
|||||||
ch.setReceiver(this);
|
ch.setReceiver(this);
|
||||||
|
|
||||||
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
|
MessengerFactory messengerFactory = (MessengerFactory) ctx.getBean("messengerFactory");
|
||||||
Messenger<String> messenger = messengerFactory.createMessenger();
|
Messenger<String> messenger = messengerFactory.createMessenger("testregion");
|
||||||
messenger.send("Full test including spring.");
|
messenger.send("Full test including spring.");
|
||||||
|
|
||||||
helper.checkMessageReceivedWas("Full test including spring.");
|
helper.checkMessageReceivedWas("Full test including spring.");
|
||||||
@@ -97,8 +97,8 @@ public class JGroupsTest extends ReceiverAdapter
|
|||||||
AlfrescoJGroupsChannelFactory.rebuildChannels();
|
AlfrescoJGroupsChannelFactory.rebuildChannels();
|
||||||
|
|
||||||
JGroupsMessengerFactory messengerFactory = new JGroupsMessengerFactory();
|
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.");
|
messenger.send("This is a test payload.");
|
||||||
|
|
||||||
helper.checkMessageReceivedWas("This is a test payload.");
|
helper.checkMessageReceivedWas("This is a test payload.");
|
||||||
|
@@ -28,5 +28,5 @@ import java.io.Serializable;
|
|||||||
*/
|
*/
|
||||||
public interface MessengerFactory
|
public interface MessengerFactory
|
||||||
{
|
{
|
||||||
<T extends Serializable> Messenger<T> createMessenger();
|
<T extends Serializable> Messenger<T> createMessenger(String appRegion);
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<beans>
|
<beans>
|
||||||
|
|
||||||
<bean id="messengerFactory" class="org.alfresco.repo.cluster.HazelcastMessengerFactory">
|
<bean id="messengerFactory" class="org.alfresco.repo.cluster.HazelcastMessengerFactory">
|
||||||
<property name="topic" ref="messengerTopic"/>
|
<property name="hazelcast" ref="hazelcastInstance"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
|
<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
|
||||||
@@ -19,8 +19,4 @@
|
|||||||
</bean>
|
</bean>
|
||||||
</constructor-arg>
|
</constructor-arg>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="messengerTopic" factory-bean="hazelcastInstance" factory-method="getTopic">
|
|
||||||
<constructor-arg value="testregion"/>
|
|
||||||
</bean>
|
|
||||||
</beans>
|
</beans>
|
||||||
|
@@ -16,12 +16,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="messengerFactory"
|
||||||
<!--
|
class="org.alfresco.repo.cluster.JGroupsMessengerFactory"
|
||||||
This could also be done as a spring FactoryBean, so that anything this is wired up to will
|
depends-on="jgroupsChannelFactory"/>
|
||||||
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>
|
|
||||||
</beans>
|
</beans>
|
Reference in New Issue
Block a user