Skip to content

Commit 88bf3d5

Browse files
committed
Fix queue name mismatch issue - worker now processes all job queues (email, media, api) and add reset stuck jobs functionality
1 parent 12999f1 commit 88bf3d5

File tree

5 files changed

+176
-81
lines changed

5 files changed

+176
-81
lines changed

admin/class-admin-interface.php

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public function init() {
6262
add_action( 'wp_ajax_redis_queue_create_test_job', array( $this, 'ajax_create_test_job' ) );
6363
add_action( 'wp_ajax_redis_queue_diagnostics', array( $this, 'ajax_diagnostics' ) );
6464
add_action( 'wp_ajax_redis_queue_debug_test', array( $this, 'ajax_debug_test' ) );
65+
add_action( 'wp_ajax_redis_queue_reset_stuck_jobs', array( $this, 'ajax_reset_stuck_jobs' ) );
6566
}
6667

6768
/**
@@ -234,9 +235,13 @@ public function render_dashboard_page() {
234235
<button type="button" class="button button-secondary" id="debug-test">
235236
<?php esc_html_e( 'Full Debug Test', 'redis-queue-demo' ); ?>
236237
</button>
238+
<button type="button" class="button button-secondary" id="reset-stuck-jobs">
239+
<?php esc_html_e( 'Reset Stuck Jobs', 'redis-queue-demo' ); ?>
240+
</button>
237241
</div>
238242
<div id="diagnostics-result" style="margin-top: 15px;"></div>
239243
<div id="debug-test-result" style="margin-top: 15px;"></div>
244+
<div id="reset-result" style="margin-top: 15px;"></div>
240245
</div>
241246

242247
<!-- Queue Overview -->
@@ -722,15 +727,15 @@ public function ajax_trigger_worker() {
722727

723728
// Use the helper function to process jobs safely if available
724729
if ( function_exists( 'redis_queue_process_jobs' ) ) {
725-
$results = redis_queue_process_jobs( array( 'default' ), 10 );
730+
$results = redis_queue_process_jobs( array( 'default', 'email', 'media', 'api' ), 10 );
726731
} else {
727732
// Fallback to direct instantiation
728733
if ( ! class_exists( 'Sync_Worker' ) ) {
729734
wp_send_json_error( 'Sync_Worker class not available' );
730735
return;
731736
}
732737
$sync_worker = new Sync_Worker( $this->queue_manager, $this->job_processor );
733-
$results = $sync_worker->process_jobs( array( 'default' ), 10 );
738+
$results = $sync_worker->process_jobs( array( 'default', 'email', 'media', 'api' ), 10 );
734739
}
735740

736741
// Validate results
@@ -879,28 +884,28 @@ public function ajax_debug_test() {
879884
}
880885

881886
try {
882-
$plugin = redis_queue_demo();
887+
$plugin = redis_queue_demo();
883888
$debug_results = array();
884889

885890
// Test 1: Plugin initialization
886-
$debug_results['plugin_init'] = array(
891+
$debug_results[ 'plugin_init' ] = array(
887892
'queue_manager' => is_object( $plugin->queue_manager ),
888893
'job_processor' => is_object( $plugin->job_processor ),
889894
);
890895

891896
// Test 2: Redis connection
892897
if ( $plugin->queue_manager ) {
893-
$debug_results['redis_connection'] = array(
898+
$debug_results[ 'redis_connection' ] = array(
894899
'connected' => $plugin->queue_manager->is_connected(),
895900
);
896901

897902
// Run diagnostics
898-
$diagnostics = $plugin->queue_manager->diagnostic();
899-
$debug_results['redis_diagnostics'] = $diagnostics;
903+
$diagnostics = $plugin->queue_manager->diagnostic();
904+
$debug_results[ 'redis_diagnostics' ] = $diagnostics;
900905
}
901906

902907
// Test 3: Create a test job
903-
$debug_results['job_creation'] = array();
908+
$debug_results[ 'job_creation' ] = array();
904909
try {
905910
$job_id = $plugin->enqueue_job( 'email', array(
906911
'to' => 'test@example.com',
@@ -909,47 +914,47 @@ public function ajax_debug_test() {
909914
) );
910915

911916
if ( $job_id ) {
912-
$debug_results['job_creation']['job_id'] = $job_id;
913-
$debug_results['job_creation']['created'] = true;
917+
$debug_results[ 'job_creation' ][ 'job_id' ] = $job_id;
918+
$debug_results[ 'job_creation' ][ 'created' ] = true;
914919

915920
// Check Redis keys after job creation
916-
$diagnostics_after = $plugin->queue_manager->diagnostic();
917-
$debug_results['job_creation']['redis_keys_after'] = $diagnostics_after['redis_keys'];
921+
$diagnostics_after = $plugin->queue_manager->diagnostic();
922+
$debug_results[ 'job_creation' ][ 'redis_keys_after' ] = $diagnostics_after[ 'redis_keys' ];
918923

919-
// Try to dequeue the job
920-
$dequeued = $plugin->queue_manager->dequeue( array( 'default' ) );
924+
// Try to dequeue the job (check email queue since that's where email jobs go)
925+
$dequeued = $plugin->queue_manager->dequeue( array( 'email' ) );
921926
if ( $dequeued ) {
922-
$debug_results['job_creation']['dequeued'] = true;
923-
$debug_results['job_creation']['dequeued_job_id'] = $dequeued['job_id'];
924-
$debug_results['job_creation']['dequeued_type'] = $dequeued['job_type'];
925-
$debug_results['job_creation']['dequeued_payload'] = $dequeued['payload'];
927+
$debug_results[ 'job_creation' ][ 'dequeued' ] = true;
928+
$debug_results[ 'job_creation' ][ 'dequeued_job_id' ] = $dequeued[ 'job_id' ];
929+
$debug_results[ 'job_creation' ][ 'dequeued_type' ] = $dequeued[ 'job_type' ];
930+
$debug_results[ 'job_creation' ][ 'dequeued_payload' ] = $dequeued[ 'payload' ];
926931
} else {
927-
$debug_results['job_creation']['dequeued'] = false;
928-
$debug_results['job_creation']['dequeue_error'] = 'No job found to dequeue';
932+
$debug_results[ 'job_creation' ][ 'dequeued' ] = false;
933+
$debug_results[ 'job_creation' ][ 'dequeue_error' ] = 'No job found to dequeue';
929934
}
930935
} else {
931-
$debug_results['job_creation']['created'] = false;
932-
$debug_results['job_creation']['error'] = 'Failed to create job';
936+
$debug_results[ 'job_creation' ][ 'created' ] = false;
937+
$debug_results[ 'job_creation' ][ 'error' ] = 'Failed to create job';
933938
}
934939
} catch (Exception $e) {
935-
$debug_results['job_creation']['exception'] = $e->getMessage();
940+
$debug_results[ 'job_creation' ][ 'exception' ] = $e->getMessage();
936941
}
937942

938943
// Test 4: Check database
939944
global $wpdb;
940-
$table_name = $wpdb->prefix . 'redis_queue_jobs';
941-
$job_count = $wpdb->get_var( "SELECT COUNT(*) FROM {$table_name}" );
942-
$debug_results['database'] = array(
945+
$table_name = $wpdb->prefix . 'redis_queue_jobs';
946+
$job_count = $wpdb->get_var( "SELECT COUNT(*) FROM {$table_name}" );
947+
$debug_results[ 'database' ] = array(
943948
'table_exists' => $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) === $table_name,
944-
'job_count' => intval( $job_count ),
949+
'job_count' => intval( $job_count ),
945950
);
946951

947952
// Get recent jobs from database
948-
$recent_jobs = $wpdb->get_results(
953+
$recent_jobs = $wpdb->get_results(
949954
"SELECT job_id, job_type, status, created_at FROM {$table_name} ORDER BY created_at DESC LIMIT 5",
950955
ARRAY_A
951956
);
952-
$debug_results['database']['recent_jobs'] = $recent_jobs;
957+
$debug_results[ 'database' ][ 'recent_jobs' ] = $recent_jobs;
953958

954959
wp_send_json_success( $debug_results );
955960

@@ -958,6 +963,29 @@ public function ajax_debug_test() {
958963
}
959964
}
960965

966+
/**
967+
* AJAX handler to reset stuck jobs.
968+
*
969+
* @since 1.0.0
970+
*/
971+
public function ajax_reset_stuck_jobs() {
972+
check_ajax_referer( 'redis_queue_admin', 'nonce' );
973+
974+
if ( ! current_user_can( 'manage_options' ) ) {
975+
wp_die( -1 );
976+
}
977+
978+
try {
979+
$reset_count = $this->queue_manager->reset_stuck_jobs( 30 );
980+
wp_send_json_success( array(
981+
'message' => sprintf( 'Reset %d stuck jobs back to queued status.', $reset_count ),
982+
'count' => $reset_count,
983+
) );
984+
} catch (Exception $e) {
985+
wp_send_json_error( 'Failed to reset stuck jobs: ' . ( $e ? $e->getMessage() : 'Unknown error' ) );
986+
}
987+
}
988+
961989
/**
962990
* Get system health status.
963991
*

assets/admin.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
$(document).on('click', '#refresh-stats', this.refreshStats);
1818
$(document).on('click', '#run-diagnostics', this.runDiagnostics);
1919
$(document).on('click', '#debug-test', this.runDebugTest);
20+
$(document).on('click', '#reset-stuck-jobs', this.resetStuckJobs);
2021

2122
// Job management events
2223
$(document).on('click', '.view-job', this.viewJob);
@@ -279,6 +280,42 @@
279280
});
280281
},
281282

283+
resetStuckJobs: function(e) {
284+
if (e) e.preventDefault();
285+
286+
var $button = $(this);
287+
var $result = $('#reset-result');
288+
289+
$button.prop('disabled', true).text('Resetting...');
290+
$result.html('<div class="notice notice-info"><p>Resetting stuck jobs...</p></div>');
291+
292+
$.ajax({
293+
url: redisQueueAdmin.ajaxUrl,
294+
type: 'POST',
295+
data: {
296+
action: 'redis_queue_reset_stuck_jobs',
297+
nonce: redisQueueAdmin.nonce
298+
},
299+
success: function(response) {
300+
$button.prop('disabled', false).text('Reset Stuck Jobs');
301+
302+
if (response.success && response.data) {
303+
$result.html('<div class="notice notice-success"><p>' + response.data.message + '</p></div>');
304+
// Refresh stats if available
305+
if (typeof RedisQueueAdmin.refreshStats === 'function') {
306+
RedisQueueAdmin.refreshStats();
307+
}
308+
} else {
309+
$result.html('<div class="notice notice-error"><p>Failed to reset stuck jobs: ' + (response.data || 'Unknown error') + '</p></div>');
310+
}
311+
},
312+
error: function() {
313+
$button.prop('disabled', false).text('Reset Stuck Jobs');
314+
$result.html('<div class="notice notice-error"><p>Failed to reset stuck jobs</p></div>');
315+
}
316+
});
317+
},
318+
282319
viewJob: function(e) {
283320
e.preventDefault();
284321

debug.php

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
*/
66

