= JEE = Java Platform, Enterprise Edition == JEE 7 Tutorial == https://docs.oracle.com/javaee/7/tutorial/index.html Key features: https://blogs.oracle.com/arungupta/entry/java_ee_7_key_features Reference implementation: https://glassfish.java.net/getstarted.html Java EE7 APIs: https://docs.oracle.com/javaee/7/tutorial/overview007.htm === Install Glassfish 4.1 === https://glassfish.java.net/download.html JDK 8 u20 or above is recommended for GlassFish 4.1. * cd /tmp * wget http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz * wget http://dlc.sun.com.edgesuite.net/glassfish/4.1/release/glassfish-4.1.zip * unzip glassfish-4.1.zip * tar xvzf jdk-8u25-linux-x64.tar.gz * mv jdk1.8.0_25/ /usr/java * mv glassfish4/ /opt/appsrv/ * cd /usr/java/jdk1.8.0_25 * chmod 555 * -R * /usr/java/jdk1.8.0_25/bin/java -version * cd /opt/appsrv/glassfish4/bin * JAVA_HOME=/usr/java/jdk1.8.0_25 AS_JAVA=/usr/java/jdk1.8.0_25 asadmin start-domain * http://localhost:4848/ * asadmin change-admin-password * asadmin enable-secure-admin * asadmin stop-domain * asadmin start-domain == Docker Ubuntu image install == * docker pull ubuntu * docker create --name containerx -p 1022:22 -p 1848:4848 -p 1080:8080 ubuntu * docker start containerx * docker exec -t -i containerx * apt-get update * apt-get install tzdata-java openjdk-7-jdk wget unzip * java * java -version * apt-get install * cd /tmp * wget http://dlc.sun.com.edgesuite.net/glassfish/4.1/release/glassfish-4.1.zip * unzip glassfish-4.1.zip * mkdir -p /opt/appsrv * mv glassfish4/ /opt/appsrv/ * cd /opt/appsrv/glassfish4/ * bin/asadmin start-domain * bin/asadmin change-admin-password * bin/asadmin enable-secure-admin * bin/asadmin stop-domain * bin/asadmin start-domain * exit https://github.com/sebsto/docker-glassfish4/blob/master/Dockerfile == JEE6 EJB 3.1 sample for Glassfish 3.1.2.2 and JBoss 7.1.1 (EJB + JPA + Web Service + MDB + Schedule) == '''Structure:''' {{{ . |-- pom.xml |-- src | `-- main | |-- java | | `-- org | | `-- allowed | | `-- bitarus | | |-- MessageEntity.java | | |-- ScheduleRemote.java | | |-- ScheduleWS.java | | |-- Scheduler.java | | `-- TestMDB.java | `-- resources | `-- META-INF | |-- ejb-jar.xml | `-- persistence.xml }}} '''pom.xml''' {{{#!highlight xml 4.0.0 org.allowed.bitarus ejbjee6 0.0.1 ejb javax javaee-api 6.0 provided }}} '''ejb-jar.xml''' {{{#!highlight xml }}} '''persistence.xml''' {{{#!highlight xml jdbc/mysql }}} '''Scheduler.java''' {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Singleton; import javax.ejb.Schedule; import javax.ejb.ScheduleExpression; import javax.annotation.Resource; import javax.ejb.Timeout; import javax.ejb.TimerConfig; import javax.ejb.TimerService; import javax.ejb.Timer; import javax.annotation.PostConstruct; import javax.ejb.Startup; import javax.jms.ConnectionFactory; import javax.jms.Queue; import javax.jms.Connection; import javax.jms.Session; import javax.jms.MessageProducer; import javax.jms.TextMessage; @Singleton @Startup public class Scheduler { @Resource(mappedName="jms/ConnectionFactory") private ConnectionFactory connectionFactory; @Resource(mappedName="jms/Queuex") private Queue queue; @Resource private TimerService timerService; @PostConstruct private void postConstruct() { TimerConfig config = new TimerConfig("OneMinutePassed", false); ScheduleExpression se = new ScheduleExpression(); se.minute("*"); se.hour("*"); timerService.createCalendarTimer(se, config); } public String addSchedule(String second,String minute,String hour,String info){ TimerConfig config = new TimerConfig(info, false); ScheduleExpression se = new ScheduleExpression(); se.second(second); se.minute(minute); se.hour(hour); timerService.createCalendarTimer(se, config); return "Added " + info; } @Schedule(minute="*/5", hour="*") private void eachFiveMinutes(){ System.out.println("Called each five minute"); } @Timeout public void timeout(Timer timer) { if ("OneMinutePassed".equals(timer.getInfo())) { System.out.println("OneMinutePassed !!!"); /*for(Timer t : timerService.getTimers() ){ System.out.println(">>> "+ t.getInfo() ); }*/ }else{ System.out.println("!!! "+ timer.getInfo() ); // send jms message try{ Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer mp = session.createProducer(queue); TextMessage message = session.createTextMessage(); message.setText( timer.getInfo().toString() ); mp.send(message); mp.close(); session.close(); connection.close(); }catch(Exception ex){ ex.printStackTrace(); } } } } }}} '''ScheduleRemote.java''' {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Remote; @Remote public interface ScheduleRemote{ String addSchedule(String second,String minute,String hour,String info); } }}} '''ScheduleWS.java''' {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; import javax.ejb.ScheduleExpression; import javax.annotation.Resource; import javax.ejb.TimerService; import javax.ejb.TimerConfig; import javax.ejb.EJB; @Stateless @WebService public class ScheduleWS implements ScheduleRemote{ @Resource private TimerService timerService; @EJB Scheduler sc; @WebMethod public String addSchedule(String second,String minute,String hour,String info){ return sc.addSchedule(second, minute, hour, info); } } }}} '''TestMDB.java''' {{{#!highlight java import javax.ejb.MessageDriven; import javax.jms.Message; import javax.jms.TextMessage; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; @MessageDriven(mappedName="jms/Queuex") public class TestMDB{ @PersistenceContext(unitName="puMysql") EntityManager em; public void onMessage(Message inMessage) { try{ String text = ( (TextMessage) inMessage).getText() ; System.out.println( text ); MessageEntity me = new MessageEntity(); me.setMessage( text ); me.setCreationDate( new java.util.Date() ); em.persist(me); }catch(Exception ex){ ex.printStackTrace(); } } } }}} '''MessageEntity.java''' {{{#!highlight java import java.util.Date; import javax.persistence.Id; import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.TemporalType; import javax.persistence.Temporal; @Entity public class MessageEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue(strategy = GenerationType.AUTO) // @OneToMany // @NamedQueries( { @NamedQuery(name="MessageEntity.byId",query="Select me From MessageEntity e where e.id = :id;") , @NamedQuery() } ) // JPQL Select me From MessageEntity e where e.id = :id; // Query q = em.createQuery("Select me From MessageEntity e where e.id = :id;"); // Query q = em.createNamedQuery("MessageEntity.byId"); // q.setParameter("id",12); // List res = q.getResultList (); private long id; @Column @Temporal(TemporalType.TIMESTAMP) private Date creationDate; @Column private String message; public long getId(){return this.id;} public void setId(long id){ this.id=id;} public Date getCreationDate(){return this.creationDate;} public void setCreationDate(Date creationDate){ this.creationDate=creationDate;} public String getMessage(){return this.message;} public void setMessage(String message){ this.message=message;} } }}} == Glassfish OpenMQ standalone client == '''Structure''' {{{ . |-- pom.xml |-- src | `-- main | `-- java | `-- org | `-- allowed | `-- bitarus | `-- JmsClient.java }}} '''pom.xml''' {{{ 4.0.0 org.allowed.bitarus jmsclient 0.0.1 jar org.glassfish.mq imq 5.1 maven-assembly-plugin 2.4 jar-with-dependencies org.allowed.bitarus.JmsClient make-assembly package single }}} '''JmsClient.java''' {{{#!highlight java package org.allowed.bitarus; import com.sun.messaging.ConnectionConfiguration; import com.sun.messaging.ConnectionFactory; import com.sun.messaging.Queue; import javax.jms.Connection; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; import javax.jms.Session; public class JmsClient { public static void main( String[] args ) { try{ ConnectionFactory connFactory = new ConnectionFactory(); connFactory.setProperty(ConnectionConfiguration.imqAddressList, "127.0.0.1:7676"); Queue q = new Queue("Queuex"); Connection connection = connFactory.createConnection(); System.out.println("After create connection"); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(q); Message message = session.createTextMessage("Bitarus test message"); producer.send(message); producer.close(); session.close(); connection.close(); System.out.println("After send message"); }catch(Exception ex){ ex.printStackTrace(); } System.out.println("End"); } } }}} === Check OpenMQ MessageQueue state === * cd /opt/glassfish-3.1.2.2/mq/bin * imqcmd list dst # input the admin user and pass