JBoss 5 - Расшифровка трассировки стека - PullRequest
1 голос
/ 10 января 2011

В моем развертывании на JBoss 5.1.0GA с JavaEE-5 у меня есть бины общего вида

public interface Foo {
   void baz ();
}

@Stateless
public class FooBean implements Foo {
   void baz() { // ...
   }
}

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

Нужно ли явно аннотировать интерфейсы как локальные или по умолчанию? Поиск документации по этому вопросу является сложной задачей, поэтому любые ссылки на соответствующую документацию будут с благодарностью.

(редактировать добавленную трассировку подозрительного стека)

Трассировка стека, которую я получаю, выглядит следующим образом. Подозрительная строка - "$ Proxy638". FooBean помечен как описанный выше, а Client и Manager оба являются POJO (например, полностью не аннотированы ни с какими элементами, связанными с Java EE). Этот вызов обрабатывается компонентом, управляемым сообщениями, если это полезно. Я вижу, что исключение - одно из моих («Мое сообщение об ошибке идет сюда!» - это сообщение, которое я хочу отследить от реального стека).

2011-01-10 11:15:06,428 ERROR [org.jboss.resource.adapter.jms.inflow.JmsServerSession](WorkManager(2)-11) Unexpected error delivering message delegator->JBossMessage[21211678385963013]:PERSISTENT, deliveryId=5
javax.ejb.EJBTransactionRolledbackException: My error message goes here!
  at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)
  at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
  at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:194)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.RunAsSecurityInterceptorv2.invoke(RunAsSecurityInterceptorv2.java:94)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:182)
  at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:240)
  at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:188)
  at $Proxy638.generateWidget(Unknown Source)
  at com.foobar.managers.Client.writeBananaToStream(Client.java:456)
  at com.foobar.managers.Client.write(Client.java:123)
  at com.foobar.managers.Manager.persist(Manager.java:275)
  at com.foobar.FooBean.doSomething(FooBean.java:1243)

Обратите внимание, что мне пришлось анонимизировать код, поэтому любые несоответствующие вещи, связанные с именами классов, почти наверняка опечатки!

1 Ответ

2 голосов
/ 11 января 2011

Это локальный вызов.

С JBoss AS, если вы пропустите аннотацию @Local, вы получите семантику локального интерфейса.Я не уверен на 100%, соответствует ли это спецификациям, поэтому лучше определите это явно, поместив эту аннотацию туда.

$Proxy638, который вы видите, лежит в основе работы EJB и аналогичных компонентных моделей.Это причина, по которой вы не можете использовать оператор new для создания EJB, но можете только найти один с помощью JNDI или один оператор с помощью аннотации @EJB или @Inject.

Вы никогда не получите объект напрямую, но вместо этого вы получаете прокси, также известный как заглушка.В терминах EJB у вас, как говорят, есть Client view на фактическом бобе.Этот прокси-сервер позволяет EJB-контейнеру использовать магию AOP, например, прозрачный запуск транзакции и ее фиксация или откат.

...