pgbus 0.3.3 → 0.3.5
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.
- checksums.yaml +4 -4
- data/Rakefile +15 -0
- data/app/controllers/pgbus/dead_letter_controller.rb +17 -0
- data/app/controllers/pgbus/jobs_controller.rb +36 -0
- data/app/controllers/pgbus/locks_controller.rb +25 -0
- data/app/controllers/pgbus/recurring_tasks_controller.rb +5 -3
- data/app/frontend/pgbus/application.js +58 -1
- data/app/models/pgbus/job_lock.rb +16 -8
- data/app/models/pgbus/uniqueness_key.rb +36 -0
- data/app/views/pgbus/dead_letter/_messages_table.html.erb +22 -2
- data/app/views/pgbus/dead_letter/index.html.erb +9 -1
- data/app/views/pgbus/jobs/_enqueued_table.html.erb +36 -6
- data/app/views/pgbus/jobs/_failed_table.html.erb +35 -4
- data/app/views/pgbus/locks/index.html.erb +53 -28
- data/app/views/pgbus/queues/show.html.erb +58 -21
- data/app/views/pgbus/recurring_tasks/_tasks_table.html.erb +2 -1
- data/config/locales/da.yml +21 -9
- data/config/locales/de.yml +21 -9
- data/config/locales/en.yml +51 -9
- data/config/locales/es.yml +21 -9
- data/config/locales/fi.yml +21 -9
- data/config/locales/fr.yml +21 -9
- data/config/locales/it.yml +21 -9
- data/config/locales/ja.yml +21 -9
- data/config/locales/nb.yml +21 -9
- data/config/locales/nl.yml +21 -9
- data/config/locales/pt.yml +21 -9
- data/config/locales/sv.yml +21 -9
- data/config/routes.rb +12 -1
- data/lib/generators/pgbus/migrate_job_locks_generator.rb +56 -0
- data/lib/generators/pgbus/templates/add_uniqueness_keys.rb.erb +13 -0
- data/lib/generators/pgbus/templates/migrate_job_locks_to_uniqueness_keys.rb.erb +33 -0
- data/lib/pgbus/active_job/executor.rb +34 -20
- data/lib/pgbus/client.rb +18 -2
- data/lib/pgbus/process/dispatcher.rb +33 -10
- data/lib/pgbus/process/worker.rb +4 -1
- data/lib/pgbus/recurring/schedule.rb +38 -35
- data/lib/pgbus/stat_buffer.rb +107 -0
- data/lib/pgbus/uniqueness.rb +24 -39
- data/lib/pgbus/version.rb +1 -1
- data/lib/pgbus/web/data_source.rb +49 -18
- metadata +6 -1
|
@@ -38,41 +38,78 @@
|
|
|
38
38
|
|
|
39
39
|
<!-- Messages in Queue -->
|
|
40
40
|
<div class="overflow-hidden rounded-lg bg-white dark:bg-gray-800 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
41
|
-
<table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
41
|
+
<table class="pgbus-table min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
42
42
|
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
43
43
|
<tr>
|
|
44
44
|
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.id") %></th>
|
|
45
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.job_class") %></th>
|
|
45
46
|
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.enqueued") %></th>
|
|
46
47
|
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.reads") %></th>
|
|
47
48
|
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.vt") %></th>
|
|
48
|
-
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.payload") %></th>
|
|
49
|
-
<th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-500"><%= t("pgbus.queues.show.headers.actions") %></th>
|
|
50
49
|
</tr>
|
|
51
50
|
</thead>
|
|
52
51
|
<tbody class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
53
52
|
<% @messages.each do |m| %>
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<td class="
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
53
|
+
<% payload = pgbus_parse_message(m[:message]) %>
|
|
54
|
+
<tr>
|
|
55
|
+
<td colspan="5" class="p-0">
|
|
56
|
+
<details class="group">
|
|
57
|
+
<summary class="flex cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700/50 dark:bg-gray-900 list-none">
|
|
58
|
+
<span class="w-16 shrink-0 px-4 py-3 text-sm font-mono text-gray-900 dark:text-white"><%= m[:msg_id] %></span>
|
|
59
|
+
<span class="flex-1 px-4 py-3 text-sm font-medium text-gray-900 dark:text-white"><%= payload["job_class"] || "—" %></span>
|
|
60
|
+
<span class="w-28 shrink-0 px-4 py-3 text-sm text-gray-500"><%= pgbus_time_ago(m[:enqueued_at]) %></span>
|
|
61
|
+
<span class="w-16 shrink-0 px-4 py-3 text-sm text-gray-500"><%= m[:read_ct] %></span>
|
|
62
|
+
<span class="w-28 shrink-0 px-4 py-3 text-sm text-gray-500"><%= pgbus_time_ago(m[:vt]) %></span>
|
|
63
|
+
</summary>
|
|
64
|
+
<div class="px-4 pb-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-100">
|
|
65
|
+
<div class="flex items-center mt-3 mb-3">
|
|
66
|
+
<span class="text-xs font-mono text-gray-400"><%= t("pgbus.queues.show.job_id") %> <%= payload["job_id"] %></span>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="grid grid-cols-2 gap-4 mb-3">
|
|
69
|
+
<div>
|
|
70
|
+
<span class="text-xs font-medium text-gray-500"><%= t("pgbus.queues.show.arguments") %></span>
|
|
71
|
+
<pre class="text-xs text-gray-700 bg-white dark:bg-gray-800 rounded p-2 mt-1 overflow-x-auto max-h-40"><%= JSON.pretty_generate(payload["arguments"] || []) rescue "—" %></pre>
|
|
72
|
+
</div>
|
|
73
|
+
<div>
|
|
74
|
+
<span class="text-xs font-medium text-gray-500"><%= t("pgbus.queues.show.metadata") %></span>
|
|
75
|
+
<div class="text-xs text-gray-600 bg-white dark:bg-gray-800 rounded p-2 mt-1 space-y-1">
|
|
76
|
+
<% if payload["queue_name"] %><p><strong><%= t("pgbus.queues.show.metadata_labels.queue") %></strong> <%= payload["queue_name"] %></p><% end %>
|
|
77
|
+
<% if payload["priority"] %><p><strong><%= t("pgbus.queues.show.metadata_labels.priority") %></strong> <%= payload["priority"] %></p><% end %>
|
|
78
|
+
<% if payload["locale"] %><p><strong><%= t("pgbus.queues.show.metadata_labels.locale") %></strong> <%= payload["locale"] %></p><% end %>
|
|
79
|
+
<% if payload["timezone"] %><p><strong><%= t("pgbus.queues.show.metadata_labels.timezone") %></strong> <%= payload["timezone"] %></p><% end %>
|
|
80
|
+
<% if payload["scheduled_at"] %><p><strong><%= t("pgbus.queues.show.metadata_labels.scheduled") %></strong> <%= payload["scheduled_at"] %></p><% end %>
|
|
81
|
+
<% if m[:vt] %><p><strong><%= t("pgbus.queues.show.metadata_labels.visible_at") %></strong> <%= m[:vt] %></p><% end %>
|
|
82
|
+
<% if m[:last_read_at] %><p><strong><%= t("pgbus.queues.show.metadata_labels.last_read") %></strong> <%= m[:last_read_at] %></p><% end %>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<details class="mt-2">
|
|
87
|
+
<summary class="text-xs font-medium text-gray-500 cursor-pointer hover:text-gray-700"><%= t("pgbus.queues.show.full_json_payload") %></summary>
|
|
88
|
+
<pre class="text-xs text-gray-600 bg-white dark:bg-gray-800 rounded p-2 mt-1 overflow-x-auto max-h-96"><%= JSON.pretty_generate(payload) rescue m[:message] %></pre>
|
|
89
|
+
</details>
|
|
90
|
+
<% if m[:headers] %>
|
|
91
|
+
<details class="mt-2">
|
|
92
|
+
<summary class="text-xs font-medium text-gray-500 cursor-pointer hover:text-gray-700"><%= t("pgbus.queues.show.headers_section") %></summary>
|
|
93
|
+
<pre class="text-xs text-gray-600 bg-white dark:bg-gray-800 rounded p-2 mt-1 overflow-x-auto"><%= JSON.pretty_generate(JSON.parse(m[:headers])) rescue m[:headers] %></pre>
|
|
94
|
+
</details>
|
|
95
|
+
<% end %>
|
|
96
|
+
<div class="flex space-x-2 mt-3 pt-3 border-t border-gray-200 dark:border-gray-700">
|
|
97
|
+
<%= button_to t("pgbus.queues.show.retry"), pgbus.retry_message_queue_path(name: params[:name], msg_id: m[:msg_id]),
|
|
98
|
+
method: :post,
|
|
99
|
+
class: "rounded-md bg-indigo-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-indigo-500",
|
|
100
|
+
data: { turbo_confirm: t("pgbus.queues.show.retry_confirm") } %>
|
|
101
|
+
<%= button_to t("pgbus.queues.show.discard"), pgbus.discard_message_queue_path(name: params[:name], msg_id: m[:msg_id]),
|
|
102
|
+
method: :post,
|
|
103
|
+
class: "rounded-md bg-red-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-red-500",
|
|
104
|
+
data: { turbo_confirm: t("pgbus.queues.show.discard_confirm") } %>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</details>
|
|
71
108
|
</td>
|
|
72
109
|
</tr>
|
|
73
110
|
<% end %>
|
|
74
111
|
<% if @messages.empty? %>
|
|
75
|
-
<tr><td colspan="
|
|
112
|
+
<tr><td colspan="5" class="px-4 py-8 text-center text-sm text-gray-400"><%= t("pgbus.queues.show.empty") %></td></tr>
|
|
76
113
|
<% end %>
|
|
77
114
|
</tbody>
|
|
78
115
|
</table>
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
<td data-label="Task" class="px-4 py-3">
|
|
25
25
|
<div>
|
|
26
26
|
<%= link_to task[:key], pgbus.recurring_task_path(task[:id]),
|
|
27
|
-
class: "text-sm font-medium text-blue-600 hover:text-blue-800"
|
|
27
|
+
class: "text-sm font-medium text-blue-600 hover:text-blue-800",
|
|
28
|
+
data: { turbo_frame: "_top" } %>
|
|
28
29
|
</div>
|
|
29
30
|
<div class="text-xs text-gray-500"><%= task[:class_name] || task[:command]&.truncate(40) %></div>
|
|
30
31
|
<% if task[:description] %>
|
data/config/locales/da.yml
CHANGED
|
@@ -239,16 +239,12 @@ da:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Aktive unikke låse forhindrer duplikeret jobudførelse
|
|
241
241
|
empty: Ingen aktive låse
|
|
242
|
-
executing: Udfører
|
|
243
242
|
headers:
|
|
244
243
|
age: Alder
|
|
245
|
-
expires: Udløber
|
|
246
|
-
job_class: Jobklasse
|
|
247
244
|
lock_key: Låsenøgle
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Joblåse
|
|
245
|
+
msg_id: Besked-ID
|
|
246
|
+
queue_name: Kø
|
|
247
|
+
title: Unikhedsnøgler
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Transaktionelle udbakke-poster, der venter på publicering til PGMQ
|
|
@@ -305,23 +301,35 @@ da:
|
|
|
305
301
|
purge_confirm: Rens alle beskeder fra %{name}?
|
|
306
302
|
resume: Genoptag
|
|
307
303
|
show:
|
|
304
|
+
arguments: Argumenter
|
|
308
305
|
delete_confirm: Slet denne kø permanent? Dette kan ikke fortrydes.
|
|
309
306
|
delete_queue: Slet kø
|
|
310
307
|
depth: 'Dybde:'
|
|
311
308
|
discard: Kassér
|
|
312
309
|
discard_confirm: Kassér denne besked?
|
|
313
310
|
empty: Køen er tom
|
|
311
|
+
full_json_payload: Fuld JSON-payload
|
|
314
312
|
headers:
|
|
315
|
-
actions: Handlinger
|
|
316
313
|
enqueued: Sat i kø
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Jobklasse
|
|
319
316
|
reads: Læsninger
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: Headers
|
|
319
|
+
job_id: 'Job ID:'
|
|
321
320
|
message_discard_failed: Kunne ikke kassere besked.
|
|
322
321
|
message_discarded: Besked kasseret.
|
|
323
322
|
message_retried: Beskedens synlighed nulstillet.
|
|
324
323
|
message_retry_failed: Kunne ikke prøve besked igen.
|
|
324
|
+
metadata: Metadata
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Sidst læst:'
|
|
327
|
+
locale: 'Locale:'
|
|
328
|
+
priority: 'Prioritet:'
|
|
329
|
+
queue: 'Kø:'
|
|
330
|
+
scheduled: 'Planlagt:'
|
|
331
|
+
timezone: 'Tidszone:'
|
|
332
|
+
visible_at: 'Synlig fra:'
|
|
325
333
|
pause: Pause
|
|
326
334
|
pause_confirm: Pause behandling?
|
|
327
335
|
purge_confirm: Rens alle beskeder?
|
|
@@ -337,6 +345,10 @@ da:
|
|
|
337
345
|
one: "%{count} opgave konfigureret"
|
|
338
346
|
other: "%{count} opgaver konfigureret"
|
|
339
347
|
title: Gentagne opgaver
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Opgave deaktiveret
|
|
350
|
+
enabled: Opgave aktiveret
|
|
351
|
+
failed: Kunne ikke ændre opgave
|
|
340
352
|
show:
|
|
341
353
|
back: Tilbage
|
|
342
354
|
configuration: Konfiguration
|
data/config/locales/de.yml
CHANGED
|
@@ -239,16 +239,12 @@ de:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Aktive Einzigartigkeitssperren verhindern doppelte Auftragserstellung
|
|
241
241
|
empty: Keine aktiven Sperren
|
|
242
|
-
executing: Ausführen
|
|
243
242
|
headers:
|
|
244
243
|
age: Alter
|
|
245
|
-
expires: Läuft ab
|
|
246
|
-
job_class: Auftragsklasse
|
|
247
244
|
lock_key: Sperrschlüssel
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Auftragssperren
|
|
245
|
+
msg_id: Nachrichten-ID
|
|
246
|
+
queue_name: Warteschlange
|
|
247
|
+
title: Eindeutigkeitsschlüssel
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Transaktionale Postausgangseinträge ausstehend zur Veröffentlichung an PGMQ
|
|
@@ -305,23 +301,35 @@ de:
|
|
|
305
301
|
purge_confirm: Alle Nachrichten von %{name} löschen?
|
|
306
302
|
resume: Fortsetzen
|
|
307
303
|
show:
|
|
304
|
+
arguments: Argumente
|
|
308
305
|
delete_confirm: Diese Warteschlange dauerhaft löschen? Dies kann nicht rückgängig gemacht werden.
|
|
309
306
|
delete_queue: Warteschlange löschen
|
|
310
307
|
depth: 'Tiefe:'
|
|
311
308
|
discard: Verwerfen
|
|
312
309
|
discard_confirm: Diese Nachricht verwerfen?
|
|
313
310
|
empty: Warteschlange ist leer
|
|
311
|
+
full_json_payload: Vollständige JSON-Nutzlast
|
|
314
312
|
headers:
|
|
315
|
-
actions: Aktionen
|
|
316
313
|
enqueued: Eingereiht
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Job-Klasse
|
|
319
316
|
reads: Lesevorgänge
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: Header
|
|
319
|
+
job_id: 'Job-ID:'
|
|
321
320
|
message_discard_failed: Nachricht konnte nicht verworfen werden.
|
|
322
321
|
message_discarded: Nachricht verworfen.
|
|
323
322
|
message_retried: Sichtbarkeit der Nachricht zurückgesetzt.
|
|
324
323
|
message_retry_failed: Nachricht konnte nicht wiederholt werden.
|
|
324
|
+
metadata: Metadaten
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Letzter Lesevorgang:'
|
|
327
|
+
locale: 'Sprache:'
|
|
328
|
+
priority: 'Priorität:'
|
|
329
|
+
queue: 'Warteschlange:'
|
|
330
|
+
scheduled: 'Geplant:'
|
|
331
|
+
timezone: 'Zeitzone:'
|
|
332
|
+
visible_at: 'Sichtbar ab:'
|
|
325
333
|
pause: Pause
|
|
326
334
|
pause_confirm: Verarbeitung pausieren?
|
|
327
335
|
purge_confirm: Alle Nachrichten löschen?
|
|
@@ -337,6 +345,10 @@ de:
|
|
|
337
345
|
one: "%{count} Aufgabe konfiguriert"
|
|
338
346
|
other: "%{count} Aufgaben konfiguriert"
|
|
339
347
|
title: Wiederkehrende Aufgaben
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Aufgabe deaktiviert
|
|
350
|
+
enabled: Aufgabe aktiviert
|
|
351
|
+
failed: Aufgabe konnte nicht umgeschaltet werden
|
|
340
352
|
show:
|
|
341
353
|
back: Zurück
|
|
342
354
|
configuration: Konfiguration
|
data/config/locales/en.yml
CHANGED
|
@@ -44,6 +44,12 @@ en:
|
|
|
44
44
|
index:
|
|
45
45
|
discard_all: Discard All
|
|
46
46
|
discard_all_confirm: Permanently discard all DLQ messages?
|
|
47
|
+
discard_selected: Discard Selected
|
|
48
|
+
discard_selected_confirm: Discard selected DLQ messages?
|
|
49
|
+
discarded_selected:
|
|
50
|
+
one: Discarded 1 DLQ message.
|
|
51
|
+
other: Discarded %{count} DLQ messages.
|
|
52
|
+
none_selected: No messages selected.
|
|
47
53
|
retry_all: Retry All
|
|
48
54
|
retry_all_confirm: Retry all DLQ messages?
|
|
49
55
|
title: Dead Letter Queue
|
|
@@ -114,6 +120,9 @@ en:
|
|
|
114
120
|
not_found: Event not found
|
|
115
121
|
title: Event %{event_id}
|
|
116
122
|
helpers:
|
|
123
|
+
bulk_select_all: Select all
|
|
124
|
+
bulk_select_row: Select %{id}
|
|
125
|
+
bulk_selected: selected
|
|
117
126
|
paused_badge: Paused
|
|
118
127
|
queue_badge:
|
|
119
128
|
dlq: DLQ
|
|
@@ -216,6 +225,12 @@ en:
|
|
|
216
225
|
discard_all: Discard All
|
|
217
226
|
discard_all_confirm: Discard all failed jobs?
|
|
218
227
|
discard_all_enqueued_notice: Discarded %{count} enqueued jobs and released their locks.
|
|
228
|
+
discard_selected: Discard Selected
|
|
229
|
+
discard_selected_confirm: Discard selected items?
|
|
230
|
+
discarded_selected:
|
|
231
|
+
one: Discarded 1 selected item.
|
|
232
|
+
other: Discarded %{count} selected items.
|
|
233
|
+
none_selected: No items selected.
|
|
219
234
|
retry_all: Retry All
|
|
220
235
|
retry_all_confirm: Retry all failed jobs?
|
|
221
236
|
title: Jobs
|
|
@@ -253,18 +268,29 @@ en:
|
|
|
253
268
|
toggle_menu: Toggle menu
|
|
254
269
|
locks:
|
|
255
270
|
index:
|
|
271
|
+
all_locks_discarded:
|
|
272
|
+
one: Discarded 1 lock.
|
|
273
|
+
other: Discarded %{count} locks.
|
|
256
274
|
description: Active uniqueness locks preventing duplicate job execution
|
|
275
|
+
discard: Discard
|
|
276
|
+
discard_all: Discard All
|
|
277
|
+
discard_all_confirm: Permanently discard all locks? This may allow duplicate job execution.
|
|
278
|
+
discard_confirm: Discard this lock? The associated job may be enqueued again.
|
|
279
|
+
discard_selected: Discard Selected
|
|
280
|
+
discard_selected_confirm: Discard selected locks?
|
|
257
281
|
empty: No active locks
|
|
258
|
-
executing: Executing
|
|
259
282
|
headers:
|
|
260
283
|
age: Age
|
|
261
|
-
expires: Expires
|
|
262
|
-
job_class: Job Class
|
|
263
284
|
lock_key: Lock Key
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
285
|
+
msg_id: Message ID
|
|
286
|
+
queue_name: Queue
|
|
287
|
+
lock_discard_failed: Could not discard lock.
|
|
288
|
+
lock_discarded: Lock discarded.
|
|
289
|
+
locks_discarded:
|
|
290
|
+
one: Discarded 1 lock.
|
|
291
|
+
other: Discarded %{count} locks.
|
|
292
|
+
none_selected: No locks selected.
|
|
293
|
+
title: Uniqueness Keys
|
|
268
294
|
outbox:
|
|
269
295
|
index:
|
|
270
296
|
description: Transactional outbox entries pending publication to PGMQ
|
|
@@ -321,23 +347,35 @@ en:
|
|
|
321
347
|
purge_confirm: Purge all messages from %{name}?
|
|
322
348
|
resume: Resume
|
|
323
349
|
show:
|
|
350
|
+
arguments: Arguments
|
|
324
351
|
delete_confirm: Permanently delete this queue? This cannot be undone.
|
|
325
352
|
delete_queue: Delete Queue
|
|
326
353
|
depth: 'Depth:'
|
|
327
354
|
discard: Discard
|
|
328
355
|
discard_confirm: Discard this message?
|
|
329
356
|
empty: Queue is empty
|
|
357
|
+
full_json_payload: Full JSON payload
|
|
330
358
|
headers:
|
|
331
|
-
actions: Actions
|
|
332
359
|
enqueued: Enqueued
|
|
333
360
|
id: ID
|
|
334
|
-
|
|
361
|
+
job_class: Job Class
|
|
335
362
|
reads: Reads
|
|
336
363
|
vt: VT
|
|
364
|
+
headers_section: Headers
|
|
365
|
+
job_id: 'Job ID:'
|
|
337
366
|
message_discard_failed: Could not discard message.
|
|
338
367
|
message_discarded: Message discarded.
|
|
339
368
|
message_retried: Message visibility reset.
|
|
340
369
|
message_retry_failed: Could not retry message.
|
|
370
|
+
metadata: Metadata
|
|
371
|
+
metadata_labels:
|
|
372
|
+
last_read: 'Last read:'
|
|
373
|
+
locale: 'Locale:'
|
|
374
|
+
priority: 'Priority:'
|
|
375
|
+
queue: 'Queue:'
|
|
376
|
+
scheduled: 'Scheduled at:'
|
|
377
|
+
timezone: 'Timezone:'
|
|
378
|
+
visible_at: 'Visible at:'
|
|
341
379
|
pause: Pause
|
|
342
380
|
pause_confirm: Pause processing?
|
|
343
381
|
purge_confirm: Purge all messages?
|
|
@@ -353,6 +391,10 @@ en:
|
|
|
353
391
|
one: "%{count} task configured"
|
|
354
392
|
other: "%{count} tasks configured"
|
|
355
393
|
title: Recurring Tasks
|
|
394
|
+
toggle:
|
|
395
|
+
disabled: Task disabled
|
|
396
|
+
enabled: Task enabled
|
|
397
|
+
failed: Failed to toggle task
|
|
356
398
|
show:
|
|
357
399
|
back: Back
|
|
358
400
|
configuration: Configuration
|
data/config/locales/es.yml
CHANGED
|
@@ -239,16 +239,12 @@ es:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Bloqueos de unicidad activos que impiden la ejecución duplicada del trabajo
|
|
241
241
|
empty: No hay bloqueos activos
|
|
242
|
-
executing: Ejecutando
|
|
243
242
|
headers:
|
|
244
243
|
age: Antigüedad
|
|
245
|
-
expires: Expira
|
|
246
|
-
job_class: Clase de trabajo
|
|
247
244
|
lock_key: Clave de bloqueo
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Bloqueos de trabajo
|
|
245
|
+
msg_id: ID de mensaje
|
|
246
|
+
queue_name: Cola
|
|
247
|
+
title: Claves de unicidad
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Entradas de bandeja de salida transaccional pendientes de publicación en PGMQ
|
|
@@ -305,23 +301,35 @@ es:
|
|
|
305
301
|
purge_confirm: "¿Purgar todos los mensajes de %{name}?"
|
|
306
302
|
resume: Reanudar
|
|
307
303
|
show:
|
|
304
|
+
arguments: Argumentos
|
|
308
305
|
delete_confirm: "¿Eliminar permanentemente esta cola? Esto no se puede deshacer."
|
|
309
306
|
delete_queue: Eliminar cola
|
|
310
307
|
depth: 'Profundidad:'
|
|
311
308
|
discard: Descartar
|
|
312
309
|
discard_confirm: "¿Descartar este mensaje?"
|
|
313
310
|
empty: La cola está vacía
|
|
311
|
+
full_json_payload: Carga JSON completa
|
|
314
312
|
headers:
|
|
315
|
-
actions: Acciones
|
|
316
313
|
enqueued: Encolado
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Clase de Trabajo
|
|
319
316
|
reads: Lecturas
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: Encabezados
|
|
319
|
+
job_id: 'ID del Trabajo:'
|
|
321
320
|
message_discard_failed: No se pudo descartar el mensaje.
|
|
322
321
|
message_discarded: Mensaje descartado.
|
|
323
322
|
message_retried: Visibilidad del mensaje restablecida.
|
|
324
323
|
message_retry_failed: No se pudo reintentar el mensaje.
|
|
324
|
+
metadata: Metadatos
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Última lectura:'
|
|
327
|
+
locale: 'Configuración regional:'
|
|
328
|
+
priority: 'Prioridad:'
|
|
329
|
+
queue: 'Cola:'
|
|
330
|
+
scheduled: 'Programado:'
|
|
331
|
+
timezone: 'Zona horaria:'
|
|
332
|
+
visible_at: 'Visible en:'
|
|
325
333
|
pause: Pausar
|
|
326
334
|
pause_confirm: "¿Pausar el procesamiento?"
|
|
327
335
|
purge_confirm: "¿Purgar todos los mensajes?"
|
|
@@ -337,6 +345,10 @@ es:
|
|
|
337
345
|
one: Tarea %{count} configurada
|
|
338
346
|
other: Tareas %{count} configuradas
|
|
339
347
|
title: Tareas recurrentes
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Tarea deshabilitada
|
|
350
|
+
enabled: Tarea habilitada
|
|
351
|
+
failed: No se pudo cambiar la tarea
|
|
340
352
|
show:
|
|
341
353
|
back: Atrás
|
|
342
354
|
configuration: Configuración
|
data/config/locales/fi.yml
CHANGED
|
@@ -239,16 +239,12 @@ fi:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Aktiiviset ainutlaatuisuuden lukot estävät päällekkäisen työn suorittamisen
|
|
241
241
|
empty: Ei aktiivisia lukkoja
|
|
242
|
-
executing: Suoritetaan
|
|
243
242
|
headers:
|
|
244
243
|
age: Ikä
|
|
245
|
-
expires: Vanhenee
|
|
246
|
-
job_class: Työluokka
|
|
247
244
|
lock_key: Lukon avain
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Työn lukot
|
|
245
|
+
msg_id: Viestin tunnus
|
|
246
|
+
queue_name: Jono
|
|
247
|
+
title: Yksikäsitteisyysavaimet
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Transaktionaaliset lähetyslaatikon merkinnät odottavat julkaisua PGMQ:lle
|
|
@@ -305,23 +301,35 @@ fi:
|
|
|
305
301
|
purge_confirm: Tyhjennä kaikki viestit %{name}:sta?
|
|
306
302
|
resume: Jatka
|
|
307
303
|
show:
|
|
304
|
+
arguments: Argumentit
|
|
308
305
|
delete_confirm: Poista tämä jono pysyvästi? Tätä ei voi kumota.
|
|
309
306
|
delete_queue: Poista jono
|
|
310
307
|
depth: 'Syvyys:'
|
|
311
308
|
discard: Hylkää
|
|
312
309
|
discard_confirm: Hylätä tämä viesti?
|
|
313
310
|
empty: Jono on tyhjä
|
|
311
|
+
full_json_payload: Täysi JSON-payload
|
|
314
312
|
headers:
|
|
315
|
-
actions: Toiminnot
|
|
316
313
|
enqueued: Jonoon lisätty
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Työn luokka
|
|
319
316
|
reads: Lukukerrat
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: Otsikot
|
|
319
|
+
job_id: 'Työn ID:'
|
|
321
320
|
message_discard_failed: Viestiä ei voitu hylätä.
|
|
322
321
|
message_discarded: Viesti hylätty.
|
|
323
322
|
message_retried: Viestin näkyvyys nollattu.
|
|
324
323
|
message_retry_failed: Viestiä ei voitu yrittää uudelleen.
|
|
324
|
+
metadata: Metatiedot
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Viimeksi luettu:'
|
|
327
|
+
locale: 'Alue:'
|
|
328
|
+
priority: 'Prioriteetti:'
|
|
329
|
+
queue: 'Jono:'
|
|
330
|
+
scheduled: 'Aikataulutettu:'
|
|
331
|
+
timezone: 'Aikavyöhyke:'
|
|
332
|
+
visible_at: 'Näkyvissä:'
|
|
325
333
|
pause: Tauko
|
|
326
334
|
pause_confirm: Keskeytetäänkö käsittely?
|
|
327
335
|
purge_confirm: Tyhjennetäänkö kaikki viestit?
|
|
@@ -337,6 +345,10 @@ fi:
|
|
|
337
345
|
one: "%{count} tehtävä määritetty"
|
|
338
346
|
other: "%{count} tehtävää määritetty"
|
|
339
347
|
title: Toistuvat tehtävät
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Tehtävä poistettu käytöstä
|
|
350
|
+
enabled: Tehtävä otettu käyttöön
|
|
351
|
+
failed: Tehtävän vaihto epäonnistui
|
|
340
352
|
show:
|
|
341
353
|
back: Takaisin
|
|
342
354
|
configuration: Asetukset
|
data/config/locales/fr.yml
CHANGED
|
@@ -239,16 +239,12 @@ fr:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Verrous d'unicité actifs empêchant l'exécution de travaux en double
|
|
241
241
|
empty: Aucun verrou actif
|
|
242
|
-
executing: Exécution
|
|
243
242
|
headers:
|
|
244
243
|
age: Âge
|
|
245
|
-
expires: Expire
|
|
246
|
-
job_class: Classe de travail
|
|
247
244
|
lock_key: Clé de verrou
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Verrous de travail
|
|
245
|
+
msg_id: ID du message
|
|
246
|
+
queue_name: File
|
|
247
|
+
title: Clés d'unicité
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Entrées de boîte d'envoi transactionnelle en attente de publication vers PGMQ
|
|
@@ -305,23 +301,35 @@ fr:
|
|
|
305
301
|
purge_confirm: Purger tous les messages de %{name} ?
|
|
306
302
|
resume: Reprendre
|
|
307
303
|
show:
|
|
304
|
+
arguments: Arguments
|
|
308
305
|
delete_confirm: Supprimer définitivement cette file d'attente ? Cette action est irréversible.
|
|
309
306
|
delete_queue: Supprimer la file d'attente
|
|
310
307
|
depth: 'Profondeur :'
|
|
311
308
|
discard: Rejeter
|
|
312
309
|
discard_confirm: Rejeter ce message ?
|
|
313
310
|
empty: La file d'attente est vide
|
|
311
|
+
full_json_payload: Charge utile JSON complète
|
|
314
312
|
headers:
|
|
315
|
-
actions: Actions
|
|
316
313
|
enqueued: Enregistré
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Classe de travail
|
|
319
316
|
reads: Lectures
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: En-têtes
|
|
319
|
+
job_id: 'ID du travail :'
|
|
321
320
|
message_discard_failed: Impossible de rejeter le message.
|
|
322
321
|
message_discarded: Message rejeté.
|
|
323
322
|
message_retried: Visibilité du message réinitialisée.
|
|
324
323
|
message_retry_failed: Impossible de réessayer le message.
|
|
324
|
+
metadata: Métadonnées
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Dernière lecture :'
|
|
327
|
+
locale: 'Langue :'
|
|
328
|
+
priority: 'Priorité :'
|
|
329
|
+
queue: 'File d''attente :'
|
|
330
|
+
scheduled: 'Planifié :'
|
|
331
|
+
timezone: 'Fuseau horaire :'
|
|
332
|
+
visible_at: 'Visible à :'
|
|
325
333
|
pause: Pause
|
|
326
334
|
pause_confirm: Mettre en pause le traitement ?
|
|
327
335
|
purge_confirm: Purger tous les messages ?
|
|
@@ -337,6 +345,10 @@ fr:
|
|
|
337
345
|
one: Tâche %{count} configurée
|
|
338
346
|
other: Tâches %{count} configurées
|
|
339
347
|
title: Tâches récurrentes
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Tâche désactivée
|
|
350
|
+
enabled: Tâche activée
|
|
351
|
+
failed: Impossible de basculer la tâche
|
|
340
352
|
show:
|
|
341
353
|
back: Retour
|
|
342
354
|
configuration: Configuration
|
data/config/locales/it.yml
CHANGED
|
@@ -239,16 +239,12 @@ it:
|
|
|
239
239
|
index:
|
|
240
240
|
description: Blocchi di unicità attivi che impediscono l'esecuzione duplicata del lavoro
|
|
241
241
|
empty: Nessun blocco attivo
|
|
242
|
-
executing: In esecuzione
|
|
243
242
|
headers:
|
|
244
243
|
age: Età
|
|
245
|
-
expires: Scade
|
|
246
|
-
job_class: Classe del lavoro
|
|
247
244
|
lock_key: Chiave di blocco
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
title: Blocchi del lavoro
|
|
245
|
+
msg_id: ID messaggio
|
|
246
|
+
queue_name: Coda
|
|
247
|
+
title: Chiavi di unicità
|
|
252
248
|
outbox:
|
|
253
249
|
index:
|
|
254
250
|
description: Voci dell'outbox transazionali in attesa di pubblicazione su PGMQ
|
|
@@ -305,23 +301,35 @@ it:
|
|
|
305
301
|
purge_confirm: Eliminare tutti i messaggi da %{name}?
|
|
306
302
|
resume: Riprendi
|
|
307
303
|
show:
|
|
304
|
+
arguments: Argomenti
|
|
308
305
|
delete_confirm: Eliminare permanentemente questa coda? Questa azione non può essere annullata.
|
|
309
306
|
delete_queue: Elimina coda
|
|
310
307
|
depth: 'Profondità:'
|
|
311
308
|
discard: Scarta
|
|
312
309
|
discard_confirm: Scartare questo messaggio?
|
|
313
310
|
empty: La coda è vuota
|
|
311
|
+
full_json_payload: Payload JSON completo
|
|
314
312
|
headers:
|
|
315
|
-
actions: Azioni
|
|
316
313
|
enqueued: In coda
|
|
317
314
|
id: ID
|
|
318
|
-
|
|
315
|
+
job_class: Classe Lavoro
|
|
319
316
|
reads: Letture
|
|
320
317
|
vt: VT
|
|
318
|
+
headers_section: Intestazioni
|
|
319
|
+
job_id: 'ID Lavoro:'
|
|
321
320
|
message_discard_failed: Impossibile scartare il messaggio.
|
|
322
321
|
message_discarded: Messaggio scartato.
|
|
323
322
|
message_retried: Visibilità del messaggio reimpostata.
|
|
324
323
|
message_retry_failed: Impossibile riprovare il messaggio.
|
|
324
|
+
metadata: Metadati
|
|
325
|
+
metadata_labels:
|
|
326
|
+
last_read: 'Ultima lettura:'
|
|
327
|
+
locale: 'Locale:'
|
|
328
|
+
priority: 'Priorità:'
|
|
329
|
+
queue: 'Coda:'
|
|
330
|
+
scheduled: 'Programmato:'
|
|
331
|
+
timezone: 'Fuso orario:'
|
|
332
|
+
visible_at: 'Visibile alle:'
|
|
325
333
|
pause: Pausa
|
|
326
334
|
pause_confirm: Mettere in pausa l'elaborazione?
|
|
327
335
|
purge_confirm: Eliminare tutti i messaggi?
|
|
@@ -337,6 +345,10 @@ it:
|
|
|
337
345
|
one: "%{count} attività configurata"
|
|
338
346
|
other: "%{count} attività configurate"
|
|
339
347
|
title: Attività ricorrenti
|
|
348
|
+
toggle:
|
|
349
|
+
disabled: Attività disabilitata
|
|
350
|
+
enabled: Attività abilitata
|
|
351
|
+
failed: Impossibile cambiare lo stato dell'attività
|
|
340
352
|
show:
|
|
341
353
|
back: Indietro
|
|
342
354
|
configuration: Configurazione
|