Как ввести Боб Сессии в Управляемый сообщениями компонент?

Я довольно плохо знаком с 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]]]

Таким образом, мои вопросы:

  • действительно ли это - корректный способ ввести боб сессии в другой боб (особенно управляемый сообщениями компонент)?
  • почему поиск именования перестал работать?
5
задан Arjan Tijms 6 August 2013 в 07:00
поделиться

3 ответа

Хорошо, я обнаружил, что если я добавлю аннотацию @LocalBean к сессионному компоненту, это сработает. ..?

3
ответ дан 18 December 2019 в 08:27
поделиться

Не могли бы вы определить такие вещи:

@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();
    }
}

Если это сработает, я постараюсь предоставить объяснение :)

6
ответ дан 18 December 2019 в 08:27
поделиться

Похоже, моя проблема была связана с инверсией of Control и вызвано отсутствием у меня знаний и предложениями Netbeans для имен классов / интерфейсов.

Я обнаружил, что для того, чтобы найти нужный bean-компонент и правильный интерфейс, я должен правильно назвать их. Вот что работает:

@Remote
public interface Test {

  public void doSomething();
}

@Stateless
public class TestBean implements Test {

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

И в MDB я открываю «Test» , а не «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();
    }
}
4
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: