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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +15 -0
  3. data/app/controllers/pgbus/dead_letter_controller.rb +17 -0
  4. data/app/controllers/pgbus/jobs_controller.rb +36 -0
  5. data/app/controllers/pgbus/locks_controller.rb +25 -0
  6. data/app/controllers/pgbus/recurring_tasks_controller.rb +5 -3
  7. data/app/frontend/pgbus/application.js +58 -1
  8. data/app/models/pgbus/job_lock.rb +16 -8
  9. data/app/models/pgbus/uniqueness_key.rb +36 -0
  10. data/app/views/pgbus/dead_letter/_messages_table.html.erb +22 -2
  11. data/app/views/pgbus/dead_letter/index.html.erb +9 -1
  12. data/app/views/pgbus/jobs/_enqueued_table.html.erb +36 -6
  13. data/app/views/pgbus/jobs/_failed_table.html.erb +35 -4
  14. data/app/views/pgbus/locks/index.html.erb +53 -28
  15. data/app/views/pgbus/queues/show.html.erb +58 -21
  16. data/app/views/pgbus/recurring_tasks/_tasks_table.html.erb +2 -1
  17. data/config/locales/da.yml +21 -9
  18. data/config/locales/de.yml +21 -9
  19. data/config/locales/en.yml +51 -9
  20. data/config/locales/es.yml +21 -9
  21. data/config/locales/fi.yml +21 -9
  22. data/config/locales/fr.yml +21 -9
  23. data/config/locales/it.yml +21 -9
  24. data/config/locales/ja.yml +21 -9
  25. data/config/locales/nb.yml +21 -9
  26. data/config/locales/nl.yml +21 -9
  27. data/config/locales/pt.yml +21 -9
  28. data/config/locales/sv.yml +21 -9
  29. data/config/routes.rb +12 -1
  30. data/lib/generators/pgbus/migrate_job_locks_generator.rb +56 -0
  31. data/lib/generators/pgbus/templates/add_uniqueness_keys.rb.erb +13 -0
  32. data/lib/generators/pgbus/templates/migrate_job_locks_to_uniqueness_keys.rb.erb +33 -0
  33. data/lib/pgbus/active_job/executor.rb +34 -20
  34. data/lib/pgbus/client.rb +18 -2
  35. data/lib/pgbus/process/dispatcher.rb +33 -10
  36. data/lib/pgbus/process/worker.rb +4 -1
  37. data/lib/pgbus/recurring/schedule.rb +38 -35
  38. data/lib/pgbus/stat_buffer.rb +107 -0
  39. data/lib/pgbus/uniqueness.rb +24 -39
  40. data/lib/pgbus/version.rb +1 -1
  41. data/lib/pgbus/web/data_source.rb +49 -18
  42. 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
- <tr class="hover:bg-gray-50 dark:hover:bg-gray-700/50 dark:bg-gray-900">
55
- <td class="px-4 py-3 text-sm font-mono text-gray-900 dark:text-white"><%= m[:msg_id] %></td>
56
- <td class="px-4 py-3 text-sm text-gray-500"><%= pgbus_time_ago(m[:enqueued_at]) %></td>
57
- <td class="px-4 py-3 text-sm text-gray-500"><%= m[:read_ct] %></td>
58
- <td class="px-4 py-3 text-sm text-gray-500"><%= pgbus_time_ago(m[:vt]) %></td>
59
- <td class="px-4 py-3 text-sm text-gray-600 font-mono text-xs max-w-md truncate">
60
- <%= pgbus_json_preview(m[:message]) %>
61
- </td>
62
- <td class="px-4 py-3 text-sm text-right space-x-1 whitespace-nowrap">
63
- <%= button_to t("pgbus.queues.show.retry"), pgbus.retry_message_queue_path(name: params[:name], msg_id: m[:msg_id]),
64
- method: :post,
65
- class: "text-xs text-indigo-600 hover:text-indigo-800 font-medium",
66
- data: { turbo_confirm: t("pgbus.queues.show.retry_confirm") } %>
67
- <%= button_to t("pgbus.queues.show.discard"), pgbus.discard_message_queue_path(name: params[:name], msg_id: m[:msg_id]),
68
- method: :post,
69
- class: "text-xs text-red-600 hover:text-red-800 font-medium",
70
- data: { turbo_confirm: t("pgbus.queues.show.discard_confirm") } %>
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="6" class="px-4 py-8 text-center text-sm text-gray-400"><%= t("pgbus.queues.show.empty") %></td></tr>
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] %>
@@ -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
- owner: Ejer
249
- state: Status
250
- queued: I kø
251
- title: Joblåse
245
+ msg_id: Besked-ID
246
+ queue_name:
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
- payload: Indhold
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
@@ -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
- owner: Besitzer
249
- state: Status
250
- queued: In Warteschlange
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
- payload: Nutzlast
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
@@ -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
- owner: Owner
265
- state: State
266
- queued: Queued
267
- title: Job Locks
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
- payload: Payload
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
@@ -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
- owner: Propietario
249
- state: Estado
250
- queued: En cola
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
- payload: Carga útil
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
@@ -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
- owner: Omistaja
249
- state: Tila
250
- queued: Jonossa
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
- payload: Kuorma
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
@@ -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
- owner: Propriétaire
249
- state: État
250
- queued: En file d'attente
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
- payload: Charge utile
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
@@ -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
- owner: Proprietario
249
- state: Stato
250
- queued: In coda
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
- payload: Carico utile
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