¿Qué es un EJB, y qué hace?


Estado tratando de aprender qué son los frijoles EJB, qué significa que sus instancias se manejan en una piscina, bla, bla. Realmente no puedo conseguir un buen agarre de ellos.

¿Puedes explicarme lo que realmente son (prácticamente para un programador Java)? ¿Qué hacen? ¿Cuáles son sus propósitos? ¿Por qué realmente usarlos? (¿Por qué no limitarse a POJO?) Tal vez una aplicación de ejemplo?

Sírvase remitirse únicamente a la información actualizada, es decir, EJB 3.1. Información fechada sobre EJB puede ser engañoso.

Para los principiantes de EJB learning, tenga en cuenta:

EJB se basan en objetos distribuidos, esto se refiere a piezas de software que se ejecutan en varias máquinas (virtuales o físicas) vinculadas por una red .

Author: szegedi, 2012-10-13

5 answers

¿Por qué realmente usarlos? (¿Por qué no simplemente se adhieren a POJO?)

SI necesita un componente que acceda a la base de datos, o acceda a otros recursos de conectividad/ directorio, o se accede desde múltiples clientes, o se pretende que sea un servicio SOA, EJBs hoy en día son generalmente "más grandes, más fuertes, más rápidos (o al menos más escalables) y más simples" que POJOs. Son más valiosos para dar servicio a un gran número de usuarios a través de la web o la red corporativa y algo menos valiosos para pequeñas aplicaciones dentro de un departamento.

  1. Reutilizar / Compartir Lógica a través de múltiples aplicaciones / clientes con Acoplamiento Suelto.
    EJB se pueden empaquetar en sus propios frascos, implementarse e invocarse desde muchos lugares. Son componentes comunes. Es cierto, POJOs puede ser (con cuidado!) diseñado como bibliotecas y empaquetado en frascos. Pero EJBs admite acceso a redes locales y remotas, incluyendo a través de la interfaz java local, RMI transparente, mensaje asíncrono JMS y servicio web SOAP / REST, ahorro de cortar y pegar dependencias jar con múltiples (inconsistente?) despliegue.
    Son muy útiles para crear servicios SOA. Cuando se utilizan para el acceso local son POJOs (con servicios de contenedores gratuitos añadidos). El acto de diseñar una capa EJB separada promueve un cuidado adicional para maximizar la encapsulación, el acoplamiento suelto y la cohesión, y promueve una interfaz limpia (Fachada), protegiendo a las personas que llaman del procesamiento y los datos complejos modelo.

  2. Escalabilidad y Fiabilidad Si aplica un número masivo de solicitudes de varios mensajes/procesos de llamadas / threads, se distribuyen a través de las instancias EJB disponibles en el grupo primero y luego en cola. Esto significa que si el número de solicitudes entrantes por segundo es mayor de lo que el servidor puede manejar, nos degradamos con gracia - siempre hay algunos las solicitudes se procesan de manera eficiente y las solicitudes en exceso se hacen esperar. Nos no llegue a "meltdown" del servidor , donde TODAS las solicitudes experimentan un tiempo de respuesta terrible simultáneamente, además, el servidor intenta acceder a más recursos que el hardware y el sistema operativo puede manejar y por lo tanto se bloquea. EJBs se pueden implementar en niveles separados que pueden ser clustered-esto brinda confiabilidad a través de la conmutación por error de un servidor a otro, además el hardware se puede agregar para escalar linealmente.

  3. Gestión de Concurrencia. El contenedor garantiza que las instancias EJB se accedan automáticamente de forma segura (en serie) por múltiples clientes. El contenedor administra el EJB pool, el thread pool, el cola de invocación, y realiza automáticamente el bloqueo de escritura a nivel de método (predeterminado) o leer bloqueo (a través de @ Lock (LEER)). Esto protege los datos de la corrupción a través de conflictos de escritura-escritura concurrentes, y ayuda a que los datos se lean de manera consistente al prevenir enfrentamientos de lectura y escritura.
    Esto es principalmente útil para @ Singleton session beans, donde el bean está manipulando y compartir el estado común entre los clientes que llaman. Esto puede ser fácilmente eliminado manualmente configurar o mediante programación controle escenarios avanzados para la ejecución concurrente de código y acceso a datos.

  4. Manejo automatizado de transacciones.
    No haga nada en absoluto y se ejecutarán todos sus métodos EJB en una transacción JTA. Si accedes a una base de datos usando JPA o JDBC, es automáticamente se alistó en la transacción. Lo mismo para las invocaciones JMS y JCA. Especificar @TransactionAttribute (someTransactionMode) antes de un método para especificar si / cómo método particular participa en la transacción JTA, anulando modo predeterminado: "Requerido".

  5. Acceso a recursos/dependencias muy simple a través de inyección.
    El contenedor buscará recursos y establecerá referencias de recursos como campos de instancia en EJB: tales como conexiones JDBC almacenadas JNDI, conexiones JMS / temas / colas, otros EJBs, JTA Transactions, JPA entity manager persistence contexts, JPA entity manager unidades de persistencia de fábrica y recursos de adaptador JCA. por ejemplo, para configurar una referencia a otra transacción EJB & a JTA & a entidad JPA Gerente & una fábrica y cola de conexión JMS:

    @Stateless
    public class MyAccountsBean {
    
        @EJB SomeOtherBeanClass someOtherBean;
        @Resource UserTransaction jtaTx;
        @PersistenceContext(unitName="AccountsPU") EntityManager em;
        @Resource QueueConnectionFactory accountsJMSfactory;
        @Resource Queue accountPaymentDestinationQueue;
    
        public List<Account> processAccounts(DepartmentId id) {
            // Use all of above instance variables with no additional setup.
            // They automatically partake in a (server coordinated) JTA transaction
        }
    }
    

    Un Servlet puede llamar a este bean localmente, simplemente declarando una variable de instancia:

    @EJB MyAccountsBean accountsBean;    
    

    Y luego simplemente llamar a sus métodos como se desee.

  6. Interacción inteligente con JPA. De forma predeterminada, el EntityManager inyectado como se ha indicado anteriormente utiliza una persistencia en el ámbito de la transacción contexto. Esto es perfecto para frijoles de sesión sin estado. Cuando un método EJB (sin estado) se llama, se crea un nuevo contexto de persistencia dentro del nuevo transacción, todos las instancias de objeto de entidad recuperadas / escritas en la base de datos son visibles solo dentro de método de llamada y están aislados de otros métodos. Pero si otros EJB apátridas son llamado por el método, el contenedor se propaga y comparte el mismo PC con ellos, por lo mismo las entidades se comparten automáticamente de manera consistente a través del PC en el mismo transacción.
    Si se declara un bean de sesión @Stateful, la afinidad inteligente igual con JPA se logra mediante declarando el EntityManager como un alcance extendido uno: @PersistentContent (unitName= " AccountsPU, type = EXTENDED). Esto existe para la vida de la sesión de bean, a través de múltiples llamadas y transacciones de bean, almacena en caché copias en memoria de entidades de BD previamente recuperadas / escritas para que no necesiten ser re-recuperadas.

  7. Gestión del Ciclo de Vida. El ciclo de vida de EJBs se administra en contenedores. Según sea necesario, crea instancias EJB, borra e inicializa el estado de bean de la sesión con estado, activa y activa y llama métodos de devolución de llamada del ciclo de vida, por lo que el código EJB puede participar en adquiera y libere recursos, o realice otro comportamiento de inicialización y apagado. También captura todas las excepciones, las registra, revierte las transacciones según sea necesario y lanza nuevas excepciones EJB o @ApplicationExceptions según sea necesario.

  8. Gestión de la Seguridad. El control de acceso basado en roles a EJBs se puede configurar a través de una simple anotación o XML configuración. El servidor pasa automáticamente la detalles de usuario autenticados junto con cada llamar como contexto de seguridad (el principal y el rol de la llamada). Asegura que todos los RBAC las reglas se aplican automáticamente para que los métodos no puedan ser llamados ilegalmente por el papel equivocado. Permite a EJBs acceder fácilmente a los detalles de usuario / rol para una programación adicional comprobación. Permite conectar el procesamiento de seguridad adicional (o incluso las herramientas IAM) al contenedor de forma estándar.

  9. Estandarización y Portabilidad. EJB implementaciones conforme a los estándares Java EE y convenciones de codificación, promoviendo la calidad y facilidad de comprensión y mantenimiento. También promueve la portabilidad del código a los nuevos servidores de aplicaciones del proveedor, asegurando que todos admitan las mismas características estándar y comportamientos, y al desalentar a los desarrolladores de adoptar accidentalmente propiedad
    características de proveedores no portátiles.

  10. El Verdadero Truco: La simplicidad. Todo lo anterior se puede hacer con código muy simplificado, ya sea utilizando la configuración predeterminada para EJBs dentro de Java EE 6, o añadiendo algunas anotaciones. Codificar características de la fuerza de la empresa/industrial en su propio POJOs haría ser de manera más voluminoso, complejo y propenso a errores. Una vez que comience a codificar con EJBs, son bastante fáciles de desarrollar y brindan un gran conjunto de beneficios de "viaje gratis".

En la especificación original de EJB de hace 10 años, EJB eran un problema importante de productividad. Estaban hinchados, necesitaban muchos artefactos de código y configuración y proporcionaban alrededor de 2/3 de los beneficios anteriores. La mayoría de los proyectos web en realidad no los utilizan. Pero esto ha cambiado significativamente con 10 años de ajuste, revisión, mejora funcional y alineamiento de la corriente de desarrollo. En Java EE 6 proporcionan el máximo nivel de resistencia industrial y simplicidad de uso.

¿Qué es lo que no me gusta?? :-) :-)

 144
