13. JMS 2.0
Configuration – New API
@JMSConnectionFactoryDefinition(
name = "java:global/jms/demoConnectionFactory",
className = "javax.jms.ConnectionFactory")
@JMSDestinationDefinition(
name = "java:global/jms/demoQueue",
interfaceName = "javax.jms.Queue",
destinationName = "demoQueue")
public class JmsConfiguration {
}
22. JPA 2.1
Old API – Converters
public enum UseSex {
MALE, FEMALE;
}
@Entity
public class User {
@Id
private long id;
@Enumerated(EnumType.ORDINAL)
private UserSex sex;
//..
}
23. JPA 2.1
Old API – Converters
public enum UseSex {
MALE, FEMALE;
}
@Entity
public class User {
@Id
private long id;
@Enumerated(EnumType.STRING)
private UserSex sex;
//..
}
24. JPA 2.1
Old API – Converters
@Entity
public class User {
@Transient
private UserSex sex;
private String db_sex;
@PostLoad
public void afterLoad() {
switch(db_sex){
case "M": sex = UserSex.MALE;
case "F": sex = UserSex.FEMALE;
default: throw new IllegalArgumentException();
}
}
25. JPA 2.1
Old API – Converters
@PrePersist
public void beforePersit() {
switch(sex){
case MALE: db_sex = "M";
case FEMALE: db_sex = "F";
default: throw new IllegalArgumentException();
}
}
26. JPA 2.1
New API
@Entity
public class User {
@Id
private long id;
@Convert(converter = SexConverter.class)
private UserSex sex;
//..
}
27. JPA 2.1
New API
@Converter
public class SexConverter implements AttributeConverter<UserSex, String>{
public String convertToDatabaseColumn(UserSex arg0) {
switch(arg0){
case MALE: return "M";
case FEMALE: return "F";
default: throw new IllegalArgumentException();
}
}
public UserSex convertToEntityAttribute(String arg0) {
switch(arg0){
case "M": return UserSex.MALE;
case "F": return UserSex.FEMALE;
default: throw new IllegalArgumentException();
}
}
}
28. JPA 2.1
New API – stored procedures
@Table(indexes = @Index(columnList = "name"))
@Entity
@NamedQuery(name = User.FIND_USER_BY_NAME,
query = "from User u where name = ?")
@NamedStoredProcedureQuery(name = User. REFRESH_USERS,
procedureName = "USR_STRD_PRCR_CALL")
public class User {
public final static String FIND_USER_BY_NAME = "User.findByName";
public final static String REFRESH_USERS = "User.doSomething";
//..
}
29. Java EE7 deep dive
• JMS 2.0
• JPA 2.1
• Bean Validation 1.1
• JAX-RS 2.0
• Java API for JSON
• Java API for Websockets
• Batch Application
• Concurrency Utilities
30. Bean Validation 1.1
Old API
@Interceptors(ValidationInterceptor.class)
public void addAuthor(@Size(min=5) String name,
String surename) {
Author a = new Author();
a.setName(name);
a.setSurename(surename);
em.persist(a);
}
31. Bean Validation 1.1
Old API
public Object validateMethodInvocation
(InvocationContext ctx) throws Exception {
MethodValidator validator = validatorFactory.getValidator()
.unwrap(MethodValidator.class);
Set<MethodConstraintViolation<Object>> violations =
validator.validateAllParameters(
ctx.getTarget(),
ctx.getMethod(),
ctx.getParameters());
}
32. Bean Validation 1.1
New API
public void addAuthor(@Size(min=5) String name,
String surename) {
Author a = new Author();
a.setName(name);
a.setSurename(surename);
em.persist(a);
}
33. Bean Validation 1.1
New API
@Path("/hello")
public class HelloWorld {
@Path("/{name}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public JsonObject sayHello(
@NotEmpty @PathParam("name") String name) {
//..
}
}
34. Java EE7 deep dive
• JMS 2.0
• JPA 2.1
• Bean Validation 1.1
• JAX-RS 2.0
• Java API for JSON
• Java API for Websockets
• Batch Application
• Concurrency Utilities
36. JAX-RS 2.0
Configuration - Old API
<servlet>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/jax-rs/*</url-pattern>
</servlet-mapping>
37. JAX-RS 2.0
Configuration – New API
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rs")
public class RestApp extends Application {
}
38. JAX-RS 2.0
Client - Old API
HttpURLConnection connection =
(HttpURLConnection)serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);
BufferedReader rd = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line + 'n');
}
System.out.println(sb.toString());
39. JAX-RS 2.0
Client - Old API
<dependency>
<groupId>com.github.kevinsawicki</groupId>
<artifactId>http-request</artifactId>
<version>5.4.1</version>
</dependency>
HttpRequest request = HttpRequest.get(baseURL)
.receive(output);
System.out.println(request.toString());
44. Java API for JSON Processing
New API – streaming API
JsonParser parser = Json.
createParser(new StringReader(string)));
event = parser.next();
assertThat(event).is(new Condition<Object>() {
public boolean matches(Object value) {
return value instanceof Event
&& value == Event.VALUE_STRING;
}
});
assertThat(parser.getString()).isEqualTo("Hello Jakub");
45. Java API for JSON Processing
New API – object API
JsonReader reader = Json.
createReader(new StringReader(string));
JsonObject obj = reader.readObject();
assertThat(obj.containsKey("data")).isTrue();
JsonArray results = obj.getJsonArray("data");
assertThat(results.size()).isEqualTo(2);
assertThat(results.getString(0)).isEqualTo("Hello Jakub");
assertThat(results.getString(1)).isEqualTo("Guten tag Jakub");
46. Java API for JSON Processing
New API – builder
import javax.json.Json;
import javax.json.JsonObject;
@Path("/simple/{name}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public JsonObject saySimpleHello(@PathParam("name") String name) {
return Json.createObjectBuilder()
.add("data", Json.createArrayBuilder()
.add("Hello " + name)
.add("Guten tag " + name)
.build())
.build();
}
47. Java EE7 deep dive
• JMS 2.0
• JPA 2.1
• Bean Validation 1.1
• JAX-RS 2.0
• Java API for JSON
• Java API for Websockets
• Batch Application
• Concurrency Utilities
48. Java API for Websockets
Old API #1
@WebServlet(urlPatterns = "/ping")
public class FeedNotifierWebSocket extends WebSocketServlet {
protected StreamInbound createWebSocketInbound(
String subprotocol,
HttpServletRequest req) {
//..
}
}
49. Java API for Websockets
Old API #1
class NotificationInbound extends MessageInbound {
private WsOutbound outbound;
protected void onOpen(WsOutbound outbound) {
this.outbound = outbound;
}
protected void onBinaryMessage(ByteBuffer m) {
outbound.writeBinaryMessage(message);
}
protected void onTextMessage(CharBuffer m) {
outbound.writeTextMessage(message);
}
}
50. Java API for Websockets
Old API #2
@Singleton
@WebSocketEndpoint(path=”/chat”)
public class ChatServer {
Set<Session> peers = new HashSet<>();
@WebSocketOpen
public void onOpen(Session peer) {
peers.add(session);
}
@WebSocketClose
public void onClose(Session session) {
peers.remove(session);
}
...
51. Java API for Websockets
Old API #2
@WebSocketMessage
public void message(String message, Session client)
throws IOException {
for (Session session : peers) {
if (!session.equals(client)) {
session.getRemote().sendObject(message);
}
}
}
52. Java API for Websockets
New API
@Singleton
@ServerEndpoint("/ping")
public class NotificationServer {
Set<Session> sessions = new HashSet<>();
@OnOpen
public void onOpen(Session s) throws IOException {
sessions.add(s);
}
@OnClose
public void onClose(Session s) throws IOException {
sessions.remove(s);
}
...
53. Java API for Websockets
New API
@OnMessage
public void message(String m, Session client)
throws IOException {
for (Session s: sessions) {
if (s == client) continue;
try {
s.getBasicRemote().sendText(m);
} catch (Exception e) {
onClose(s);
}
}
}
}
54. Java EE7 deep dive
• JMS 2.0
• JPA 2.1
• Bean Validation 1.1
• JAX-RS 2.0
• Java API for JSON
• Java API for Websockets
• Batch Application
• Concurrency Utilities
57. Batch Applications
Job Repository
holds information about jobs current running
and jobs that run in the past. JobOperator
provides access to this repository.
Job Operator
an interface to manage all aspects of job
processing, including operational commands,
such as start, restart, and stop, retrieval of job
and step executions.
60. Java EE7 deep dive
• JMS 2.0
• JPA 2.1
• Bean Validation 1.1
• JAX-RS 2.0
• Java API for JSON
• Java API for Websockets
• Batch Application
• Concurrency Utilities
61. The enterprise bean must not
attempt to manage threads. The
enterprise bean must not attempt
to start, stop, suspend, or resume a
thread, or to change a thread’s
priority or name. The enterprise
bean must not attempt to manage
thread groups.
21.2.2. Programming restrictions
63. Asynchronous Servlets
Old API
@WebServlet(urlPatterns = "/somepath", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//..
}
}
64. ManagedThreadFactory
New API
@Named
public class ThreadManager {
@Resource
ManagedThreadFactory mtf;
public ExecutorService getThreadManager() {
return new ThreadPoolExecutor(5,10, 10,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(100),
mtf);
}
}
65. ManagedThreadFactory
New API
@Named
public class ProcessingService {
public void doMuchStuff(ExecutorService executor) {
for (int i = 0; i < 50; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
}
}
66.
67. Java EE8 ??
• JSON-B (JSON binding)
• JCache (JSR 107)
• Adopt JSR
• Open TCK (??)
• More JSP (+ templates), less JSF
• no more EARs (??)