Java/EJB3/JBoss
Содержание
EJB Tutorial from JBoss: Deployment descriptor
<source lang="java">
File: jboss.xml <?xml version="1.0"?> <jboss
xmlns="http://java.sun.ru/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.ru/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" version="3.0"> <enterprise-beans> <consumer> <ejb-name>ExampleConsumer</ejb-name> <ejb-class>org.jboss.tutorial.consumer_deployment_descriptor.bean.ExampleConsumerBean</ejb-class> <message-destination>queue/tutorial/example</message-destination> <message-destination-type>javax.jms.Queue</message-destination-type> <producer> <class>org.jboss.tutorial.consumer_deployment_descriptor.bean.ExampleProducerRemote</class> </producer> <local-producer> <class>org.jboss.tutorial.consumer_deployment_descriptor.bean.ExampleProducerXA</class> <connection-factory>java:/JmsXA</connection-factory> </local-producer> <local-producer> <class>org.jboss.tutorial.consumer_deployment_descriptor.bean.ExampleProducerLocal</class> </local-producer> <current-message> <method> <method-name>currentMessage</method-name> </method> </current-message> <message-properties> <method> <method-name>method2</method-name> </method> <delivery>NonPersistent</delivery> </message-properties> </consumer> </enterprise-beans>
</jboss>
</source>
EJB Tutorial from JBoss: JBoss deployment descriptor
<source lang="java">
File: ejb-jar.xml <?xml version="1.0" encoding="UTF-8"?> <ejb-jar
xmlns="http://java.sun.ru/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.ru/xml/ns/javaee http://java.sun.ru/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <description>JBoss Stateful Session Bean Tutorial</description> <display-name>JBoss Stateful Session Bean Tutorial</display-name> <enterprise-beans> <session> <ejb-name>ShoppingCart</ejb-name> <remote>org.jboss.tutorial.jboss_deployment_descriptor.bean.ShoppingCart</remote> <ejb-class>org.jboss.tutorial.jboss_deployment_descriptor.bean.ShoppingCartBean</ejb-class> <session-type>Stateful</session-type> <remove-method> <bean-method> <method-name>checkout</method-name> </bean-method> <retain-if-exception>false</retain-if-exception> </remove-method> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <method-permission> <role-name>shopper</role-name> <method> <ejb-name>ShoppingCart</ejb-name> <method-name>buy</method-name> </method> </method-permission> <method-permission> <role-name>clerk</role-name> <method> <ejb-name>ShoppingCart</ejb-name> <method-name>priceCheck</method-name> </method> </method-permission> </assembly-descriptor>
</ejb-jar>
File: jaas-test-config.xml <?xml version="1.0"?> <!DOCTYPE policy PUBLIC
"-//JBoss//DTD JBOSS Security Config 3.0//EN" "http://www.jboss.org/j2ee/dtd/security_config.dtd">
<policy>
<application-policy name = "tutorial-test"> <authentication> <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule" flag = "required"> <module-option name="usersProperties">security/users1.properties</module-option> <module-option name="rolesProperties">security/roles1.properties</module-option> </login-module> </authentication> </application-policy> <application-policy name = "tutorial-default"> <authentication> <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule" flag = "required"> <module-option name="usersProperties">security/users2.properties</module-option> <module-option name="rolesProperties">security/roles2.properties</module-option> </login-module> </authentication> </application-policy>
</policy>
File: jboss.xml <?xml version="1.0"?> <jboss
xmlns="http://java.sun.ru/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.ru/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" version="3.0"> <security-domain>tutorial-default</security-domain> <enterprise-beans> <session> <ejb-name>ShoppingCart</ejb-name> <jndi-name>ShoppingCart</jndi-name> <clustered>true</clustered> <cluster-config> <partition-name>DefaultPartition</partition-name> <load-balance-policy>org.jboss.ha.framework.interfaces.RandomRobin</load-balance-policy> </cluster-config> <security-domain>tutorial-test</security-domain> </session> <session> <ejb-name>StatelessTest</ejb-name> <jndi-name>StatelessTest</jndi-name> </session> </enterprise-beans>
</jboss>
File: jboss-service.xml <?xml version="1.0" encoding="UTF-8"?> <server>
<mbean code="org.jboss.security.auth.login.DynamicLoginConfig" name="jboss.tutorial:service=DynamicLoginConfig"> <attribute name="AuthConfig">META-INF/jaas-test-config.xml</attribute> <depends optional-attribute-name="LoginConfigService"> jboss.security:service=XMLLoginConfig </depends> <depends optional-attribute-name="SecurityManagerService"> jboss.security:service=JaasSecurityManager </depends> </mbean>
</server>
File: application.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.ru/dtd/application_1_3.dtd">
<application>
<display-name>Tutorial</display-name> <module> <ejb>tutorial.jar</ejb> </module>
</application>
</source>
EJB Tutorial from JBoss: service deployment descriptor
<source lang="java">
File: jboss.xml <?xml version="1.0"?> <jboss
xmlns="http://java.sun.ru/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.ru/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" version="3.0"> <enterprise-beans> <service> <ejb-name>ServiceOne</ejb-name> <ejb-class>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceOne</ejb-class> <local>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceOneLocal</local> <remote>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceOneRemote</remote> <management>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceOneManagement</management> <jndi-name>serviceOne/remote</jndi-name> <local-jndi-name>serviceOne/local</local-jndi-name> </service> <service> <ejb-name>ServiceTwo</ejb-name> <ejb-class>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceTwo</ejb-class> <object-name>tutorial:service=serviceTwo</object-name> <management>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceTwoManagement</management> </service> <service> <ejb-name>ServiceThree</ejb-name> <ejb-class>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceThree</ejb-class> <management>org.jboss.tutorial.service_deployment_descriptor.bean.ServiceThreeManagement</management> </service> </enterprise-beans>
</jboss>
File: jboss-service.xml <?xml version="1.0" encoding="UTF-8"?> <server>
<mbean code="org.jboss.ejb3.test.service.Tester" name="jboss.ejb3:service=Tester,test=service"/>
</server>
</source>
Entry Point In ejb-jar.xml
<source lang="java">
File: EmployeeService.java
import java.sql.Connection; import java.sql.PreparedStatement; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.sql.DataSource; @Stateless public class EmployeeService implements EmployeeServiceLocal, EmployeeServiceRemote {
@PersistenceContext(unitName="EmployeeService") EntityManager em; @Resource(name="min") int minCheckNumber = 100; public EmployeeService() { } public void doAction(){
/* Employee employee = new Employee();
employee.setFirstName("E"); employee.setLastName("E"); em.persist(employee); employee.setLastName("New"); em.merge(employee); em.remove(employee); em.flush(); System.out.println("saved"); List list = em.createQuery("FROM Employee p").getResultList(); */ }
}
File: EmployeeServiceLocal.java
import java.util.Collection; import javax.ejb.Local; @Local public interface EmployeeServiceLocal {
public void doAction();
}
File: EmployeeServiceRemote.java
import java.util.Collection;
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote{
public void doAction();
}
File: EntityListener.java
import javax.persistence.PostLoad; import javax.persistence.PostPersist; import javax.persistence.PostRemove; import javax.persistence.PostUpdate; public class EntityListener {
@PostUpdate public void update(Object entity) { System.out.println("@PostUpdate: " + entity.getClass().getName()); } @PostPersist public void persist(Object entity) { System.out.println("@PostPersist: " + entity.getClass().getName()); } @PostLoad public void load(Object entity) { System.out.println("@PostLoad: " + entity.getClass().getName()); } @PostRemove public void remove(Object entity) { System.out.println("@PostRemove: " + entity.getClass().getName()); }
}
File: Employee.java import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.PostRemove; @Entity @EntityListeners(EntityListener.class) public class Employee implements java.io.Serializable {
private int id; private String firstName; private String lastName; @Id @GeneratedValue public int getId() { return id; }
@PostRemove public void postRemove() { System.out.println("@PostRemove"); } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String first) { this.firstName = first; } public String getLastName() { return lastName; } public void setLastName(String last) { this.lastName = last; }
}
File: Main.java import java.util.Collection; import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception { EmployeeServiceRemote service = null; // Context compEnv = (Context) new InitialContext().lookup("java:comp/env"); // service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService"); service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeService/remote"); service.doAction(); }
}
File: jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099
</source>
Use JBoss Enterprise Beans Session Config
<source lang="java">
File: Employee.java import static javax.persistence.FetchType.LAZY; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; @Entity //@Table(name="EMP", schema="HR") @Table(name="EMP") public class Employee implements Serializable {
@Id @Column(name = "EMP_ID") private int id; @Column(name = "COMM") private String name; @Column(name = "SAL") private long salary; @Basic(fetch=LAZY) @Lob @Column(name="PIC") private byte[] picture; public Employee() { } public Employee(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public byte[] getPicture() { return picture; } public void setPicture(byte[] picture) { this.picture = picture; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary(); }
}
File: EmployeeService.java
import java.util.Collection; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; @Stateless public class EmployeeService implements EmployeeServiceLocal, EmployeeServiceRemote {
@PersistenceContext(unitName="EmployeeService") EntityManager em; public EmployeeService() { } public Employee createEmployee(int id, String name, long salary, byte[] pic) { Employee emp = new Employee(id); emp.setName(name); emp.setSalary(salary); emp.setPicture(pic); em.persist(emp); emp = findEmployee(id); System.out.println(emp); return emp; } public void removeEmployee(int id) { Employee emp = findEmployee(id); if (emp != null) { em.remove(emp); } } public Employee raiseEmployeeSalary(int id, long raise) { Employee emp = em.find(Employee.class, id); if (emp != null) { emp.setSalary(emp.getSalary() + raise); } return emp; } public Employee findEmployee(int id) { return em.find(Employee.class, id); } public Collection<Employee> findAllEmployees() { Query query = em.createQuery("SELECT e FROM Employee e"); return (Collection<Employee>) query.getResultList(); } public void doAction(){ Employee emp = new Employee(1); emp.setName("name"); emp.setSalary(100); emp.setPicture("pic".getBytes()); em.persist(emp); emp = findEmployee(1); System.out.println(emp); }
}
File: EmployeeServiceLocal.java
import javax.ejb.Local; @Local public interface EmployeeServiceLocal {
public void doAction(); public Employee createEmployee(int id, String name, long salary, byte[] pic) ;
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote{
public Employee createEmployee(int id, String name, long salary, byte[] pic) ; public void doAction();
}
File: jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099
File: Main.java import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; public class Main {
public static void main(String[] a) throws Exception {
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env"); // service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService"); Object obj = new InitialContext().lookup("EmployeeServiceRemote"); EmployeeServiceRemote service = (EmployeeServiceRemote)PortableRemoteObject.narrow(obj,EmployeeServiceRemote.class); service.createEmployee(158, "AAA", 45000, "asdf".getBytes()); service.doAction(); }
}
</source>
Use JBoss Remote Binding
<source lang="java">
File: EmployeeService.java
import java.util.Collection; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.jboss.annotation.ejb.RemoteBinding; @Stateless @RemoteBinding(jndiBinding="EmployeeServiceRemote") public class EmployeeService implements EmployeeServiceLocal, EmployeeServiceRemote {
@PersistenceContext(unitName="EmployeeService") EntityManager em; public EmployeeService() { } public Employee createEmployee(int id, String name, long salary, byte[] pic) { Employee emp = new Employee(id); emp.setName(name); emp.setSalary(salary); emp.setPicture(pic); em.persist(emp); emp = findEmployee(id); System.out.println(emp); return emp; } public void removeEmployee(int id) { Employee emp = findEmployee(id); if (emp != null) { em.remove(emp); } } public Employee raiseEmployeeSalary(int id, long raise) { Employee emp = em.find(Employee.class, id); if (emp != null) { emp.setSalary(emp.getSalary() + raise); } return emp; } public Employee findEmployee(int id) { return em.find(Employee.class, id); } public Collection<Employee> findAllEmployees() { Query query = em.createQuery("SELECT e FROM Employee e"); return (Collection<Employee>) query.getResultList(); } public void doAction(){ Employee emp = new Employee(1); emp.setName("name"); emp.setSalary(100); emp.setPicture("pic".getBytes()); em.persist(emp); emp = findEmployee(1); System.out.println(emp); }
}
File: EmployeeServiceLocal.java
import javax.ejb.Local; @Local public interface EmployeeServiceLocal {
public void doAction(); public Employee createEmployee(int id, String name, long salary, byte[] pic) ;
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote{
public Employee createEmployee(int id, String name, long salary, byte[] pic) ; public void doAction();
}
File: Employee.java import static javax.persistence.FetchType.LAZY; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; @Entity //@Table(name="EMP", schema="HR") @Table(name="EMP") public class Employee implements Serializable {
@Id @Column(name = "EMP_ID") private int id; @Column(name = "COMM") private String name; @Column(name = "SAL") private long salary; @Basic(fetch=LAZY) @Lob @Column(name="PIC") private byte[] picture; public Employee() { } public Employee(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public byte[] getPicture() { return picture; } public void setPicture(byte[] picture) { this.picture = picture; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary(); }
}
File: jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099
File: Main.java import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; public class Main {
public static void main(String[] a) throws Exception {
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env"); // service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService"); Object obj = new InitialContext().lookup("EmployeeServiceRemote"); EmployeeServiceRemote service = (EmployeeServiceRemote)PortableRemoteObject.narrow(obj,EmployeeServiceRemote.class); service.createEmployee(158, "AAA", 45000, "asdf".getBytes()); service.doAction(); }
}
</source>