2013-02-18 15 views
12

JBoss 5.1 kullanan Java EE 5 projesi ve bunun gibi bir sorun var. Mesaj içeriğinden kaynaklanan bir dize kullanarak MDB'lerde bazı EJB'ler için çalışma zamanı araması yapmak zorundayım. MDB'lerde kullanılan bir çeşit servis konum belirleyici. Şimdi, MDB'ler dağıtımdan hemen sonra tüketmeye başladıkları için, örtük dağıtım sırası burada çalışmadığından (çalışma zamanı araması) çok fazla NameNotFoundException var. Bu konu hakkında ne düşünüyorsun? EJB 3.0 kullanarak gerçekten iyi yapılabilir mi? Sorunu çözmesi durumunda herhangi bir satıcıya özgü malzeme (JBoss 5.1) kullanmam da kabul edilebilir.MDB'deki EJB'ler için çalışma zamanı araması, dağıtımdan hemen sonra tüketiyor

durumu görselleştirmek için bazı kod parçacığı:

@MessageDriven(mappedName="jms/Queue") 
public class MessageBean implements MessageListener { 

    @Resource 
    private MessageDrivenContext mdc; 

    public void onMessage(Message msg) { 

     final String beanName = // extract somehow the bean's name from 'msg' 
     final Context ctx = new InitialContext(); 
     final Object obj = ctx.lookup(beanName); // NameNotFoundException 
     // do something with 'obj' 
    } 
} 
+0

Hızlı fikir: Tüketimi işlemselleştirdiyseniz, belki de 'NameNotFoundException' öğesindeki tx'i reddedebilir, mantıklı bir yeniden deneme politikasına sahip olabilir ve EJB'lerin bir dahaki sefere konuşmasını umut edebilirsiniz. –

+0

Bu bir şey, ancak kuyruklarda bekleyen milyonlarca iletiye sahip olacağımı fark ettim (bu benim durumum aslında), her biri başlangıçta tx'i reddetmek için işlenecek. Veritabanı muhtemelen diz çökecek. Zaten uygulama başlangıçta büyük bir yük alır. –

+0

Burada bir kod parçacığı yapıştırabilirsiniz .. nasıl arama gerçekleştiriyorsunuz. MDB sınıf tanımınız nedir? – user1428716

cevap

4