Author: Glen Best,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-17 07:28:44

Un EJB es un componente Java, que contiene lógica de negocio, que se despliega en un contenedor, y que se beneficia de los servicios técnicos proporcionados por el contenedor, generalmente de forma declarativa, gracias a las anotaciones:

  • gestión de transacciones: una transacción puede iniciarse automáticamente antes de que se invoque un método del EJB, y confirmarse o activarse una vez que este método regrese. Este contexto transaccional se propaga a llamadas a otros EJB.
  • gestión de la seguridad: una comprobación se puede hacer que el llamador tenga los roles necesarios para ejecutar el método.
  • inyección de dependencias: otros EJBs, o recursos como un gestor de entidades JPA, una fuente de datos JDBC, etc. se puede inyectar en el EJB.
  • concurrencia: el contenedor se asegura de que solo un subproceso a la vez invoque un método de su instancia EJB.
  • distribución: algunos EJB pueden ser llamados remotamente, desde otra JVM.
  • failover y equilibrio de carga: los clientes remotos de su EJBs pueden tener automáticamente su llamada se redirige a otro servidor si es necesario.
  • administración de recursos: los beans con estado se pueden pasivar automáticamente en el disco para limitar el consumo de memoria de su servidor.
  • ... Probablemente he olvidado algunos puntos.
 57
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 14:56:54

