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