2012-03-16 99 views
0

我想获取系统通知并将它们通过http传递给客户端。将两个主循环合并为一个node.js进程

现在我使用node.js在一个进程中提供这两个服务,但存在一个问题。 通知监听器有自己的主循环监听系统事件,当服务启动时,它使服务器停止提供http服务。我认为如果我能将这两种服务的主要环路合并为一个,问题就可以解决。这可能吗?我怎么能开始?

谢谢

下面是示例代码:

var server = require("express").createServer(), 
    io = require('socket.io').listen(server); 

server.listen(8000); 
server.get("/", function (req, res) { 
    res.sendfile("./public/main.html"); 
}); 
io.of('/images').on('connection', function (socket) { 
    //read images and transfer 
} 
io.of('/notify').on('connection', function (socket) { 
    //start listen system notifications 
    notifyLib.start_daemon(); 
} 

“notifyLib.start_daemon()” 是一个原生扩展其代码如下:

DBusError error; 
int rt; 

dbus_error_init (&error); 
connection = dbus_bus_get (DBUS_BUS_SESSION, &error); 
if (dbus_bus_name_has_owner(connection, DBUS_NAME, &error)) 
    printf("*** DBUS_NAME had owner\n"); 
rt = dbus_bus_request_name (connection, DBUS_NAME, 0, &error); 
if (!dbus_connection_add_filter (connection, filter_func, NULL, NULL)) 
    printf("*** Failed to add filter\n"); 
if (!dbus_connection_register_object_path (connection, DBUS_PATH, &echo_vtable, (void*) 0xdeadbeef)) 
    printf("*** Failed to register object path\n"); 
while (dbus_connection_read_write_dispatch (connection, -1)) 
    ; 
dbus_connection_remove_filter (connection, filter_func, NULL); 
dbus_connection_unref (connection); 
dbus_shutdown(); 

有有很多图像需要传输,但是当听者启动时,图像传输将停止。

+0

你能提供一些代码吗? – Magic 2012-03-16 07:20:57

+0

我在帖子中添加了示例代码。 – Bruce 2012-03-16 10:27:59

+0

这很难理解你的意思。你在阻止服务器的'/ notify'连接处理程序中做了些什么?如果是这样,你应该提供源代码。你上面有什么看起来很好。 – 2012-03-16 10:41:48

回答

0

希望我明白你的问题。

最简单的解决方案是使用Cluster

由于叉几个进程来处理该请求。

+0

感谢您的帮助。我使用child_process.fork()作为解决方法。我猜在notifyLib.start_daemon()中提供了dbus服务的while循环阻塞了服务器。通过使用child_process.fork(),系统中有两个节点进程。我最初试图做的是将此循环集成到node.js事件循环中。所以在服务器运行时只需要一个进程。 – Bruce 2012-03-20 01:19:24

0

从节点,你可以做一个计时器来调用dbus_connection_read_write_dispatch()?

然后,您可以删除while()循环。

你必须将dbus清理代码移动到它自己的函数中,当你完成处理DBus时,节点可以调用它。

https://nodejs.org/en/docs/guides/timers-in-node/