我正在使用一个服务(WSO2CEP),它将事件发送到我开发的节点js程序,让我们称之为receiver.js,然后将这些事件存储在mongo db中。 WSO2CEP和receiver.js之间的通信是通过HTTP连接完成的。我面临的问题是,当WSO2发送一个事件时,receiver.js将其捕获并将其存储在数据库中,几秒钟后,它会检测到新事件已到达,这不是真的,并将其再次存储在数据库中。第二个事件与第一个事件相同。
当我看到我认为问题是WSO2多次发送相同的事件时,但我调试它我100%确定只发送一个事件,所以问题似乎是HTTP连接。
HTTP连接由作为服务器的receiver.js和作为客户端的WSO2处理,它通过HTTP post请求发送事件。 receiver.js中的http服务器实现是使用“express”框架完成的。正如在下面的代码块中可以看到的那样。
'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const EventEmitter = require('events');
const port = Whatever;
module.exports = class WSO2Server extends EventEmitter {
constructor () {
super();
const app = express();
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.route('/Whatever').post( (req, res) => {
let event = req.body;
this.emit('event', event);
});
this.server = app.listen(port);
}
destroy () {
this.server.close();
}
}
我怀疑这些事件存储在一个队列(或类似的)中,并且每隔一段时间就会被重新传输。有什么想法吗?谢谢
答案 0 :(得分:1)
查看您的代码,我根本看不到您使用响应对象。在您调用this.emit('event', event);
之后,您应该调用res.status(201).end();
之类的内容,将HTTP状态201发送回主叫客户端。
因为您没有在响应对象上设置任何信息,所以您的应用程序挂起并且没有对HTTP调用做出响应。因此,像nginx或apache这样的东西会在特定超时后重新向您的应用程序发出请求。
如果您使用res.status(201).end();
明确创建回复,那么您的请求将正确结束,并且不会进行重复调用。