Espero que esto de Oracle doc ayude a alguien como yo a entender el tema de EJB de una manera simple.

¿Qué es un Enterprise Bean? Escrito en el lenguaje de programación Java, un enterprise bean es un componente del lado del servidor que encapsula la lógica de negocio de una aplicación. La lógica de negocio es el código que cumple el propósito de la aplicación. En una aplicación de control de inventario, por ejemplo, enterprise beans podría implementar la lógica de negocio en los métodos llamado checkInventoryLevel y orderProduct. Al invocar estos métodos, los clientes pueden acceder a los servicios de inventario proporcionados por la aplicación.

Beneficios de Enterprise Beans Por varias razones, enterprise beans simplifique el desarrollo de aplicaciones grandes y distribuidas. Primero, porque el contenedor EJB proporciona servicios a nivel de sistema a la empresa beans, el desarrollador de bean puede concentrarse en resolver negocios problema. El contenedor EJB, en lugar del desarrollador bean, es responsable de los servicios a nivel del sistema, como la gestión de transacciones y autorización de seguridad.

Segundo, porque los frijoles en lugar de los clientes contienen la lógica de negocio de la aplicación, el desarrollador del cliente puede centrarse en presentación del cliente. El desarrollador del cliente no tiene que codificar las rutinas que implementan reglas de negocio o acceden a bases de datos. Como resultado, los clientes son más delgados, un beneficio que es particularmente importante para los clientes que se ejecutan en pequeñas dispositivo.