Bu dört farklı yaklaşımdan birini kullanın. "@EJB" ek açıklaması (JNDI aramasını kullanmayın) kullanılarak

  1. Declare EJB bağımlılıkları (EJB referanslar). Öğe fasulyesi referansları için, varlık fasulyesi ana arayüzüne başvurmalıdır. bağımlılıkları sağlamalıdır Konteyner yöntemleri/ileti dinleyici işlenmeden önce enjekte edilir:

    MessageDriven (mappedName = "JMS/sıra")
    genel sınıf MessageBean {

    @EJB private EntityBeanHomeA entityBeanHomeA;  
    
    @EJB private EntityBeanHomeB entityBeanHomeB;  
    
    @EJB private EntityBeanHomeC entityBeanHomeC;  
    
    @EJB private SessionBeanD sessionBeanD;  
    
    @Resource 
    private MessageDrivenContext mdc; 
    
    public void onMessage(Message msg) { 
    
        final String beanName = // extract somehow the bean's name from 'msg' 
        final Object obj = getDependentEJB(beanName); 
        // do something with 'obj' 
    } 
    
    private Object getDependentEJB(String beanName) { 
        Object result = null; 
        if ("EntityBeanHomeA".equals(beanName)) { 
         result = entityBeanHomeA; 
        else if ("EntityBeanHomeB".equals(beanName)) { 
         result = entityBeanHomeB; 
        else ("EntityBeanHomeC".equals(beanName)) { 
         result = entityBeanHomeC; 
        else ("SessionBeanD".equals(beanName)) { 
         result = sessionBeanD; 
        } 
        return result; 
    } 
    

    }

  2. MessageListener uygular

    JNDI araması kullanın, ancak EJB bağımlılıklarını EJB dağıtım tanımlayıcıları aracılığıyla bildirin.

    @MessageDriven (mappedName = "JMS/sıra") genel sınıf MessageBean {

    // as given in the original Question... 
    

    }

    MessageListener uygular: Yine, konteynerin bağımlılıkları yöntemleri/mesajlar işlenmeden önce Kur sağlamak sağlamalıdır

    Dağıtım açıklayıcısı:

    <enterprise-beans> 
        <message-driven> 
         ... 
         <ejb-name>MessageBean</ejb-name> 
         <ejb-class>com.company.pkg.MessageBean</ejb-class> 
         <messaging-type>javax.jms.MessageListener</messaging-type> 
         <message-destination-type>javax.jms.Queue</message-destination-type> 
         <message-destination-link>ExpenseProcessingQueue</message-destination-link> 
         <ejb-ref> 
          <description> This is a reference to an EJB 2.1 entity bean 
           that encapsulates access to employee records. 
          </description> 
          <ejb-ref-name>ejb/EmplRecord</ejb-ref-name> 
          <ejb-ref-type>Entity</ejb-ref-type> 
          <home>com.wombat.empl.EmployeeRecordHome</home> 
          <remote>com.wombat.empl.EmployeeRecord</remote> 
          <ejb-link>EmployeeRecord</ejb-link> <-- if in same EJB jar --> 
             <-- ../emp/emp.jar#EmployeeRecord if in diff EJB jar --> 
         </ejb-ref> 
         <ejb-local-ref> 
          <description> This is a reference to the local business interface 
           of an EJB 3.0 session bean that provides a payroll service. 
          </description> 
          <ejb-ref-name>ejb/Payroll</ejb-ref-name> 
          <local>com.aardvark.payroll.Payroll</local> 
          <ejb-link>Payroll</ejb-link> 
         </ejb-local-ref> 
         <ejb-local-ref> 
          <description> This is a reference to the local business interface of an 
           EJB 3.0 session bean that provides a pension plan service. 
          </description> 
          <ejb-ref-name>ejb/PensionPlan</ejb-ref-name> 
          <local>com.wombat.empl.PensionPlan</local> 
          <ejb-link>PensionPlan</ejb-link> <-- if in same EJB jar --> 
         </ejb-local-ref> 
         ... 
        </message-driven> 
        ... 
    </enterprise-beans> 
    
  3. Kullanım JNDI arama ama bağımlılıkları USI beyan yok ya @ EJB ek açıklamaları ya da EJB dağıtımı - konteyner yardımı olmadan tamamen kendi mantığınızla ilgilenir. Gecikmeleri/hata kullanımını kullanın.

  4. Kullanım JBoss dağıtım sırasını kontrol etmek tescilli yapılandırma: Ben iyi yaklaşım tüm EJB'ler kadar MDB konuşlandırılmasını geciktirmek olacağını düşünüyorum

    http://texnoblog.wordpress.com/2010/09/16/depends-in-jboss/

    How to order deployment of EJBs and JMS queue config in JBoss 5?

+0

Glen, cevap için teşekkürler. Bu, bu teknolojileri kullanarak katı ve zarif bir çözüm bulunmadığını teyit eder. Her halükarda bir korsanlık gerekiyor. Muhtemelen 3 veya 4 seçeneği ile deneyeceğim. –

2

bir yolu size MDB içine enjekte bir kukla-EJB oluşturmak olacaktır, mdb o enjeksiyon aslında alabilir kadar tüketen cekti'başlamak bu şekilde yer. kukla-ejb EJB'ler ile birlikte ise

bu here bir benzer kullanım senaryosunu çözer

My cevabını çalışmalı, dinamik arama yapmak amaçlanmıştır.

1

Eğer arama çağrısı etrafında back-off ile bir döngü uygulayabilir.

İlgili konular