Hasta ahora, en JEE6 siempre he trabajado con Session Beans locales, sin definirle interfaces sino solo anotándolos
@Stateful @Model//Seam public class Bean{
por lo que éstos se deployan como no-interface views.
Pero ahora me interesa poder clusterizar una aplicación, así es que le defino una interfaz remota al bean así
@Remote public interface BeanSF{ //...
la cual mi bean implementa
@Stateful @Model public class Bean implements BeanSF { //...
Con lo cual me surgen varias dudas.
- No puedo usar el bean remoto desde JSF, ya que al no tener interfaz local me escupe
java.lang.IllegalArgumentException: Proxied bean type cannot be java.lang.Object without an interface
¿significa ésto que la parte vista de una aplicación no puede ser distribuída?
- En la especificación de CDI, se pone énfasis en que
You can’t inject an EJB using its remote interface unless you define a resource
¿Es decir que no se puede usar @Inject con las interfaces remotas – las cuales hay que declarar como recursos?
- ¿Tengo que implementar quizás interfaces locales para ambos casos? ¿Cómo se relacionarían?
Al respecto
- Efectivamente EL está pensado para referirse a Managed Beans. Quizás en este caso el load-balancing se deba hacer a lo Apache.
- Veamos. En efecto, si inyectamos directamente la clase como siempre
@Inject private Bean bean;
escupe, en tiempo de deploy,
WELD-001408 Unsatisfied dependencies for type [Bean] with qualifiers [@Default] at injection point [[field] @Inject private com.numerica.paquete.beans.OtroBean.bean]
y si inyectamos la interfaz, ídem.
¿Cuál será entonces la estructura correcta en ambos casos?
- Parece que, indeed, el load-balancing lo hace Apache mismo >>. ¿O sea que los EJBs se clusterizan mientras que las páginas sólo se balancean? Confirmar ésto. Sin embargo, sí se puede clusterizar SFSBs >>. ¿Necesito en este caso tener interfaces locales y remotas (los docs dicen que es posible pero raro como diseño)? Investigar del uso de la anotación @Clustered
- Probablemente aquí haya que hacer un productor de un recurso inyectado, a la manera que lo hicimos con los objetos de JMS>> por tanto con
@Produces @EJB private BeanSF beanSF;
Podemos inyectar la interfaz
@Inject BeanSF beanSF; beanSF.algo(//...
y funciona.
Ojo que los objetos que le pasemos al EJB remoto tienen que ser serializables eso sí.