node.js+ZeroMQでメッセージング・ドリブンのイベント駆動プログラミングをやってみました.
ZeroMQのnode.jsバインディングのインストール.
> wget http://download.zeromq.org/zeromq-2.1.10.tar.gz > tar xvf zeromq-2.1.10.tar.gz > cd zeromq-2.1.10 > ./configure --prefix=/usr/local > make > su # make install exit > wget http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.41.14.tar.gz > tar xvr e2fsprogs-1.41.14.tar.gz > cd e2fsprogs-1.41.14 > ./configure --prefix=/usr/local --enable-elf-shlibs --enable-bsd-shlibs > cd lib/uuid/ > gmake > su # gmake install # exit exit >cd > wget --no-check-certificate https://github.com/JustinTulloss/zeromq.node/tarball/master > tar xvf master > cd JustinTulloss-zeromq.node-4da20cd/ > setenv PKG_CONFIG_PATH /usr/local/lib/pkgconfig > setenv NODE_PATH /usr/local/node/zmq > node-waf configure build > su # node-waf install 'install' finished successfully (0.074s) # cp -pvr . /usr/local/node/zmq/ # exit exit >
そして,インストールした2台のマシンで次のようなnode.jsのサンプルを走らせてみます.
var context = require('zmq');
var os = require('os');
console.log("Starting ...");
var publisher = context.createSocket('pub');
publisher.bindSync("tcp://*:5555");
var subscriber = context.createSocket('sub');
subscriber.subscribe("");
subscriber.connect("tcp://相手マシン名:5555");
subscriber.on('message', function(data)
{
console.log(os.hostname()+":Thank you for message ["+data+"]");
if(data.toString().substr(0,4)!="Your")
{
var mes = "Your message was ["+data+"]";
publisher.send(mes);
}
console.log("process ends");
process.exit(0);
});
setInterval(function(){
var now = os.hostname()+":"+Math.random().toString();
console.log("My message is ["+now+"]");
publisher.send(now);
}, Math.random()*10000);
こうすると,2台のマシンで乱数によって最初に会話を始めた方(「My message is」を出した方)が相手のマシンによって受け止められて(「Thank you for message [My message is ...」),メッセージを受け取った方は「Your message was を出力して停止,メッセージを出した方は「Your..」を受け取るのでやはり停止します.
要は,エージェントが会話します.
実行例は以下です.
マシンA: > node demo.js Starting ... My message is [マシンA:0.007318727904930711] マシンA:Thank you for message [Your message was マシンA:0.007318727904930711]] process ends マシンB: > node demo.js Starting ... マシンB:Thank you for message [マシンA:0.007318727904930711] process ends
メッセージが,
マシンA:0.007318727904930711
↓
Your message was マシンA:0.007318727904930711
↓
マシンA:Thank you for message [Your message was マシンA:0.007318727904930711]]
という感じで会話されてます.