Spread安装,部署,配置

 

spread是一个消息中间件:

官网地址为 www.spread.org/。分为商业版和开源版,目前开源版本为4.4.0

安装:

下载spread-src-4.4.0.tar.gz文件,解压到/home下,得到文件夹/home/spread-src-4.0.0

 

编译、安装:

$#cd spread-src-4.0.0

#./configure

#make

#make install

 

配置:

#whereis spread

可以看到安装以后的spread命令位于/usr/local/sbin/spread

配置文件路径为:/usr/local/etc/spread.conf

对配置文件进行修改:

#vi /usr/local/etc/spread.conf

在第14行左右进行修改如下:

Spread_Segment 192.168.181.255:8101 {

       server235                      192.168.181.235

       server236                      192.168.181.236

}

当然先要对机器的hosts进行配置。

 

创建用户和组:

groupadd spread

useradd -g spread spread

mkdir /var/run/spread

chown spread:spread /var/run/spread/

 

最后启动:

#spread &

就可以了

 

如果想安装在指定的文件夹下,可以使用如下命令:

./configure -prefix=/....

指定目录即可。

 

安装目录如下:

drwxr-xr-x 2 root root 4096 Nov 19 09:24bin

drwxr-xr-x 2 root root 4096 Nov 19 09:46etc

drwxr-xr-x 2 root root 4096 Nov 19 09:24include

drwxr-xr-x 2 root root 4096 Nov 19 09:24lib

drwxr-xr-x 4 root root 4096 Nov 19 09:24man

drwxr-xr-x 2 root root 4096 Nov 19 09:47sbin

drwxr-xr-x 3 root root 4096 Nov 19 09:24share

配置文件在etc下,spread命令在sbin下。

 

 

 

 

另外spread还有自带的一些命令,可以用来对其进行测试。

spread 是消息系统的daemon

spuser 是一个测试和实例程序

spmonitor 用来监控spread daemon的状态

spflooder 性能测试以及样例程序

 

用法如下:

 

spflooder -u user2 -m 10000 -b 1000

-u后面指定用户

-m指定发包数量

-b指定包大小

 

收包程序:

spflooder -u user1 -s 4803@server237 -m1000000 -ro

-s表示端口@地址

-m数量

-ro

 

 

spuser -u xie2 -s 4803@192.168.192.155     可以进入命令行

-u指定的用户不能重复

 

 

 

参考文档:

http://wenku.baidu.com/view/7f0b5b97daef5ef7ba0d3cf9.html

 

 

spread API

Spread有自带的JAVA示例程序代码,

wKiom1SQ4Quz1lIwAAGG5ZmzzPU542.jpg

Flooder1User1是自己写的测试程序,

FlooderUser是自带的测试程序。

现整理API如下,主要参考官网的doc

 

1.       创建连接:每个用户一个连接

SpreadConnection  connection = newSpreadConnection();

//使用IP、端口、用户、优先连接、是否要获取成员信息

connection.connect(InetAddress.getByName(address),port, user, false, true);

2.加入组:把组加到连接里面

SpreadGroup  group = new SpreadGroup();

group.join(connection, groupName);

3.离开组:

group.leave();

4.发消息:

SpreadMessage  msg = newSpreadMessage();

//安全消息,会让效率降低

msg.setSafe();

//发给哪个组

msg.addGroup(groupName);

//消息内容

msg.setData(new String(buffer, 0, num -1).getBytes());

   //组播

connection.multicast(msg);

5.接受消息

SpreadMessage msg  = connection.receive();

6.断开连接

connection.disconnect();

7.监听消息接受两种方式:

a)  一种是通过connection.receive();挂起,使用do-while循环

b)  一种是添加监听,即:

       i.     实现BasicMessageListener

     ii.     实现AdvancedMessageListener

然后重写其方法,设置在收到消息的时候做什么操作

   使用表明:使用do-while方式效率和稳定性都比较高。

8.如果使用do-while来监听来自spread的消息的话,在服务启动(尤其是web方式启动)spread时,需使用一个线程来启动,否则服务会挂起而不继续。可以将其放到线程池中。

9.发消息的模式:

a)  一种是组播以后自己不收:

SpreadMessage spMsg = new SpreadMessage();

spMsg.setSelfDiscard(true);

b)  一种是组播以后自己也收:不做设置就是了

10.      发消息的方法建议加一个synchronized,可以避免发消息堵塞

 

 

 

示例代码:

 

publicclass spreadConnect{

    publicstatic SpreadConnection connection = null;

    publicstatic SpreadGroup group = null;

   

    public spreadConnect(){

       

    }

   

    public spreadConnect(String user, String address, int port, StringgroupName)

    {

        try {

            connection = new SpreadConnection();

            connection.connect(InetAddress.getByName(address), port,user, false, false);

            group = new SpreadGroup();

            System.out.println("spread已连接,端口:" + port);

            group.join(connection, groupName);

           

            // Receive.

            SpreadMessage in;

//          int i=1;

            do {

                in = connection.receive();

//              startListener.datas.add(new String(in.getData()));

               

                //收消息处理

                ConnectionsHandler.handlerMsgs(newString(in.getData()));

                //判断是否是自己发送

               

//              i++;

//              if(i%10==0){

//                  System.out.println("收消息:" + i);

//              }

            } while(true);

        } catch(Exception e) {

            new Timer().schedule(new spreadThread(this), 0);

            e.printStackTrace();

        }

    }

   

    //发消息

    publicsynchronizedvoid sendMsg(String talkMsg){

        SpreadMessage spMsg = new SpreadMessage();

        spMsg.setSelfDiscard(true);

       

        spMsg.setData(new String(talkMsg).getBytes());

        try {

            if(!connection.isConnected()){

            }

            spMsg.addGroup(group);

            connection.multicast(spMsg);

        } catch (SpreadException e) {

            e.printStackTrace();

            System.out.println("发消息错误:");

            new Timer().schedule(new spreadThread(this), 0);

        }

    }

}

 

在不熟的时候,还遇到一个问题,spread4.。4版本,会导致

                SpreadMessage spMsg = new SpreadMessage();

spMsg.setSelfDiscard(true);

操作失效,即消息会发给自己。