سؤال

أنا جديد بشكل معقول على Java ee ، لذلك قد يكون هذا غبيًا .. تحمل معي من فضلك: D

أرغب في ضخ حبة جلسة عديمة الجنسية في حبة تعتمد على الرسائل. في الأساس ، يحصل MDB على رسالة JMS ، ثم يستخدم حبة جلسة لأداء العمل. حبة الجلسة تحمل منطق العمل.

ها هي حبة جلستي:

@Stateless
public class TestBean implements TestBeanRemote {

  public void doSomething() {
    // business logic goes here
  }
}

الواجهة المطابقة:

@Remote
public interface TestBeanRemote {

  public void doSomething();
}

ها هو MDB الخاص بي:

@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TestController implements MessageListener {

 @EJB
 private TestBean testBean;

    public TestController() {
    }

    public void onMessage(Message message) {
      testBean.doSomething();
    }
}

حتى الآن ، وليس علم الصواريخ ، أليس كذلك؟

لسوء الحظ ، عند نشر هذا على Glassfish V3 ، وإرسال رسالة إلى قائمة انتظار JMS المناسبة ، أحصل على أخطاء في أن Glassfish غير قادر على تحديد موقع Testbean EJB:

java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/mvs.test.TestController/testBean' in SerialContext  [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'mvs.test.TestBean#mvs.test.TestBean' [Root exception is javax.naming.NamingException: Lookup failed for 'mvs.test.TestBean#mvs.test.TestBean' in SerialContext  [Root exception is javax.naming.NameNotFoundException: mvs.test.TestBean#mvs.test.TestBean not found]]]

لذلك أسئلتي هي:

  • هل هذه هي الطريقة الصحيحة لحقن حبة الجلسة في حبة أخرى (خاصة الفاصوليا التي تعتمد على الرسائل)؟
  • لماذا فشل البحث التسمية؟
هل كانت مفيدة؟

المحلول 4

حسنًا ، اكتشفت أنه إذا قمت بإضافة التعليق التوضيحي @localbean إلى حبة الجلسة ، فهو يعمل. ماذا ...؟

نصائح أخرى

هل يمكنك محاولة تحديد أشياء مثل هذا:

@Remote
public interface TestBeanRemote {

  public void doSomething();
}

@Stateless(name="TestBeanRemote")
public class TestBean implements TestBeanRemote {

  public void doSomething() {
    // business logic goes here
  }
}

ثم في MDB:

@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TestController implements MessageListener {

    @EJB(beanName="TestBeanRemote")
    private TestBeanRemote testBean;

    public TestController() {
    }

    public void onMessage(Message message) {
      testBean.doSomething();
    }
}

إذا كان هذا العمل ، سأحاول تقديم تفسير :)

أعتقد أن مشكلة المثال الأول هي أنك تحاول حقن تنفيذ EJB وليس واجهته. من الممكن مجرد عرض عدم الواجهة المحلي لـ EJB 3.1 إذا لم تحدد أي واجهة ، ولا حتى واحدة عن بعد. لذا فإن تغيير نقطة الحقن إلى ما يلي يجب أن يعمل:

 @EJB
 private TestBeanRemote testBean;

إذا كنت تستخدم التطبيق الخاص بك في بيئة غير مجمعة ، لذلك JVM واحد ، يجب أن تفكر في تغيير الواجهة إلى local. بمجرد وصولك إلى EJBs باستخدام الواجهة البعيدة الخاصة بهم ، تحصل على الكثير من النفقات العامة. لا يمكن الوصول إلى المعلمات وقيم الإرجاع بالرجوع بعد الآن ، ولكن بالقيمة ، حيث يتم نسخها دائمًا (تقول المواصفات). قد يؤدي هذا إلى مشكلات في الأداء عند التعامل مع الأشياء الأكثر تعقيدًا.

آمل أن ساعد ذلك.

يبدو أن مشكلتي كانت مرتبطة بانعكاس السيطرة وينتج عن افتقاري للمعرفة واقتراحات NetBeans لأسماء الفصل/الواجهة.

اكتشفت ذلك - من أجل العثور على الفول الأيمن والواجهة اليمنى - يجب أن أسميها بشكل صحيح. هذا ما يعمل:

@Remote
public interface Test {

  public void doSomething();
}

@Stateless
public class TestBean implements Test {

  public void doSomething() {
    // business logic goes here
  }
}

وفي MDB I الوصول إلى "اختبار" ليس 'testbean':

@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TestController implements MessageListener {

    @EJB
    private Test testBean;

    public TestController() {
    }

    public void onMessage(Message message) {
      testBean.doSomething();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top