nodejsとactiveMQに基づくメッセージ送ります.
久しぶりにブログを書きに来ました.自分は堕落したと感じました.はははは、LZはふらふらしていて、また家の単位を変えました.暇な時間にnodejsを研究しました.ついでにこのdemoを作りました.今日はnodejsとactiveMQに基づくニュースを紹介します.内容は複雑ではなくて、新米もすぐできます.
まず、次の背景を紹介します.なぜこのようなものを作ったのですか?LZの上の会社は監視項目をしています.多くの警告はリアルタイムでweb端末に送ります.以前の技術アーキテクチャはflex+corba+mqです.初期B/Sアーキテクチャのリアルタイムプッシュは二つしかありません.一つはプラグインによる長い接続です.もう一つは輪訓またはCompetです.前者はフラッシュ技術に制限されていますが、衰退は歴史舞台から徐々に消えていきます.後者の低効率はデータ量が大きい場合はいつでも崩壊する可能性があります.httml 5のweb socket技術の発生に従って、多くの先端socket技術、例えばsocket.ioは徐々に重用され、nodejsに協力して使用して、一つの前後にsocket接続をすれば簡単に問題を解決できます.
本编は技术sockete.io+nodeJs+stomp+activeMQを使って、具体的な技术の绍介は贴りません.皆さんはネット上で楽に见つけられます.まずはページindex.httmです.
まず、次の背景を紹介します.なぜこのようなものを作ったのですか?LZの上の会社は監視項目をしています.多くの警告はリアルタイムでweb端末に送ります.以前の技術アーキテクチャはflex+corba+mqです.初期B/Sアーキテクチャのリアルタイムプッシュは二つしかありません.一つはプラグインによる長い接続です.もう一つは輪訓またはCompetです.前者はフラッシュ技術に制限されていますが、衰退は歴史舞台から徐々に消えていきます.後者の低効率はデータ量が大きい場合はいつでも崩壊する可能性があります.httml 5のweb socket技術の発生に従って、多くの先端socket技術、例えばsocket.ioは徐々に重用され、nodejsに協力して使用して、一つの前後にsocket接続をすれば簡単に問題を解決できます.
本编は技术sockete.io+nodeJs+stomp+activeMQを使って、具体的な技术の绍介は贴りません.皆さんはネット上で楽に见つけられます.まずはページindex.httmです.
$(function() {
var socket = io.connect();
socket.on('connect', function() {
//
});
socket.on('message', function(message) {
$('#messages').append($('<li></li>').text(message));
});
socket.on('disconnect', function() {
$('#messages').append('<li>Disconnected</li>');
});
});
代码中的/socket.io/socket.io.js,不是真实存在的,是nodejs加载的socket.io模块,这个插件需要在nodejs中进行添加,命令如下:
npm install socket.io
次はnodejsエンドコードです.このコードを実行する前に、まずactiveMQを起動し、activeMQを保証し、stompプロトコルと61613ポートを傍受しました.LZはこの点で損失を受けました.長い時間を浪費しました.ファイルディレクトリを配置します.
var Stomp = require('stomp-client');
var destination = '/topic/myTopic';
var client = new Stomp('127.0.0.1', 61613, 'user', 'pass');
var fs = require('fs'),
http = require('http'),
sio = require('socket.io');
var server = http.createServer(function(req, res) {
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(fs.readFileSync('./index.htm'));
});
server.listen(8888, function() {
console.log('Server listening at http://localhost:8888/');
});
// Attach the socket.io server
io = sio.listen(server);
var tempSockets = [];
io.sockets.on('connection', function(socket) {
console.log('socket connection success!!!');
tempSockets.push(socket);
socket.on('disconnect',function(){
});
});
client.connect(function(sessionId) {
client.subscribe(destination, function(body, headers) {
console.log('From MQ:', body);
//tempSocket.broadcast.emit('message', body);
tempSockets.forEach(function(socket) {
if(socket.connected)
{
socket.send(body);
}
})
});
var i = 0;
function publish(){
setTimeout(function(){
client.publish(destination, 'Hello World!'+(i++));
//publish();
},1000);
}
publish();
});
文のstomp-clientモジュールもnodejs追加が必要です.npm install stomp-client
上記のコードの中で、client.publish(destination,「ハローワールド!」+(i++)は、nodejsを提供者としてactiveMQにメッセージを送信します.実際のアプリケーションではjava端の提供者です.コードは以下の通りです.package com.feng.activemq;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* @author songfeng
* @version 1.0.
*/
public class SendMessage
{
private static final String url = "tcp://localhost:61616";
private static final String QUEUE_NAME = "choice.queue";
private static final String TOPIC_NAME = "myTopic";
protected String expectedBody = "world! ";
public void sendMessage() throws JMSException
{
Connection connection = null;
MessageProducer producer = null;
Session session = null;
try
{
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
connection = (Connection) connectionFactory.createConnection();
connection.start();
session = (Session) connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
//Destination destination = session.createQueue(QUEUE_NAME);
Destination destination = session.createTopic(TOPIC_NAME);
producer = session.createProducer(destination);
for(int i = 1 ; i <= 20; i++)
{
TextMessage message = session.createTextMessage(expectedBody+i);
message.setStringProperty("headname", "remoteB");
producer.send(message);
Thread.sleep(1000l);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
producer.close();
session.close();
connection.close();
}
}
public static void main(String[] args)
{
SendMessage sendMsg = new SendMessage();
try
{
sendMsg.sendMessage();
}
catch (Exception ex)
{
System.out.println(ex.toString());
}
}
}
とても簡単ではありませんか?重要なのは研究の過程です.ハハ、引き続き搾ります.