JGroups

一特点

1.不再需要维护一个中心服务器。

2.消息将发给集群中的所有节点。

3.一个节点宕机/加入时,其它节点会得到一个回调通知消息。

4.可维护一个集群范围内的共享状态(信息)。

二概要

1.JGroups主要通过JChannel来收发消息包括当前节点加入集群、其它节点加入/离开集群或正常的业务消息。

2.消息信息主要包括消息体、消息地址、消息目的端口。

3.所有的实例列表叫视图,所有的实例包含同样的视图。该列表按照实际加入集群的顺序排序,列表第一个即是时间最老的实例节点。

4.消息收发样例

package com.yangsj.test;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import org.jgroups.JChannel;

import org.jgroups.Message;

import org.jgroups.ReceiverAdapter;

import org.jgroups.View;

public class SimpleChat extends ReceiverAdapter

{

    JChannel channel;

    String user_name = System.getProperty("user.name", "n/a");

    private void start() throws Exception

    {

        channel = new JChannel("udp.xml"); // use the default config, udp.xml

        

        channel.connect("ChatCluster");

        channel.setReceiver(this);

        

        eventLoop();

        channel.close();

    }

    

    private void eventLoop()

    {

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        

        while (true)

        {

            try

            {

                System.out.print("> ");

                System.out.flush();

                String line = in.readLine().toLowerCase();

                if (line.startsWith("quit") || line.startsWith("exit"))

                    break;

                line = "[" + user_name + "] " + line;

                Message msg = new Message(null, null, line);

                channel.send(msg);

            }

            catch (Exception e)

            {

                

            }

        }

    }

    

    public void viewAccepted(View new_view)

    {

        System.out.println("** view: " + new_view);

    }

    public void receive(Message msg)

    {

        System.out.println(msg.getSrc() + ": " + msg.getObject());

    }

    public static void main(String[] args) throws Exception

    {

        new SimpleChat().start();

    }

}

三维护公共集群状态

1.维护公共状态主要是指数据集群间复制以达到集群间的数据一致性。比如HTT会话,当持有会话的服务器宕机后用户的会话信息仍能够获取到。

2.新节点加入集群时会发生公共数据传输。

3.新节点加入集群时获取公共数据样例

public void receive(Message msg) { String line=msg.getSrc() + ": " + msg.getObject(); System.out.println(line); synchronized(state) { state.add(line); } }

getState 方法由state provider

public void getState(OutputStream output) throws Exception { synchronized(state) { Util.objectToStream(state, new DataOutputStream(output)); } }

setState方法由state requester

public void setState(InputStream input) throws Exception { List<String> list; list=(List<String>)Util.objectFromStream(new DataInputStream(input)); synchronized(state) { state.clear(); state.addAll(list); } System.out.println(list.size() + " messages in chat history):"); for(String str: list) { System.out.println(str); } }

猜你喜欢

转载自yangsj19870829.iteye.com/blog/2166408