2011-01-18 23 views
11

modelidir. MDB bir mesaj aldığında, bir modeme TCP yoluyla bir msg gönderir. Ben InputStream üzerinde zaman aşımını ayarlamak sen cant cozİşlem ben JMS kuyruğuna dinler MDB var ben EJB3.0</p> <p>jboss 5.1.x kullanıyorum Zaman Aşımlarını

 byte[] byteData = receive(is); 

: Sunucu bir cevap bekliyor ne zaman Modem yanıtı doesnt bazen .

EJB kapsayıcısına, işlem zaman aşımına (varsayılan olarak var olan) işlemi geri almasına ve daha sonra yeniden denemenin yapılmasına teşekkürler.

, sorun varsayılan olarak bu mekanizma benim için çalışıyor

olduğunu :

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 

herhangi biri:

Bazen işlemin uzun bir süre sonra ben konsolda msg aşağıdaki almak aşımına uğradı ve asla fikri neyin var? ve neden bazen çalışır ve bazen olmaz?

Teşekkürler,

ışın. Arjuna'nın İşlem Yöneticisi'ni kullanan JBossAS

cevap

11

EJB3 önleme zincirinde, işi işi durdurmak olan işlem yöneticisi önleyicilerini açmaya ve sonunda vurmaya başlamıştı. MDB Diyelim ki diğer fasulye için @ActivationConfigProperty(propertyName="transactionTimeout" value="1500")

  • ile annote edebilirsiniz için

    • sınıf düzeyinde veya yöntem düzeyinde @TransactionTimeout(1500) sahip olabilir.

    işlem yöneticisi işlem zaman aşımına uğradı olduğunu algılar ve sonra (yönteminde çalışan iş parçacığı farklı) bir zaman uyumsuz iş parçacığı içinden bunu iptal eder, ancak şu anda çalışan iş parçacığı için bir kesme gönderir asla

    .

    Sonuç olarak: birden çok iş parçacığı etkinken çağrılırken ... 1 iş parçacığı etkin değil!

    Düzenleme: vb

    //--- 
    
    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); 
    
    //--- 
    

    Ayrıca Referans Handler, Finalizer gibi diğer aktif konuları listeler, Sinyal Dispatcher

  • +0

    Ben nasıl ele alabileceğinizi? Şu anda çalışan ipliği 'kesmek' istiyorum. 10x – rayman

    +0

    , kesmeyi belirtmek için bir bayrak kullanır ve buna bağlı olarak, iş parçacığı ayarlanmışsa şu an yürütme görevini durdurmalıdır. –

    +0

    Evet, ama yine de, işlem zaman aşımının, iş parçacığı içinde kendi kendine çalışan ek konuları da işleyemeyeceğini söylüyorsunuz. Bunu başarmak istiyorum, bunu nasıl uygulayabilirim? 10x. – rayman