2013-05-28 8 views
6

में कॉल विधियों असीमित, मैं लॉग इन विधि के दौरान समय बचाने के लिए डेटाबेस के आंकड़ों के लिए अस्थायी रूप से डेटाबेस के आंकड़ों के लिए लॉगिन प्रक्रिया का परिणाम सहेजने का प्रयास करता हूं। लेकिन किसी भी तरह से लॉग इन प्रक्रिया अधिक समय लेती है अगर मैं thyn.s as ascc विधि में सोता हूं। ऐसा क्यों है? मैंने सोचा कि प्रमाणीकरण विधि लिखने के लिए इंतजार नहीं करेगा ResultToStats मेथोड खत्म करने के लिए।ईजेबी

@Stateless 
    @LocalBean 
    @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
    @TransactionManagement(TransactionManagementType.CONTAINER) 
    public class CustomerBeanTest { 

     @PersistenceContext(unitName = WebPersistenceUnits.QISADS) 
     private EntityManager em_local; 

     @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
     public void authenticate(Long loginid, String cmppassword) { 
      try { 
       Login l = em_local.find(Login.class, loginid); 
       String s = l.getPassword(); 
       if (!s.equalsIgnoreCase(cmppassword)) 
        throw new PasswordMissmatchException(); 
       writeResultToStats(loginid, true); 
      } catch (PasswordMissmatchException e) { 
       writeResultToStats(loginid, false); 
      } 
     } 

     @Asynchronous 
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
     private void writeResultToStats(Long loginID, boolean success) { 

      try { // just for testing 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      LogUtils log = new LogUtils(this); 
      Login l = em_local.find(Login.class, loginID); 
      if (success) { 
       l.setSuccessLast(new Date()); 
       l.setSuccessCount(l.getSuccessCount()+1); 
       log.log(Level.INFO, "Update Login Stat Success [%d, %s, %d]", l.getId(), l.getName(), Thread.currentThread().getId()); 
      } else { 
       l.setFailureLast(new Date()); 
       l.setFailureCount(l.getFailureCount()+1); 
       log.log(Level.INFO, "Update Login Stat Fail [%d, %s, %d]", l.getId(), l.getName(), Thread.currentThread().getId()); 
      } 

     } 

    } 
+1

मुझे लगता है कि यदि आप किसी अन्य EJB में अतुल्यकालिक विधि को तोड़ने की जरूरत है:

लेकिन बजाय एक और सेम बनाने के बजाय, आप SessionContext के माध्यम से अतुल्यकालिक सेम विधि कॉल कर सकते हैं। जैसा कि अभी है, इसे स्थानीय विधि-आमंत्रण –

+0

के रूप में संभाला जाएगा, मुझे इसे आज़माएं और –

+0

पर वापस आएं। धन्यवाद। –

उत्तर

9

एसिंक्रोनस विधि को एक अलग ईजेबी में तोड़ने का प्रयास करें। उसी ईजेबी के अंदर से किए गए तरीकों को स्थानीय विधि-आमंत्रणों की तरह ही संभाला जाएगा। कंटेनर विधि कॉल को रोकने में सक्षम नहीं है।

ईजेबी-एनोटेशन केवल तभी होता है जब कंटेनर द्वारा आमंत्रण किया जाता है।

वैकल्पिक

आप एक ही EJB में विधि है, लेकिन यकीन है कि आप सेम देखने और methord तक पहुँचने के लिए EJB स्थानीय इंटरफ़ेस का उपयोग कर सकते हैं।

6

this उदाहरण पर एक नज़र डालें - यह दिखाता है कि आपको अलग ईजेबी बनाने की आवश्यकता नहीं है।

यदि आपके पास एक बीन है जिसमें सिंक्रोनस और एसिंक्रोनस दोनों विधियां हैं, तो सिंक्रोनस के भीतर एसिंक्रोनस विधि को नहीं कहा जा सकता है क्योंकि कंटेनर इसे रोक नहीं पाएगा।

@Stateless 
public class OrderProcessorBean { 
    @Inject 
    SessionContext ctx; 
    //synchronous method invoked from EJB call outside this class 
    public void synch() { 
     //call asynch method 
     ctx.getBusinessObject(OrderProcessorBean.class).asynch(); 
    } 

    @Asynchronous 
    public void asynch() { 
     //asynch logic 
    } 
} 
+2

ध्यान दें कि लिंक-केवल उत्तर ही निराश होते हैं, इसलिए SO समाधान एक समाधान के लिए खोज का अंत बिंदु होना चाहिए (बनाम अभी तक संदर्भों का एक और स्टॉपओवर, जो समय के साथ पुराना हो जाता है)। लिंक को संदर्भ के रूप में रखते हुए, यहां स्टैंड-अलोन सारांश जोड़ना पर विचार करें। – kleopatra

संबंधित मुद्दे