Skip to main content

ri/java/classes/
queue.rs

1//! Copyright © 2025-2026 Wenze Wei. All Rights Reserved.
2//!
3//! This file is part of Ri.
4//! The Ri project belongs to the Dunimd Team.
5//!
6//! Licensed under the Apache License, Version 2.0 (the "License");
7//! You may not use this file except in compliance with the License.
8//! You may obtain a copy of the License at
9//!
10//!     http://www.apache.org/licenses/LICENSE-2.0
11//!
12//! Unless required by applicable law or agreed to in writing, software
13//! distributed under the License is distributed on an "AS IS" BASIS,
14//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15//! See the License for the specific language governing permissions and
16//! limitations under the License.
17
18//! # Queue Module JNI Bindings
19//!
20//! JNI bindings for Ri queue classes.
21
22use jni::JNIEnv;
23use jni::objects::{JClass, JString, JByteArray, JObject};
24use jni::sys::{jlong, jboolean, jint, jstring, jdouble, jbyteArray, jobjectArray};
25use crate::queue::{RiQueueModule, RiQueueConfig, RiQueueManager, RiQueueMessage, RiQueueStats, RiRetryPolicy, RiDeadLetterConfig};
26use crate::java::exception::check_not_null;
27
28// =============================================================================
29// RiQueueModule JNI Bindings
30// =============================================================================
31
32#[no_mangle]
33pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueModule_new0(
34    mut env: JNIEnv,
35    _class: JClass,
36    config_ptr: jlong,
37) -> jlong {
38    if !check_not_null(&mut env, config_ptr, "RiQueueConfig") {
39        return 0;
40    }
41    
42    let config = unsafe { &*(config_ptr as *const RiQueueConfig) };
43    let result = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
44        RiQueueModule::new(config.clone()).await
45    });
46    
47    match result {
48        Some(Ok(module)) => {
49            let boxed = Box::new(module);
50            Box::into_raw(boxed) as jlong
51        }
52        _ => 0,
53    }
54}
55
56#[no_mangle]
57pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueModule_free0(
58    _env: JNIEnv,
59    _class: JClass,
60    ptr: jlong,
61) {
62    if ptr != 0 {
63        unsafe {
64            let _ = Box::from_raw(ptr as *mut RiQueueModule);
65        }
66    }
67}
68
69// =============================================================================
70// RiQueueConfig JNI Bindings
71// =============================================================================
72
73#[no_mangle]
74pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueConfig_new0(
75    _env: JNIEnv,
76    _class: JClass,
77) -> jlong {
78    let config = Box::new(RiQueueConfig::default());
79    Box::into_raw(config) as jlong
80}
81
82#[no_mangle]
83pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueConfig_setEnabled0(
84    mut env: JNIEnv,
85    _class: JClass,
86    ptr: jlong,
87    enabled: jboolean,
88) {
89    if !check_not_null(&mut env, ptr, "RiQueueConfig") {
90        return;
91    }
92    
93    let config = unsafe { &mut *(ptr as *mut RiQueueConfig) };
94    config.enabled = enabled != 0;
95}
96
97#[no_mangle]
98pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueConfig_setBackendType0(
99    mut env: JNIEnv,
100    _class: JClass,
101    ptr: jlong,
102    backend_type: jint,
103) {
104    if !check_not_null(&mut env, ptr, "RiQueueConfig") {
105        return;
106    }
107    
108    use crate::queue::RiQueueBackendType;
109    let config = unsafe { &mut *(ptr as *mut RiQueueConfig) };
110    config.backend_type = match backend_type {
111        0 => RiQueueBackendType::Memory,
112        1 => RiQueueBackendType::RabbitMQ,
113        2 => RiQueueBackendType::Kafka,
114        3 => RiQueueBackendType::Redis,
115        _ => RiQueueBackendType::Memory,
116    };
117}
118
119#[no_mangle]
120pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueConfig_setConnectionString0(
121    mut env: JNIEnv,
122    _class: JClass,
123    ptr: jlong,
124    connection_string: JString,
125) {
126    if !check_not_null(&mut env, ptr, "RiQueueConfig") {
127        return;
128    }
129    
130    let config = unsafe { &mut *(ptr as *mut RiQueueConfig) };
131    config.connection_string = match env.get_string(&connection_string) {
132        Ok(s) => s.into(),
133        Err(_) => {
134            crate::java::exception::throw_ri_error(&mut env, "Invalid connection string");
135            return;
136        }
137    };
138}
139
140#[no_mangle]
141pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueConfig_free0(
142    _env: JNIEnv,
143    _class: JClass,
144    ptr: jlong,
145) {
146    if ptr != 0 {
147        unsafe {
148            let _ = Box::from_raw(ptr as *mut RiQueueConfig);
149        }
150    }
151}
152
153// =============================================================================
154// RiQueueManager JNI Bindings
155// =============================================================================
156
157#[no_mangle]
158pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_new0(
159    _env: JNIEnv,
160    _class: JClass,
161) -> jlong {
162    let manager = Box::new(RiQueueManager::default());
163    Box::into_raw(manager) as jlong
164}
165
166#[no_mangle]
167pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_init0(
168    mut env: JNIEnv,
169    _class: JClass,
170    ptr: jlong,
171) {
172    if !check_not_null(&mut env, ptr, "RiQueueManager") {
173        return;
174    }
175    
176    let manager = unsafe { &*(ptr as *const RiQueueManager) };
177    let _ = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
178        manager.init().await
179    });
180}
181
182#[no_mangle]
183pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_createQueue0(
184    mut env: JNIEnv,
185    _class: JClass,
186    ptr: jlong,
187    name: JString,
188) -> jstring {
189    if !check_not_null(&mut env, ptr, "RiQueueManager") {
190        return std::ptr::null_mut();
191    }
192    
193    let manager = unsafe { &*(ptr as *const RiQueueManager) };
194    let name_str: String = match env.get_string(&name) {
195        Ok(s) => s.into(),
196        Err(_) => {
197            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
198            return std::ptr::null_mut();
199        }
200    };
201    
202    let result = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
203        manager.create_queue(&name_str).await
204    });
205    
206    match result {
207        Some(Ok(_)) => match env.new_string(&name_str) {
208            Ok(s) => s.into_raw(),
209            Err(_) => std::ptr::null_mut(),
210        },
211        _ => std::ptr::null_mut(),
212    }
213}
214
215#[no_mangle]
216pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_queueExists0(
217    mut env: JNIEnv,
218    _class: JClass,
219    ptr: jlong,
220    name: JString,
221) -> jboolean {
222    if !check_not_null(&mut env, ptr, "RiQueueManager") {
223        return 0;
224    }
225    
226    let manager = unsafe { &*(ptr as *const RiQueueManager) };
227    let name_str: String = match env.get_string(&name) {
228        Ok(s) => s.into(),
229        Err(_) => {
230            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
231            return 0;
232        }
233    };
234    
235    let exists = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
236        manager.get_queue(&name_str).await.is_some()
237    })
238    .unwrap_or(false);
239
240    if exists { 1 } else { 0 }
241}
242
243#[no_mangle]
244pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_listQueues0(
245    mut env: JNIEnv,
246    _class: JClass,
247    ptr: jlong,
248) -> jobjectArray {
249    if !check_not_null(&mut env, ptr, "RiQueueManager") {
250        return std::ptr::null_mut();
251    }
252    
253    let manager = unsafe { &*(ptr as *const RiQueueManager) };
254    
255    let queues = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
256        manager.list_queues().await
257    })
258    .unwrap_or_default();
259    
260    let string_class = match env.find_class("java/lang/String") {
261        Ok(c) => c,
262        Err(_) => return std::ptr::null_mut(),
263    };
264    
265    let array = match env.new_object_array(queues.len() as i32, &string_class, JObject::null()) {
266        Ok(a) => a,
267        Err(_) => return std::ptr::null_mut(),
268    };
269    
270    for (i, queue_name) in queues.iter().enumerate() {
271        let jstr = match env.new_string(queue_name) {
272            Ok(s) => s,
273            Err(_) => continue,
274        };
275        let _ = env.set_object_array_element(&array, i as i32, jstr);
276    }
277    
278    array.into_raw()
279}
280
281#[no_mangle]
282pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_deleteQueue0(
283    mut env: JNIEnv,
284    _class: JClass,
285    ptr: jlong,
286    name: JString,
287) -> jboolean {
288    if !check_not_null(&mut env, ptr, "RiQueueManager") {
289        return 0;
290    }
291    
292    let manager = unsafe { &*(ptr as *const RiQueueManager) };
293    let name_str: String = match env.get_string(&name) {
294        Ok(s) => s.into(),
295        Err(_) => {
296            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
297            return 0;
298        }
299    };
300    
301    let result = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
302        manager.delete_queue(&name_str).await
303    });
304    
305    match result {
306        Some(Ok(_)) => 1,
307        _ => 0,
308    }
309}
310
311#[no_mangle]
312pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_publish0(
313    mut env: JNIEnv,
314    _class: JClass,
315    ptr: jlong,
316    queue_name: JString,
317    message: JByteArray,
318) {
319    if !check_not_null(&mut env, ptr, "RiQueueManager") {
320        return;
321    }
322    
323    let manager = unsafe { &*(ptr as *const RiQueueManager) };
324    let queue_name_str: String = match env.get_string(&queue_name) {
325        Ok(s) => s.into(),
326        Err(_) => {
327            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
328            return;
329        }
330    };
331    
332    let payload: Vec<u8> = env.convert_byte_array(message)
333        .unwrap_or_default();
334    
335    let _ = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
336        if let Some(queue) = manager.get_queue(&queue_name_str).await {
337            let producer = queue.create_producer().await;
338            if let Ok(producer) = producer {
339                let msg = RiQueueMessage::new(payload);
340                let _ = producer.send(msg).await;
341            }
342        }
343    });
344}
345
346#[no_mangle]
347pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_consume0(
348    mut env: JNIEnv,
349    _class: JClass,
350    ptr: jlong,
351    queue_name: JString,
352) -> jlong {
353    if !check_not_null(&mut env, ptr, "RiQueueManager") {
354        return 0;
355    }
356    
357    let manager = unsafe { &*(ptr as *const RiQueueManager) };
358    let queue_name_str: String = match env.get_string(&queue_name) {
359        Ok(s) => s.into(),
360        Err(_) => {
361            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
362            return 0;
363        }
364    };
365    
366    let result = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
367        if let Some(queue) = manager.get_queue(&queue_name_str).await {
368            let consumer = queue.create_consumer("default").await;
369            if let Ok(consumer) = consumer {
370                return consumer.receive().await;
371            }
372        }
373        Ok(None)
374    });
375    
376    match result {
377        Some(Ok(Some(msg))) => {
378            let boxed = Box::new(msg);
379            Box::into_raw(boxed) as jlong
380        }
381        _ => 0,
382    }
383}
384
385#[no_mangle]
386pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_stats0(
387    mut env: JNIEnv,
388    _class: JClass,
389    ptr: jlong,
390    queue_name: JString,
391) -> jlong {
392    if !check_not_null(&mut env, ptr, "RiQueueManager") {
393        return 0;
394    }
395    
396    let manager = unsafe { &*(ptr as *const RiQueueManager) };
397    let queue_name_str: String = match env.get_string(&queue_name) {
398        Ok(s) => s.into(),
399        Err(_) => {
400            crate::java::exception::throw_ri_error(&mut env, "Failed to get queue name");
401            return 0;
402        }
403    };
404    
405    let result = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
406        if let Some(queue) = manager.get_queue(&queue_name_str).await {
407            queue.get_stats().await.ok()
408        } else {
409            None
410        }
411    });
412    
413    match result {
414        Some(stats) => {
415            let boxed = Box::new(stats);
416            Box::into_raw(boxed) as jlong
417        }
418        None => 0,
419    }
420}
421
422#[no_mangle]
423pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_shutdown0(
424    mut env: JNIEnv,
425    _class: JClass,
426    ptr: jlong,
427) {
428    if !check_not_null(&mut env, ptr, "RiQueueManager") {
429        return;
430    }
431    
432    let manager = unsafe { &*(ptr as *const RiQueueManager) };
433    
434    let _ = crate::java::runtime::block_on_local(&mut env, "RiQueue", async {
435        manager.shutdown().await
436    });
437}
438
439#[no_mangle]
440pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueManager_free0(
441    _env: JNIEnv,
442    _class: JClass,
443    ptr: jlong,
444) {
445    if ptr != 0 {
446        unsafe {
447            let _ = Box::from_raw(ptr as *mut RiQueueManager);
448        }
449    }
450}
451
452// =============================================================================
453// RiQueueMessage JNI Bindings
454// =============================================================================
455
456#[no_mangle]
457pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_new0(
458    env: JNIEnv,
459    _class: JClass,
460    payload: JByteArray,
461) -> jlong {
462    let payload_vec: Vec<u8> = env.convert_byte_array(payload)
463        .unwrap_or_default();
464    
465    let message = Box::new(RiQueueMessage::new(payload_vec));
466    Box::into_raw(message) as jlong
467}
468
469#[no_mangle]
470pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_getId0(
471    mut env: JNIEnv,
472    _class: JClass,
473    ptr: jlong,
474) -> jstring {
475    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
476        return std::ptr::null_mut();
477    }
478    
479    let message = unsafe { &*(ptr as *const RiQueueMessage) };
480    match env.new_string(&message.id) {
481            Ok(s) => s.into_raw(),
482            Err(_) => std::ptr::null_mut(),
483        }
484}
485
486#[no_mangle]
487pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_getPayload0(
488    mut env: JNIEnv,
489    _class: JClass,
490    ptr: jlong,
491) -> jbyteArray {
492    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
493        return std::ptr::null_mut();
494    }
495    
496    let message = unsafe { &*(ptr as *const RiQueueMessage) };
497    let byte_array = env.new_byte_array(message.payload.len() as i32);
498    
499    if let Ok(array) = byte_array {
500        let _ = env.set_byte_array_region(&array, 0, &message.payload.iter().map(|b| *b as i8).collect::<Vec<_>>());
501        return array.into_raw();
502    }
503    
504    std::ptr::null_mut()
505}
506
507#[no_mangle]
508pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_getPayloadString0(
509    mut env: JNIEnv,
510    _class: JClass,
511    ptr: jlong,
512) -> jstring {
513    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
514        return std::ptr::null_mut();
515    }
516    
517    let message = unsafe { &*(ptr as *const RiQueueMessage) };
518    let payload_str = String::from_utf8_lossy(&message.payload);
519    match env.new_string(&payload_str) {
520            Ok(s) => s.into_raw(),
521            Err(_) => std::ptr::null_mut(),
522        }
523}
524
525#[no_mangle]
526pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_getRetryCount0(
527    mut env: JNIEnv,
528    _class: JClass,
529    ptr: jlong,
530) -> jint {
531    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
532        return 0;
533    }
534    
535    let message = unsafe { &*(ptr as *const RiQueueMessage) };
536    message.retry_count as jint
537}
538
539#[no_mangle]
540pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_getMaxRetries0(
541    mut env: JNIEnv,
542    _class: JClass,
543    ptr: jlong,
544) -> jint {
545    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
546        return 0;
547    }
548    
549    let message = unsafe { &*(ptr as *const RiQueueMessage) };
550    message.max_retries as jint
551}
552
553#[no_mangle]
554pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_setMaxRetries0(
555    mut env: JNIEnv,
556    _class: JClass,
557    ptr: jlong,
558    max_retries: jint,
559) {
560    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
561        return;
562    }
563    
564    let message = unsafe { &mut *(ptr as *mut RiQueueMessage) };
565    message.max_retries = max_retries as u32;
566}
567
568#[no_mangle]
569pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_canRetry0(
570    mut env: JNIEnv,
571    _class: JClass,
572    ptr: jlong,
573) -> jboolean {
574    if !check_not_null(&mut env, ptr, "RiQueueMessage") {
575        return 0;
576    }
577    
578    let message = unsafe { &*(ptr as *const RiQueueMessage) };
579    if message.can_retry() { 1 } else { 0 }
580}
581
582#[no_mangle]
583pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueMessage_free0(
584    _env: JNIEnv,
585    _class: JClass,
586    ptr: jlong,
587) {
588    if ptr != 0 {
589        unsafe {
590            let _ = Box::from_raw(ptr as *mut RiQueueMessage);
591        }
592    }
593}
594
595// =============================================================================
596// RiQueueStats JNI Bindings
597// =============================================================================
598
599#[no_mangle]
600pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getQueueName0(
601    mut env: JNIEnv,
602    _class: JClass,
603    ptr: jlong,
604) -> jstring {
605    if !check_not_null(&mut env, ptr, "RiQueueStats") {
606        return std::ptr::null_mut();
607    }
608    
609    let stats = unsafe { &*(ptr as *const RiQueueStats) };
610    match env.new_string(&stats.queue_name) {
611            Ok(s) => s.into_raw(),
612            Err(_) => std::ptr::null_mut(),
613        }
614}
615
616#[no_mangle]
617pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getMessageCount0(
618    mut env: JNIEnv,
619    _class: JClass,
620    ptr: jlong,
621) -> jlong {
622    if !check_not_null(&mut env, ptr, "RiQueueStats") {
623        return 0;
624    }
625    
626    let stats = unsafe { &*(ptr as *const RiQueueStats) };
627    stats.message_count as jlong
628}
629
630#[no_mangle]
631pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getConsumerCount0(
632    mut env: JNIEnv,
633    _class: JClass,
634    ptr: jlong,
635) -> jint {
636    if !check_not_null(&mut env, ptr, "RiQueueStats") {
637        return 0;
638    }
639    
640    let stats = unsafe { &*(ptr as *const RiQueueStats) };
641    stats.consumer_count as jint
642}
643
644#[no_mangle]
645pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getProducerCount0(
646    mut env: JNIEnv,
647    _class: JClass,
648    ptr: jlong,
649) -> jint {
650    if !check_not_null(&mut env, ptr, "RiQueueStats") {
651        return 0;
652    }
653    
654    let stats = unsafe { &*(ptr as *const RiQueueStats) };
655    stats.producer_count as jint
656}
657
658#[no_mangle]
659pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getProcessedMessages0(
660    mut env: JNIEnv,
661    _class: JClass,
662    ptr: jlong,
663) -> jlong {
664    if !check_not_null(&mut env, ptr, "RiQueueStats") {
665        return 0;
666    }
667    
668    let stats = unsafe { &*(ptr as *const RiQueueStats) };
669    stats.processed_messages as jlong
670}
671
672#[no_mangle]
673pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getFailedMessages0(
674    mut env: JNIEnv,
675    _class: JClass,
676    ptr: jlong,
677) -> jlong {
678    if !check_not_null(&mut env, ptr, "RiQueueStats") {
679        return 0;
680    }
681    
682    let stats = unsafe { &*(ptr as *const RiQueueStats) };
683    stats.failed_messages as jlong
684}
685
686#[no_mangle]
687pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getAvgProcessingTimeMs0(
688    mut env: JNIEnv,
689    _class: JClass,
690    ptr: jlong,
691) -> jdouble {
692    if !check_not_null(&mut env, ptr, "RiQueueStats") {
693        return 0.0;
694    }
695    
696    let stats = unsafe { &*(ptr as *const RiQueueStats) };
697    stats.avg_processing_time_ms
698}
699
700#[no_mangle]
701pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getTotalBytesSent0(
702    mut env: JNIEnv,
703    _class: JClass,
704    ptr: jlong,
705) -> jlong {
706    if !check_not_null(&mut env, ptr, "RiQueueStats") {
707        return 0;
708    }
709    
710    let stats = unsafe { &*(ptr as *const RiQueueStats) };
711    stats.total_bytes_sent as jlong
712}
713
714#[no_mangle]
715pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_getTotalBytesReceived0(
716    mut env: JNIEnv,
717    _class: JClass,
718    ptr: jlong,
719) -> jlong {
720    if !check_not_null(&mut env, ptr, "RiQueueStats") {
721        return 0;
722    }
723    
724    let stats = unsafe { &*(ptr as *const RiQueueStats) };
725    stats.total_bytes_received as jlong
726}
727
728#[no_mangle]
729pub extern "system" fn Java_com_dunimd_ri_queue_RiQueueStats_free0(
730    _env: JNIEnv,
731    _class: JClass,
732    ptr: jlong,
733) {
734    if ptr != 0 {
735        unsafe {
736            let _ = Box::from_raw(ptr as *mut RiQueueStats);
737        }
738    }
739}
740
741// =============================================================================
742// RiRetryPolicy JNI Bindings
743// =============================================================================
744
745#[no_mangle]
746pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_new0(
747    _env: JNIEnv,
748    _class: JClass,
749) -> jlong {
750    let policy = Box::new(RiRetryPolicy::default());
751    Box::into_raw(policy) as jlong
752}
753
754#[no_mangle]
755pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_setMaxRetries0(
756    mut env: JNIEnv,
757    _class: JClass,
758    ptr: jlong,
759    max_retries: jint,
760) {
761    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
762        return;
763    }
764    
765    let policy = unsafe { &mut *(ptr as *mut RiRetryPolicy) };
766    policy.max_retries = max_retries as u32;
767}
768
769#[no_mangle]
770pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_getMaxRetries0(
771    mut env: JNIEnv,
772    _class: JClass,
773    ptr: jlong,
774) -> jint {
775    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
776        return 0;
777    }
778    
779    let policy = unsafe { &*(ptr as *const RiRetryPolicy) };
780    policy.max_retries as jint
781}
782
783#[no_mangle]
784pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_setInitialDelayMs0(
785    mut env: JNIEnv,
786    _class: JClass,
787    ptr: jlong,
788    initial_delay_ms: jlong,
789) {
790    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
791        return;
792    }
793    
794    let policy = unsafe { &mut *(ptr as *mut RiRetryPolicy) };
795    policy.initial_delay_ms = initial_delay_ms as u64;
796}
797
798#[no_mangle]
799pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_getInitialDelayMs0(
800    mut env: JNIEnv,
801    _class: JClass,
802    ptr: jlong,
803) -> jlong {
804    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
805        return 0;
806    }
807    
808    let policy = unsafe { &*(ptr as *const RiRetryPolicy) };
809    policy.initial_delay_ms as jlong
810}
811
812#[no_mangle]
813pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_setMaxDelayMs0(
814    mut env: JNIEnv,
815    _class: JClass,
816    ptr: jlong,
817    max_delay_ms: jlong,
818) {
819    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
820        return;
821    }
822    
823    let policy = unsafe { &mut *(ptr as *mut RiRetryPolicy) };
824    policy.max_delay_ms = max_delay_ms as u64;
825}
826
827#[no_mangle]
828pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_getMaxDelayMs0(
829    mut env: JNIEnv,
830    _class: JClass,
831    ptr: jlong,
832) -> jlong {
833    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
834        return 0;
835    }
836    
837    let policy = unsafe { &*(ptr as *const RiRetryPolicy) };
838    policy.max_delay_ms as jlong
839}
840
841#[no_mangle]
842pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_setBackoffMultiplier0(
843    mut env: JNIEnv,
844    _class: JClass,
845    ptr: jlong,
846    backoff_multiplier: jdouble,
847) {
848    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
849        return;
850    }
851    
852    let policy = unsafe { &mut *(ptr as *mut RiRetryPolicy) };
853    policy.backoff_multiplier = backoff_multiplier;
854}
855
856#[no_mangle]
857pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_getBackoffMultiplier0(
858    mut env: JNIEnv,
859    _class: JClass,
860    ptr: jlong,
861) -> jdouble {
862    if !check_not_null(&mut env, ptr, "RiRetryPolicy") {
863        return 0.0;
864    }
865    
866    let policy = unsafe { &*(ptr as *const RiRetryPolicy) };
867    policy.backoff_multiplier
868}
869
870#[no_mangle]
871pub extern "system" fn Java_com_dunimd_ri_queue_RiRetryPolicy_free0(
872    _env: JNIEnv,
873    _class: JClass,
874    ptr: jlong,
875) {
876    if ptr != 0 {
877        unsafe {
878            let _ = Box::from_raw(ptr as *mut RiRetryPolicy);
879        }
880    }
881}
882
883// =============================================================================
884// RiDeadLetterConfig JNI Bindings
885// =============================================================================
886
887#[no_mangle]
888pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_new0(
889    _env: JNIEnv,
890    _class: JClass,
891) -> jlong {
892    let config = Box::new(RiDeadLetterConfig::default());
893    Box::into_raw(config) as jlong
894}
895
896#[no_mangle]
897pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_setEnabled0(
898    mut env: JNIEnv,
899    _class: JClass,
900    ptr: jlong,
901    enabled: jboolean,
902) {
903    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
904        return;
905    }
906    
907    let config = unsafe { &mut *(ptr as *mut RiDeadLetterConfig) };
908    config.enabled = enabled != 0;
909}
910
911#[no_mangle]
912pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_isEnabled0(
913    mut env: JNIEnv,
914    _class: JClass,
915    ptr: jlong,
916) -> jboolean {
917    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
918        return 0;
919    }
920    
921    let config = unsafe { &*(ptr as *const RiDeadLetterConfig) };
922    if config.enabled { 1 } else { 0 }
923}
924
925#[no_mangle]
926pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_setMaxRetryCount0(
927    mut env: JNIEnv,
928    _class: JClass,
929    ptr: jlong,
930    max_retry_count: jint,
931) {
932    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
933        return;
934    }
935    
936    let config = unsafe { &mut *(ptr as *mut RiDeadLetterConfig) };
937    config.max_retry_count = max_retry_count as u32;
938}
939
940#[no_mangle]
941pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_getMaxRetryCount0(
942    mut env: JNIEnv,
943    _class: JClass,
944    ptr: jlong,
945) -> jint {
946    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
947        return 0;
948    }
949    
950    let config = unsafe { &*(ptr as *const RiDeadLetterConfig) };
951    config.max_retry_count as jint
952}
953
954#[no_mangle]
955pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_setDeadLetterQueueName0(
956    mut env: JNIEnv,
957    _class: JClass,
958    ptr: jlong,
959    name: JString,
960) {
961    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
962        return;
963    }
964    
965    let config = unsafe { &mut *(ptr as *mut RiDeadLetterConfig) };
966    config.dead_letter_queue_name = match env.get_string(&name) {
967        Ok(s) => s.into(),
968        Err(_) => {
969            crate::java::exception::throw_ri_error(&mut env, "Invalid queue name");
970            return;
971        }
972    };
973}
974
975#[no_mangle]
976pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_getDeadLetterQueueName0(
977    mut env: JNIEnv,
978    _class: JClass,
979    ptr: jlong,
980) -> jstring {
981    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
982        return std::ptr::null_mut();
983    }
984    
985    let config = unsafe { &*(ptr as *const RiDeadLetterConfig) };
986    match env.new_string(&config.dead_letter_queue_name) {
987            Ok(s) => s.into_raw(),
988            Err(_) => std::ptr::null_mut(),
989        }
990}
991
992#[no_mangle]
993pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_setTtlHours0(
994    mut env: JNIEnv,
995    _class: JClass,
996    ptr: jlong,
997    ttl_hours: jint,
998) {
999    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
1000        return;
1001    }
1002    
1003    let config = unsafe { &mut *(ptr as *mut RiDeadLetterConfig) };
1004    config.ttl_hours = ttl_hours as u32;
1005}
1006
1007#[no_mangle]
1008pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_getTtlHours0(
1009    mut env: JNIEnv,
1010    _class: JClass,
1011    ptr: jlong,
1012) -> jint {
1013    if !check_not_null(&mut env, ptr, "RiDeadLetterConfig") {
1014        return 0;
1015    }
1016    
1017    let config = unsafe { &*(ptr as *const RiDeadLetterConfig) };
1018    config.ttl_hours as jint
1019}
1020
1021#[no_mangle]
1022pub extern "system" fn Java_com_dunimd_ri_queue_RiDeadLetterConfig_free0(
1023    _env: JNIEnv,
1024    _class: JClass,
1025    ptr: jlong,
1026) {
1027    if ptr != 0 {
1028        unsafe {
1029            let _ = Box::from_raw(ptr as *mut RiDeadLetterConfig);
1030        }
1031    }
1032}