mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
feat(RabbitMQ Node): Add mode for acknowledging and deleting from queue later in workflow (#6225)
* Add later in workflow mode * Add new operation * Acknowledge message in next node * Add response and emit for responsePromiseHook * Remove double success message, close channel correctly * Answser messages correctly * Remove option from delete operation * move operation name to camelCase * Fix versioning * To remove: add action item in v1 * Add notice for delete from queue * Correctly only execute only the delete operation * Refactor delete from queue operator and add return last items --------- Co-authored-by: Marcus <marcus@n8n.io>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
import type {
|
||||
IDataObject,
|
||||
IDeferredPromise,
|
||||
IExecuteResponsePromiseData,
|
||||
INodeExecutionData,
|
||||
INodeProperties,
|
||||
INodeType,
|
||||
@@ -45,7 +46,6 @@ export class RabbitMQTrigger implements INodeType {
|
||||
placeholder: 'queue-name',
|
||||
description: 'The name of the queue to read from',
|
||||
},
|
||||
|
||||
{
|
||||
displayName: 'Options',
|
||||
name: 'options',
|
||||
@@ -81,6 +81,11 @@ export class RabbitMQTrigger implements INodeType {
|
||||
value: 'immediately',
|
||||
description: 'As soon as the message got received',
|
||||
},
|
||||
{
|
||||
name: 'Specified Later in Workflow',
|
||||
value: 'laterMessageNode',
|
||||
description: 'Using a RabbitMQ node to remove the item from the queue',
|
||||
},
|
||||
],
|
||||
default: 'immediately',
|
||||
description: 'When to acknowledge the message',
|
||||
@@ -139,6 +144,18 @@ export class RabbitMQTrigger implements INodeType {
|
||||
return 0;
|
||||
}) as INodeProperties[],
|
||||
},
|
||||
{
|
||||
displayName:
|
||||
"To delete an item from the queue, insert a RabbitMQ node later in the workflow and use the 'Delete from queue' operation",
|
||||
name: 'laterMessageNode',
|
||||
type: 'notice',
|
||||
displayOptions: {
|
||||
show: {
|
||||
'/options.acknowledge': ['laterMessageNode'],
|
||||
},
|
||||
},
|
||||
default: '',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -201,7 +218,6 @@ export class RabbitMQTrigger implements INodeType {
|
||||
const item: INodeExecutionData = {
|
||||
json: {},
|
||||
};
|
||||
|
||||
if (options.contentIsBinary === true) {
|
||||
item.binary = {
|
||||
data: await this.helpers.prepareBinaryData(message.content),
|
||||
@@ -222,13 +238,20 @@ export class RabbitMQTrigger implements INodeType {
|
||||
}
|
||||
|
||||
let responsePromise: IDeferredPromise<IRun> | undefined = undefined;
|
||||
if (acknowledgeMode !== 'immediately') {
|
||||
let responsePromiseHook: IDeferredPromise<IExecuteResponsePromiseData> | undefined =
|
||||
undefined;
|
||||
if (acknowledgeMode !== 'immediately' && acknowledgeMode !== 'laterMessageNode') {
|
||||
responsePromise = await this.helpers.createDeferredPromise();
|
||||
} else if (acknowledgeMode === 'laterMessageNode') {
|
||||
responsePromiseHook =
|
||||
await this.helpers.createDeferredPromise<IExecuteResponsePromiseData>();
|
||||
}
|
||||
|
||||
this.emit([[item]], undefined, responsePromise);
|
||||
|
||||
if (responsePromise) {
|
||||
if (responsePromiseHook) {
|
||||
this.emit([[item]], responsePromiseHook, undefined);
|
||||
} else {
|
||||
this.emit([[item]], undefined, responsePromise);
|
||||
}
|
||||
if (responsePromise && acknowledgeMode !== 'laterMessageNode') {
|
||||
// Acknowledge message after the execution finished
|
||||
await responsePromise.promise().then(async (data: IRun) => {
|
||||
if (data.data.resultData.error) {
|
||||
@@ -239,7 +262,11 @@ export class RabbitMQTrigger implements INodeType {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
channel.ack(message);
|
||||
messageTracker.answered(message);
|
||||
});
|
||||
} else if (responsePromiseHook && acknowledgeMode === 'laterMessageNode') {
|
||||
await responsePromiseHook.promise().then(() => {
|
||||
channel.ack(message);
|
||||
messageTracker.answered(message);
|
||||
});
|
||||
@@ -266,7 +293,6 @@ export class RabbitMQTrigger implements INodeType {
|
||||
});
|
||||
consumerTag = consumerInfo.consumerTag;
|
||||
};
|
||||
|
||||
await startConsumer();
|
||||
|
||||
// The "closeFunction" function gets called by n8n whenever
|
||||
|
||||
Reference in New Issue
Block a user