2011-01-18 33 views
11

Tôi đang sử dụng jboss 5.1.x, EJB3.0Giao dịch đang xen kẽ Thời gian chờ

Tôi có MDB lắng nghe hàng đợi JMS. khi MDB nhận một tin nhắn, nó sẽ gửi một thông điệp qua TCP tới một số modem. đôi khi Modem doesnt phản ứng khi máy chủ đang chờ đợi một câu trả lời:

 byte[] byteData = receive(is); 

coz tôi không thể thiết lập thời gian chờ trên InputStream.

vì vậy, nhờ vào vùng chứa EJB, thời gian chờ giao dịch (mặc định có sẵn) quay trở lại hoạt động và sau đó thử lại được thực hiện lại.

cơ chế này theo mặc định hoạt động tốt đối với tôi, vấn đề là:

Đôi khi các giao dịch không bao giờ hết thời gian, và sau một thời gian dài tôi nhận được sau msg trong giao diện điều khiển:

15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX a6b2232:5f8:4d3591c6:76 in state RUN 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id a6b2232:5f8:4d3591c6:76 invoked while multiple threads active within it. 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action a6b2232:5f8:4d3591c6:76 aborting with 1 threads active! 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_7] - TransactionReaper::doCancellations worker Thread[Thread-10,5,jboss] successfully canceled TX a6b2232:5f8:4d3591c6:76 

Bất kỳ ý tưởng gì vậy? và tại sao đôi khi nó hoạt động và đôi khi nó không thành công?

cảm ơn,

ray.

Trả lời

11

JBossAS sử dụng Trình quản lý giao dịch của Arjuna. Trong chuỗi đánh chặn EJB3 sẽ bắt đầu hủy và cuối cùng nhấn vào những kẻ đánh chặn người quản lý giao dịch mà công việc của nó là hủy bỏ giao dịch.

  • Đối với MDB của bạn có thể annote nó với @ActivationConfigProperty(propertyName="transactionTimeout" value="1500")

  • Đối với đậu khác mà bạn có thể có @TransactionTimeout(1500) ở cấp lớp hoặc cấp phương pháp.

Khi người quản lý giao dịch phát hiện rằng các giao dịch đã timed out và sau đó hủy bỏ nó từ bên trong một chủ đề không đồng bộ (khác với thread chạy trong phương pháp), nhưng nó không bao giờ gửi một ngắt để thread đang chạy.

Do đó dẫn đến: được gọi trong khi nhiều chuỗi hoạt động trong đó hủy bỏ với 1 chuỗi hoạt động!

Edit:

//--- 

ThreadGroup root = Thread.currentThread().getThreadGroup().getParent(); 

while (root.getParent() != null) 
    root = root.getParent(); 

findAllThread(root,0); 

//--- 

public static findAllThread(ThreadGroup threadGroup, int level){ 

    int actCount = threadGroup.activeCount(); 
    Thread[] threads = new Thread[actCount*2]; 
    actCount = threadGroup.enumerate(threads, false); 


    for (int i=0; i<actCount; i++) { 
     Thread thread = threads[i]; 
     thread.interrupt(); 
    } 

    int groupCount = threadGroup.activeGroupCount(); 
    ThreadGroup[] groups = new ThreadGroup[numGroups*2]; 
    groupCount = threadGroup.enumerate(groups, false); 

    for (int i=0; i<groupCount; i++) 
     findAllThread(groups[i], level+1); 

//--- 

Nó sẽ liệt kê chủ đề hoạt động khác cũng như tham khảo Handler, finalizer, Signal Dispatcher, vv

+0

Làm thế nào tôi sẽ xử lý nó? Tôi muốn nó 'ngắt' luồng đang chạy. 10x – rayman

+0

sử dụng cờ để biểu thị ngắt và dựa trên đó, luồng phải dừng tác vụ hiện đang thực thi của nó nếu nó được đặt. –

+0

Có, nhưng vẫn Bạn nói rằng thời gian chờ giao dịch sẽ không thể timeout cũng bổ sung chủ đề đang chạy trong thread nó tự. Tôi muốn đạt được điều này, làm thế nào tôi có thể thực hiện điều đó? 10x. – rayman

Các vấn đề liên quan