Почему JGroups возвращает один и тот же сервер несколько раз

#java #jgroups

Вопрос:

Запустил следующий пример программы, чтобы посмотреть, какие узлы рассматриваются как находящиеся в моем кластере.

 import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.util.Util;
import org.jgroups.*;

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Vector;

public class ClusterCheck extends ReceiverAdapter
{
    JChannel channel;
    JChannelFactory channelFactory;

    String channelPropertiesPrimary;

    String user_name=System.getProperty("user.name", "n/a");
        final List<String> state=new LinkedList<String>();

    private void start() throws Exception
        {
            Properties properties = new Properties();
            FileInputStream fis = new FileInputStream( new File("myConfigfile.properties"));  
            properties.load( fis );
            channelPropertiesPrimary = properties.getProperty( "udpinfo" );
            channelFactory = new JChannelFactory();
            channel = (JChannel) channelFactory.createChannel((Object)channelPropertiesPrimary);
            channel.setOpt( Channel.VIEW, new Boolean( true ) );
            channel.setOpt( Channel.LOCAL, new Boolean( false ) );
            channel.setOpt( Channel.SUSPECT, new Boolean( true ) );
            channel.setOpt( Channel.AUTO_RECONNECT, new Boolean( true ) );
            channel.connect("myClusterName");     
            org.jgroups.View view   = channel.getView();
            if (view != null)
            {
                    System.out.println("There are "   view.getMembers().size()   " members in this Cluster");
                    Vector viewMembers      = view.getMembers();
                    for ( Iterator i = viewMembers.iterator(); i.hasNext(); )
                    {
                            System.out.println( ( i.next() ).toString() );
                    }
            }
        }

    public static void main(String[] args) throws Exception {
        new ClusterCheck().start();
    }
        public void viewAccepted(View view)
        {
            System.out.println("There are currently "   view.getMembers().size()   " members in this Cluster");
        }

        public void receive(Message msg)
        {
//              System.out.println(msg.getSrc()   ": "   msg.getObject());
        }

}
 

Вот часть вывода, который я вижу :

  :
 :
 INFO: handling view-change up: [myServer01-59496|0] [myServer01-59496]
 There are 4 
 myServer01-21483
 7203a079-b7bb-f565-22dd-a25aeeb3eda3
 41323243-3452-abc3-569b-a5821cb4e433
 myServer01-21483
 :
 :
 

Я понимаю, что случайные числа-это другие серверы, но почему в нем перечислены 4 сервера в группе, но дважды указан myServer01?

Ответ №1:

Другой процесс выполнялся с тем же именем группы на той же машине.

Я ожидал, что он вернет имя узла только один раз, независимо от того, сколько процессов выполняется с одним и тем же именем группы, но, похоже, JGroups находит имя узла для каждого процесса, прослушивающего в одной и той же группе, поэтому один и тот же узел может быть указан более одного раза.