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示例程序代码,
Flooder1、User1是自己写的测试程序,
Flooder、User是自带的测试程序。
现整理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);
操作失效,即消息会发给自己。