77
// Bootstrap WordPress
8-
define('WP_USE_THEMES', false);
9-
require_once('../../../wp-load.php');
8+
define( 'WP_USE_THEMES', false );
9+
require_once( '../../../wp-load.php' );
1010

1111
// Load the plugin manually if not already loaded
12-
if (!class_exists('Redis_Queue_Demo')) {
13-
require_once(__DIR__ . '/redis-queue-demo.php');
12+
if ( ! class_exists( 'Redis_Queue_Demo' ) ) {
13+
require_once( __DIR__ . '/redis-queue-demo.php' );
1414
}
1515

1616
// Wait for WordPress to fully load
17-
if (!function_exists('redis_queue_demo')) {
18-
die('Redis Queue Demo functions not available');
17+
if ( ! function_exists( 'redis_queue_demo' ) ) {
18+
die( 'Redis Queue Demo functions not available' );
1919
}
2020

2121
// Get plugin instance
@@ -25,61 +25,61 @@
2525

2626
// Test 1: Check plugin initialization
2727
echo "1. Plugin initialization:\n";
28-
echo " - Queue Manager: " . (is_object($plugin->queue_manager) ? 'OK' : 'FAILED') . "\n";
29-
echo " - Job Processor: " . (is_object($plugin->job_processor) ? 'OK' : 'FAILED') . "\n";
28+
echo " - Queue Manager: " . ( is_object( $plugin->queue_manager ) ? 'OK' : 'FAILED' ) . "\n";
29+
echo " - Job Processor: " . ( is_object( $plugin->job_processor ) ? 'OK' : 'FAILED' ) . "\n";
3030

3131
// Test 2: Check Redis connection
3232
echo "\n2. Redis connection:\n";
33-
if ($plugin->queue_manager) {
34-
echo " - Connected: " . ($plugin->queue_manager->is_connected() ? 'YES' : 'NO') . "\n";
35-
36-
// Run diagnostics
37-
$diagnostics = $plugin->queue_manager->diagnostic();
38-
echo " - Test Write: " . ($diagnostics['test_write'] ? 'OK' : 'FAILED') . "\n";
39-
echo " - Test Read: " . ($diagnostics['test_read'] ? 'OK' : 'FAILED') . "\n";
40-
echo " - Queue Prefix: " . $diagnostics['queue_prefix'] . "\n";
41-
echo " - Redis Keys: " . count($diagnostics['redis_keys']) . "\n";
42-
if (!empty($diagnostics['redis_keys'])) {
43-
echo " - Keys: " . implode(', ', $diagnostics['redis_keys']) . "\n";
44-
}
33+
if ( $plugin->queue_manager ) {
34+
echo " - Connected: " . ( $plugin->queue_manager->is_connected() ? 'YES' : 'NO' ) . "\n";
35+
36+
// Run diagnostics
37+
$diagnostics = $plugin->queue_manager->diagnostic();
38+
echo " - Test Write: " . ( $diagnostics[ 'test_write' ] ? 'OK' : 'FAILED' ) . "\n";
39+
echo " - Test Read: " . ( $diagnostics[ 'test_read' ] ? 'OK' : 'FAILED' ) . "\n";
40+
echo " - Queue Prefix: " . $diagnostics[ 'queue_prefix' ] . "\n";
41+
echo " - Redis Keys: " . count( $diagnostics[ 'redis_keys' ] ) . "\n";
42+
if ( ! empty( $diagnostics[ 'redis_keys' ] ) ) {
43+
echo " - Keys: " . implode( ', ', $diagnostics[ 'redis_keys' ] ) . "\n";
44+
}
4545
} else {
46-
echo " - Queue manager not available\n";
46+
echo " - Queue manager not available\n";
4747
}
4848

4949
// Test 3: Try creating a simple job
5050
echo "\n3. Job creation test:\n";
5151
try {
52-
$job_id = $plugin->enqueue_job('email', array(
53-
'to' => 'test@example.com',
54-
'subject' => 'Test Email',
55-
'message' => 'This is a test email'
56-
));
57-
58-
if ($job_id) {
59-
echo " - Job created: $job_id\n";
60-
61-
// Check if it's in Redis
62-
$diagnostics = $plugin->queue_manager->diagnostic();
63-
echo " - Redis keys after job creation: " . count($diagnostics['redis_keys']) . "\n";
64-
if (!empty($diagnostics['redis_keys'])) {
65-
echo " - Keys: " . implode(', ', $diagnostics['redis_keys']) . "\n";
66-
}
67-
68-
// Try to dequeue it
69-
$dequeued = $plugin->queue_manager->dequeue(array('default'));
70-
if ($dequeued) {
71-
echo " - Job dequeued successfully: " . $dequeued['job_id'] . "\n";
72-
echo " - Job type: " . $dequeued['job_type'] . "\n";
73-
echo " - Payload keys: " . implode(', ', array_keys($dequeued['payload'])) . "\n";
74-
} else {
75-
echo " - Failed to dequeue job\n";
76-
}
77-
78-
} else {
79-
echo " - Failed to create job\n";
80-
}
52+
$job_id = $plugin->enqueue_job( 'email', array(
53+
'to' => 'test@example.com',
54+
'subject' => 'Test Email',
55+
'message' => 'This is a test email',
56+
) );
57+
58+
if ( $job_id ) {
59+
echo " - Job created: $job_id\n";
60+
61+
// Check if it's in Redis
62+
$diagnostics = $plugin->queue_manager->diagnostic();
63+
echo " - Redis keys after job creation: " . count( $diagnostics[ 'redis_keys' ] ) . "\n";
64+
if ( ! empty( $diagnostics[ 'redis_keys' ] ) ) {
65+
echo " - Keys: " . implode( ', ', $diagnostics[ 'redis_keys' ] ) . "\n";
66+
}
67+
68+
// Try to dequeue it
69+
$dequeued = $plugin->queue_manager->dequeue( array( 'default' ) );
70+
if ( $dequeued ) {
71+
echo " - Job dequeued successfully: " . $dequeued[ 'job_id' ] . "\n";
72+
echo " - Job type: " . $dequeued[ 'job_type' ] . "\n";
73+
echo " - Payload keys: " . implode( ', ', array_keys( $dequeued[ 'payload' ] ) ) . "\n";
74+
} else {
75+
echo " - Failed to dequeue job\n";
76+
}
77+
78+
} else {
79+
echo " - Failed to create job\n";
80+
}
8181
} catch (Exception $e) {
82-
echo " - Exception: " . $e->getMessage() . "\n";
82+
echo " - Exception: " . $e->getMessage() . "\n";
8383
}
8484

8585
echo "\n=== Debug Complete ===\n";

includes/class-redis-queue-manager.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,36 @@ public function get_redis_connection() {
508508
return $this->redis;
509509
}
510510

511+
/**
512+
* Reset stuck processing jobs back to queued status.
513+
*
514+
* @since 1.0.0
515+
* @param int $timeout_minutes Jobs processing for longer than this will be reset.
516+
* @return int Number of jobs reset.
517+
*/
518+
public function reset_stuck_jobs( $timeout_minutes = 30 ) {
519+
global $wpdb;
520+
521+
$table_name = $wpdb->prefix . 'redis_queue_jobs';
522+
$timeout_time = date( 'Y-m-d H:i:s', time() - ( $timeout_minutes * 60 ) );
523+
524+
$result = $wpdb->update(
525+
$table_name,
526+
array(
527+
'status' => 'queued',
528+
'updated_at' => date( 'Y-m-d H:i:s' ),
529+
'processed_at' => null,
530+
),
531+
array(
532+
'status' => 'processing',
533+
),
534+
array( '%s', '%s', '%s' ),
535+
array( '%s' )
536+
);
537+
538+
return $result !== false ? $result : 0;
539+
}
540+
511541
/**
512542
* Diagnostic method to test Redis operations.
513543
*

0 commit comments

Comments
 (0)