Tercero, debido a que los frijoles empresariales son componentes portátiles, el el ensamblador de aplicaciones puede construir nuevas aplicaciones a partir de frijoles existentes. Estas aplicaciones pueden ejecutarse en cualquier servidor Java EE compatible proporcionado que utilizan las Api estándar.

Cuándo usar Enterprise Beans Deberías considerar usar enterprise frijoles si su solicitud tiene alguno de los siguientes requisitos:

La aplicación debe ser escalable. Para dar cabida a un número creciente de usuarios, es posible que necesite distribuir los componentes de una aplicación entre múltiples máquinas. No solo pueden los granos de empresa de una aplicación ejecutar en diferentes máquinas, sino también su ubicación permanecerá transparente para los clientes.

Las transacciones deben garantizar la integridad de los datos. Soporte de frijoles empresariales transacciones, los mecanismos que gestionan el acceso concurrente de objetos compartidos.

La aplicación tendrá una variedad de clientes. Con solo unas pocas líneas de código, los clientes remotos pueden localizar fácilmente los granos de la empresa. Estos los clientes pueden ser delgados, diversos y numerosos.

 16
Author: Tesfa Zelalem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 10:10:27

La pregunta que más me interesa es cómo y dónde puedo usarlos. Para entender esto, primero necesitamos ver qué tipos de Ejb existen. Hay 2 grandes categorías:

  1. Session beans
  2. Mensaje dirigido frijoles

Consideremos los Frijoles de Sesión. Son de 3 clases:

  1. Stateful - estos componentes mantienen el estado y son específicos para un cliente a través de múltiples solicitudes. Véalo como una sesión. El uso inmediato que éstos podrían ser puestos a es carritos de la tienda u otro tipo de sesiones (sesión de inicio de sesión y así sucesivamente)
  2. Stateless - estos son componentes autónomos que no persisten la información entre las solicitudes, pero son únicos para el usuario. Uso inmediato que viene a la mente - Clases de servicio en la capa de servicio. Imagine OrderService. Otro gran uso para estos es exponer servicios web. Una vez más, esto sea en la capa de servicio o totalmente separado.
  3. Singleton - estos son los frijoles que existen por aplicación y se crean una vez y se pueden reutilizar / acceder varias veces. Inmediatamente el Configuration el componente viene a la mente, donde puede almacenar configuraciones de nivel de aplicación y acceder a ellas cuando las necesite desde cualquier lugar.

Ahora el resto de las capacidades o características se pueden usar en capas en cualquiera de estas situaciones:

  • Security - puede verificar los permisos con una anotación en el método al que se llama. Esto puede suceder en el Capa de servicio, así como en el Controlador si así lo desea.
  • Gestión de transacciones - este es el candidato obvio en la capa de servicio o capa de Persistencia
  • Inyección de dependencia - de nuevo se utilizará en todas partes

Un gran uso en los tiempos modernos son los llamados Microservicios y Arquitecturas Orientadas a Servicios. Puede empaquetar algunos componentes de lógica de negocio como EJB y distribuirlos en toda la organización, para ser utilizados por varios clientes (por cliente aquí me refiero a otras aplicaciones de back-end).

Y así sucesivamente. Ahora el gran inconveniente es que se vuelve muy dependiente del contenedor EJB y aunque podría cambiar entre 2 implementaciones de referencia, no podrá cambiar a algo más ligero, Tomcat, por ejemplo. ¿Pero por qué querrías sacrificar todos los beneficios?

 0
Author: ACV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 23:26:26

EJB son solo objetos java especializados que manejan

1.equilibrio de carga y conmutación por error 2.gestión de transacciones y persistencia 3.seguridad La diferencia es que EJBs se ejecuta dentro de un contenedor EJB - un servidor que realmente proporciona las capacidades anteriores. Usamos anotaciones para decirle al contenedor que proporcione esas capacidades.

Un ejb sin estado simple podría parecerse a:

@Stateless
public class MyEJB {
public String hello(){
return "Hello World";
    }
}

Y lo invocarás como:

@EJB
MyEJB ejb

 public void sayHello(){

    System.out.println(ejb.hello());
}

Eso es todo. No hay operadores "nuevos". El EJB container se encarga de la creación de instancias y la administración de subprocesos para que pueda crear aplicaciones empresariales más rápido.

 0
Author: Arezoo Bagherzadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 07:33:40