/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see .
*/
package org.alfresco.repo.cluster;
import java.io.Serializable;
import java.util.Set;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ITopic;
import com.hazelcast.core.Member;
import com.hazelcast.core.MembershipEvent;
import com.hazelcast.core.MembershipListener;
/**
* Hazelcast-based implementation of the {@link MessengerFactory} interface.
* 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 HazelcastInstanceFactory hazelcastInstanceFactory;
@Override
public Messenger createMessenger(String appRegion)
{
return createMessenger(appRegion, false);
}
@Override
public Messenger createMessenger(String appRegion, boolean acceptLocalMessages)
{
if (!isClusterActive())
{
return new NullMessenger();
}
// Clustering is enabled, create a messenger.
HazelcastInstance hazelcast = hazelcastInstanceFactory.getInstance();
ITopic topic = hazelcast.getTopic(appRegion);
String address = hazelcast.getCluster().getLocalMember().getInetSocketAddress().toString();
return new HazelcastMessenger(topic, address);
}
/**
* Provide the messenger factory with a means to obtain a HazelcastInstance.
*
* @param hazelcastInstanceFactory
*/
public void setHazelcastInstanceFactory(HazelcastInstanceFactory hazelcastInstanceFactory)
{
this.hazelcastInstanceFactory = hazelcastInstanceFactory;
}
@Override
public boolean isClusterActive()
{
return hazelcastInstanceFactory.isClusteringEnabled();
}
@Override
public void addMembershipListener(final ClusterMembershipListener listener)
{
if (isClusterActive())
{
HazelcastInstance hazelcast = hazelcastInstanceFactory.getInstance();
hazelcast.getCluster().addMembershipListener(new MembershipListener()
{
@Override
public void memberRemoved(MembershipEvent e)
{
listener.memberLeft(member(e), cluster(e));
}
@Override
public void memberAdded(MembershipEvent e)
{
listener.memberJoined(member(e), cluster(e));
}
private String member(MembershipEvent e)
{
return e.getMember().getInetSocketAddress().toString();
}
private String[] cluster(MembershipEvent e)
{
Set members = e.getCluster().getMembers();
String[] cluster = new String[members.size()];
int i = 0;
for (Member m : members)
{
cluster[i++] = m.getInetSocketAddress().toString();
}
return cluster;
}
});
}
}
}