redis-smq 8.0.0-rc.2 → 8.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/index.cjs +23 -16
- package/dist/index.js +23 -16
- package/dist/lua/publish-scheduled-message.lua +63 -36
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
+
## [8.0.0-rc.3](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.2...v8.0.0-rc.3) (2023-12-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **scheduler:** handle unacked messages with retry delay correctly ([a97b145](https://github.com/weyoss/redis-smq/commit/a97b145f605d6b5c7d9f6f83c844c9d2447c5786))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Documentation
|
|
12
|
+
|
|
13
|
+
* update Message reference ([1cff3e3](https://github.com/weyoss/redis-smq/commit/1cff3e3fe3634ffa2d502a4bbb589948ed8e56ea))
|
|
14
|
+
* update TRedisSMQEvent reference ([5afa22e](https://github.com/weyoss/redis-smq/commit/5afa22ea1d2de00cb9c4708c55ec8fe1ef5a39b5))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Tests
|
|
18
|
+
|
|
19
|
+
* **message:** add new test cases covering message status ([9eec7e9](https://github.com/weyoss/redis-smq/commit/9eec7e9e2a39244ab62b9f8db4d049d3363a534d))
|
|
20
|
+
|
|
3
21
|
## [8.0.0-rc.2](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.1...v8.0.0-rc.2) (2023-11-27)
|
|
4
22
|
|
|
5
23
|
|
package/dist/index.cjs
CHANGED
|
@@ -3745,11 +3745,13 @@ var PublishScheduledWorker = class extends import_redis_smq_common33.Worker {
|
|
|
3745
3745
|
(msg, _, done) => {
|
|
3746
3746
|
var _a;
|
|
3747
3747
|
const ts = Date.now();
|
|
3748
|
-
const
|
|
3749
|
-
const
|
|
3750
|
-
const
|
|
3751
|
-
|
|
3752
|
-
|
|
3748
|
+
const messagePriority = (_a = msg.getPriority()) != null ? _a : "";
|
|
3749
|
+
const queue = msg.getDestinationQueue();
|
|
3750
|
+
const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
|
|
3751
|
+
msg.getRequiredId()
|
|
3752
|
+
);
|
|
3753
|
+
const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
|
|
3754
|
+
const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
|
|
3753
3755
|
const {
|
|
3754
3756
|
keyQueueProperties,
|
|
3755
3757
|
keyQueuePending,
|
|
@@ -3757,26 +3759,31 @@ var PublishScheduledWorker = class extends import_redis_smq_common33.Worker {
|
|
|
3757
3759
|
keyQueueScheduled,
|
|
3758
3760
|
keyQueueMessages
|
|
3759
3761
|
} = redisKeys.getQueueKeys(queue);
|
|
3760
|
-
|
|
3761
|
-
|
|
3762
|
-
|
|
3763
|
-
|
|
3764
|
-
const
|
|
3765
|
-
|
|
3762
|
+
let newMessage = null;
|
|
3763
|
+
let newMessageState = null;
|
|
3764
|
+
let newMessageId = "";
|
|
3765
|
+
let newKeyMessage = "";
|
|
3766
|
+
const hasBeenUnacknowledged = msg.getRetryDelay() > 0 && msg.getRequiredMessageState().getAttempts() > 0;
|
|
3767
|
+
if (!hasBeenUnacknowledged) {
|
|
3768
|
+
newMessage = _fromMessage(msg, null, null);
|
|
3769
|
+
newMessageState = newMessage.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
|
|
3770
|
+
newMessageId = newMessageState.getId();
|
|
3771
|
+
newKeyMessage = redisKeys.getMessageKeys(newMessageId).keyMessage;
|
|
3772
|
+
}
|
|
3766
3773
|
keys.push(
|
|
3767
|
-
|
|
3774
|
+
newKeyMessage,
|
|
3768
3775
|
keyQueuePending,
|
|
3769
3776
|
keyQueueProperties,
|
|
3777
|
+
keyQueueMessages,
|
|
3770
3778
|
keyPriorityQueuePending,
|
|
3771
3779
|
keyQueueScheduled,
|
|
3772
3780
|
keyScheduledMessage
|
|
3773
3781
|
);
|
|
3774
3782
|
argv.push(
|
|
3775
|
-
|
|
3783
|
+
newMessageId,
|
|
3784
|
+
newMessage ? JSON.stringify(newMessage) : "",
|
|
3785
|
+
newMessageState ? JSON.stringify(newMessageState) : "",
|
|
3776
3786
|
messagePriority,
|
|
3777
|
-
JSON.stringify(message),
|
|
3778
|
-
JSON.stringify(messageState),
|
|
3779
|
-
keyQueueMessages,
|
|
3780
3787
|
msg.getRequiredId(),
|
|
3781
3788
|
nextScheduleTimestamp,
|
|
3782
3789
|
JSON.stringify(scheduledMessageState)
|
package/dist/index.js
CHANGED
|
@@ -3735,11 +3735,13 @@ var PublishScheduledWorker = class extends Worker4 {
|
|
|
3735
3735
|
(msg, _, done) => {
|
|
3736
3736
|
var _a;
|
|
3737
3737
|
const ts = Date.now();
|
|
3738
|
-
const
|
|
3739
|
-
const
|
|
3740
|
-
const
|
|
3741
|
-
|
|
3742
|
-
|
|
3738
|
+
const messagePriority = (_a = msg.getPriority()) != null ? _a : "";
|
|
3739
|
+
const queue = msg.getDestinationQueue();
|
|
3740
|
+
const { keyMessage: keyScheduledMessage } = redisKeys.getMessageKeys(
|
|
3741
|
+
msg.getRequiredId()
|
|
3742
|
+
);
|
|
3743
|
+
const nextScheduleTimestamp = msg.getNextScheduledTimestamp();
|
|
3744
|
+
const scheduledMessageState = msg.getRequiredMessageState().setLastScheduledAt(ts);
|
|
3743
3745
|
const {
|
|
3744
3746
|
keyQueueProperties,
|
|
3745
3747
|
keyQueuePending,
|
|
@@ -3747,26 +3749,31 @@ var PublishScheduledWorker = class extends Worker4 {
|
|
|
3747
3749
|
keyQueueScheduled,
|
|
3748
3750
|
keyQueueMessages
|
|
3749
3751
|
} = redisKeys.getQueueKeys(queue);
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
const
|
|
3755
|
-
|
|
3752
|
+
let newMessage = null;
|
|
3753
|
+
let newMessageState = null;
|
|
3754
|
+
let newMessageId = "";
|
|
3755
|
+
let newKeyMessage = "";
|
|
3756
|
+
const hasBeenUnacknowledged = msg.getRetryDelay() > 0 && msg.getRequiredMessageState().getAttempts() > 0;
|
|
3757
|
+
if (!hasBeenUnacknowledged) {
|
|
3758
|
+
newMessage = _fromMessage(msg, null, null);
|
|
3759
|
+
newMessageState = newMessage.resetScheduledParams().getSetMessageState().setPublishedAt(ts).setScheduledMessageId(msg.getRequiredId());
|
|
3760
|
+
newMessageId = newMessageState.getId();
|
|
3761
|
+
newKeyMessage = redisKeys.getMessageKeys(newMessageId).keyMessage;
|
|
3762
|
+
}
|
|
3756
3763
|
keys.push(
|
|
3757
|
-
|
|
3764
|
+
newKeyMessage,
|
|
3758
3765
|
keyQueuePending,
|
|
3759
3766
|
keyQueueProperties,
|
|
3767
|
+
keyQueueMessages,
|
|
3760
3768
|
keyPriorityQueuePending,
|
|
3761
3769
|
keyQueueScheduled,
|
|
3762
3770
|
keyScheduledMessage
|
|
3763
3771
|
);
|
|
3764
3772
|
argv.push(
|
|
3765
|
-
|
|
3773
|
+
newMessageId,
|
|
3774
|
+
newMessage ? JSON.stringify(newMessage) : "",
|
|
3775
|
+
newMessageState ? JSON.stringify(newMessageState) : "",
|
|
3766
3776
|
messagePriority,
|
|
3767
|
-
JSON.stringify(message),
|
|
3768
|
-
JSON.stringify(messageState),
|
|
3769
|
-
keyQueueMessages,
|
|
3770
3777
|
msg.getRequiredId(),
|
|
3771
3778
|
nextScheduleTimestamp,
|
|
3772
3779
|
JSON.stringify(scheduledMessageState)
|
|
@@ -16,16 +16,16 @@ local EMessagePropertyMessage = ARGV[9]
|
|
|
16
16
|
|
|
17
17
|
local keyMessage = ''
|
|
18
18
|
local keyQueuePending = ''
|
|
19
|
+
local keyQueueMessages = ''
|
|
19
20
|
local keyQueueProperties = ''
|
|
20
21
|
local keyPriorityQueuePending = ''
|
|
21
22
|
local keyQueueScheduled = ''
|
|
22
23
|
local keyScheduledMessage = ''
|
|
23
24
|
|
|
24
25
|
local messageId = ''
|
|
25
|
-
local messagePriority = ''
|
|
26
26
|
local message = ''
|
|
27
27
|
local messageState = ''
|
|
28
|
-
local
|
|
28
|
+
local messagePriority = ''
|
|
29
29
|
local scheduledMessageId = ''
|
|
30
30
|
local scheduledMessageNextScheduleTimestamp = ''
|
|
31
31
|
local scheduledMessageState = ''
|
|
@@ -37,14 +37,7 @@ local argvIndexOffset = 9
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
local function
|
|
41
|
-
if queueType == EQueuePropertyQueueTypeLIFOQueue then
|
|
42
|
-
redis.call("RPUSH", keyQueuePending, messageId)
|
|
43
|
-
elseif queueType == EQueuePropertyQueueTypeFIFOQueue then
|
|
44
|
-
redis.call("LPUSH", keyQueuePending, messageId)
|
|
45
|
-
else
|
|
46
|
-
redis.call("ZADD", keyPriorityQueuePending, messagePriority, messageId)
|
|
47
|
-
end
|
|
40
|
+
local function addToQueueMessages()
|
|
48
41
|
redis.call("SADD", keyQueueMessages, messageId)
|
|
49
42
|
redis.call(
|
|
50
43
|
"HMSET", keyMessage,
|
|
@@ -55,62 +48,96 @@ local function publishMessage(queueType)
|
|
|
55
48
|
redis.call("HINCRBY", keyQueueProperties, EQueuePropertyMessagesCount, 1)
|
|
56
49
|
end
|
|
57
50
|
|
|
58
|
-
local function
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
local function publishMessage(queueType, msgId)
|
|
52
|
+
if queueType == EQueuePropertyQueueTypeLIFOQueue then
|
|
53
|
+
redis.call("RPUSH", keyQueuePending, msgId)
|
|
54
|
+
elseif queueType == EQueuePropertyQueueTypeFIFOQueue then
|
|
55
|
+
redis.call("LPUSH", keyQueuePending, msgId)
|
|
56
|
+
else
|
|
57
|
+
redis.call("ZADD", keyPriorityQueuePending, messagePriority, msgId)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
local function deletedScheduledMessage(updateMessageCount)
|
|
61
62
|
redis.call("DEL", keyScheduledMessage)
|
|
62
|
-
if
|
|
63
|
+
if updateMessageCount == true then
|
|
63
64
|
redis.call("HINCRBY", keyQueueProperties, EQueuePropertyMessagesCount, -1)
|
|
64
65
|
end
|
|
65
66
|
end
|
|
66
67
|
|
|
67
|
-
local function
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
local function removeFromScheduled()
|
|
69
|
+
redis.call("ZREM", keyScheduledMessages, scheduledMessageId)
|
|
70
|
+
redis.call("ZREM", keyQueueScheduled, scheduledMessageId)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
local function updateScheduledMessageProperties(status )
|
|
74
|
+
if status == '' then
|
|
73
75
|
redis.call("HSET", keyScheduledMessage, EMessagePropertyState, scheduledMessageState)
|
|
76
|
+
else
|
|
77
|
+
redis.call(
|
|
78
|
+
"HMSET", keyScheduledMessage,
|
|
79
|
+
EMessagePropertyState, scheduledMessageState,
|
|
80
|
+
EMessagePropertyStatus, status
|
|
81
|
+
)
|
|
74
82
|
end
|
|
75
83
|
end
|
|
76
84
|
|
|
85
|
+
local function scheduleMessage()
|
|
86
|
+
redis.call("ZADD", keyScheduledMessages, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
|
|
87
|
+
redis.call("ZADD", keyQueueScheduled, scheduledMessageNextScheduleTimestamp, scheduledMessageId)
|
|
88
|
+
end
|
|
89
|
+
|
|
77
90
|
local function handleMessage()
|
|
78
91
|
local properties = redis.call("HMGET", keyQueueProperties, EQueuePropertyQueueType)
|
|
79
92
|
local queueType = properties[1]
|
|
80
|
-
if (queueType == false)
|
|
81
|
-
|
|
93
|
+
if (queueType == false) then
|
|
94
|
+
removeFromScheduled()
|
|
95
|
+
deletedScheduledMessage(false)
|
|
96
|
+
elseif (queueType ~= EQueuePropertyQueueTypeLIFOQueue and queueType ~= EQueuePropertyQueueTypeFIFOQueue and queueType ~= EQueuePropertyQueueTypePriorityQueue) then
|
|
97
|
+
removeFromScheduled()
|
|
98
|
+
deletedScheduledMessage(true)
|
|
99
|
+
elseif messageId == '' then
|
|
100
|
+
publishMessage(queueType, scheduledMessageId)
|
|
101
|
+
removeFromScheduled()
|
|
102
|
+
updateScheduledMessageProperties(EMessagePropertyStatusPending)
|
|
82
103
|
else
|
|
83
|
-
publishMessage(queueType)
|
|
84
|
-
|
|
104
|
+
publishMessage(queueType, messageId)
|
|
105
|
+
addToQueueMessages();
|
|
106
|
+
if scheduledMessageNextScheduleTimestamp == "0" then
|
|
107
|
+
removeFromScheduled()
|
|
108
|
+
deletedScheduledMessage(true)
|
|
109
|
+
else
|
|
110
|
+
scheduleMessage()
|
|
111
|
+
updateScheduledMessageProperties('')
|
|
112
|
+
end
|
|
85
113
|
end
|
|
86
114
|
end
|
|
87
115
|
|
|
88
116
|
if #ARGV > argvIndexOffset then
|
|
89
117
|
for index in pairs(ARGV) do
|
|
90
118
|
if (index > argvIndexOffset) then
|
|
91
|
-
local idx = index %
|
|
92
|
-
if idx ==
|
|
119
|
+
local idx = index % 7
|
|
120
|
+
if idx == 3 then
|
|
93
121
|
messageId = ARGV[index]
|
|
94
122
|
keyMessage = KEYS[keyIndexOffset + 1]
|
|
95
123
|
keyQueuePending = KEYS[keyIndexOffset + 2]
|
|
96
124
|
keyQueueProperties = KEYS[keyIndexOffset + 3]
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
messagePriority = ARGV[index]
|
|
125
|
+
keyQueueMessages = KEYS[keyIndexOffset + 4]
|
|
126
|
+
keyPriorityQueuePending = KEYS[keyIndexOffset + 5]
|
|
127
|
+
keyQueueScheduled = KEYS[keyIndexOffset + 6]
|
|
128
|
+
keyScheduledMessage = KEYS[keyIndexOffset + 7]
|
|
129
|
+
keyIndexOffset = keyIndexOffset + 7
|
|
103
130
|
elseif idx == 4 then
|
|
104
131
|
message = ARGV[index]
|
|
105
132
|
elseif idx == 5 then
|
|
106
133
|
messageState = ARGV[index]
|
|
107
134
|
elseif idx == 6 then
|
|
108
|
-
|
|
109
|
-
elseif idx == 7 then
|
|
110
|
-
scheduledMessageId = ARGV[index]
|
|
135
|
+
messagePriority = ARGV[index]
|
|
111
136
|
elseif idx == 0 then
|
|
112
|
-
|
|
137
|
+
scheduledMessageId = ARGV[index]
|
|
113
138
|
elseif idx == 1 then
|
|
139
|
+
scheduledMessageNextScheduleTimestamp = ARGV[index]
|
|
140
|
+
elseif idx == 2 then
|
|
114
141
|
scheduledMessageState = ARGV[index]
|
|
115
142
|
handleMessage()
|
|
116
143
|
end
|