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.

  1. 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?

  2. 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?

  3. ¿Tengo que implementar quizás interfaces locales para ambos casos? ¿Cómo se relacionarían?

Al respecto

  1. Efectivamente EL está pensado para referirse a Managed Beans. Quizás en este caso el load-balancing se deba hacer a lo Apache.
  2. 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?

  1. 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
  2. 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í.

Este sitio utiliza cookies.    Leer más