dl
Version:
DreamLab Libs
119 lines (92 loc) • 4.03 kB
JavaScript
var core = require('core');
var Event = core.event.Event;
var RbmqExchange = core.client.rabbitmq.RbmqExchange;
var QueueClient = require('./QueueClient').QueueClient;
var QueueMessage = require('./QueueMessage').QueueMessage;
var QueuePublisher = function() {
QueueClient.apply(this, arguments);
this._publishBuffer = [];
this._publishBufferSize = 0;
};
QueuePublisher.prototype = Object.create(QueueClient.prototype);
QueuePublisher.prototype._onConnected = function () {
this._exchangeConfig = this._credentials.getExchangeConfig();
this._rbmqChannel = new RbmqExchange(this._rbmqConnection, this._exchangeConfig);
QueueClient.prototype._onConnected.call(this);
};
QueuePublisher.prototype._onChannelOpened = function () {
QueueClient.prototype._onChannelOpened.call(this);
while (this._publishBuffer.length > 0) {
console.info('QueuePublisher/_onConnected: Publishing queued messages');
this.publish(this._publishBuffer.shift());
}
};
QueuePublisher.prototype.setPublishBufferSize = function (size) {
this._publishBufferSize = size;
};
QueuePublisher.prototype.getPublishBufferSize = function () {
return this._publishBufferSize;
};
QueuePublisher.prototype._addToBuffer = function (msg) {
if (this._publishBuffer.length < this.getPublishBufferSize()) {
this._publishBuffer.push(msg);
} else {
var errorTxt = 'Publish buffer limit exceeded. ' + this._publishBuffer.length + '/' + this.getPublishBufferSize();
var errObj = new Error('Queue buffer limit exceeded');
errObj.code = QueuePublisher.Error.BUFFER_LIMIT_EXCEEDED;
msg.dispatchEvent(new Event(QueueMessage.Event.REJECTED, {
message: msg,
error: errObj
}));
this.dispatchEvent(new Event(QueuePublisher.Event.MESSAGE_BUFFER_EXCEEDED, {
message: errorTxt,
error: errObj
}));
}
};
QueuePublisher.prototype.publish = function(message) {
if (!this._rbmqChannel) {
if (this.getPublishBufferSize()) {
this._addToBuffer(message);
} else {
message.dispatchEvent(new Event(QueueMessage.Event.REJECTED, {
message: message,
error: new Error('Queue disconnected')
}));
}
return;
}
if (message.isPublished()) {
message.dispatchEvent(new Event(QueueMessage.Event.REJECTED, {
message: message,
error: new Error('Message has already been published before, create new one')
}));
return;
}
if (this._exchangeConfig.publish.messageSizeLimit && message.getSize() > this._exchangeConfig.publish.messageSizeLimit) {
message.dispatchEvent(new Event(QueueMessage.Event.REJECTED, {
message: message,
error: new Error('Message too big. Current limit is ' + this._exchangeConfig.publish.messageSizeLimit)
}));
return;
}
message.setUserId(this._userId);
var that = this;
var timestamp = Date.now();
message.addEventListener(QueueMessage.Event.PUBLISHED, function() {
that._logger.log('publish', 'confirm.delay', Date.now() - timestamp, message.getMessageId());
});
message.addEventListener(QueueMessage.Event.REJECTED, function() {
that._logger.log('publish', 'reject.delay', Date.now() - timestamp, message.getMessageId());
});
this._logger.log('publish', 'size.total', message.getSize(), message.getMessageId());
this._logger.log('publish', 'size.body', message.getBodySize(), message.getMessageId());
this._rbmqChannel.publish(message);
};
QueuePublisher.Event = {};
QueuePublisher.Event.CONNECTED = QueueClient.Event.CONNECTED;
QueuePublisher.Event.DISCONNECTED = QueueClient.Event.DISCONNECTED;
QueuePublisher.Event.MESSAGE_BUFFER_EXCEEDED = 'QueuePublisher_Event_Message_buffer_exceeded';
QueuePublisher.Error = {};
QueuePublisher.Error.BUFFER_LIMIT_EXCEEDED = -1;
exports.QueuePublisher = QueuePublisher;