= 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