Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

OpenCode XVI

No description
by

Guillaume Cauchon

on 30 October 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of OpenCode XVI

OpenCode XVI
l'édition "Obélix"
Pour ceux qui n’ont pas grandit dans la même décennie que moi… Ou qui ne savent pas qui est Obélix!
J2EE dans le monde Web
Comment on utilise Java pour propulser le backend de Hello Health
Guillaume Cauchon
full-stack developeur
@gcauchon
Dossier de patient électronique;
Prescriptions et Commande d’examens électronique;
Portail web et application mobile pour les patients;
Système de gestion de clinique
agenda, messagerie, fax, facturation, assurance;
Développement basé 100% à Québec;
Marcher cible principalement aux USA, de plus en plus d’intérêt provenant des marchés émergents.
Qu’est-ce que
Très peu d'ouverture dans le domaine de santé au Québec...
Historique
Évolution du codebase sur plusieurs années, dans plusieurs contextes et sur différents modèles d’affaire;
Complexité technique du domaine de santé;
Méthodologie archaïque (BEAUCOUP de documents papier!);
Résistance au changement de nos usagers;
Dette accumulée vs. Évolution exponentielle des technologies;
HTML+CSS+JS = fin de vie de Adobe Flash pour les RIA.
Statistiques :
https://newrelic.com
Application Server
Object Relational Mapping
Context Dependency Injection
REST
javac > bytecode > JVM
optimization par le compilateur
optimization par la JVM (just-in-time)
Si vous avez écrit du javascript, vous connaissez déjà la sémantique et la syntaxe!
Annotations
A form of metadata, provide data about a program that is not part of the program itself and have no direct effect on the operation of the code they annotate.

• Information for the compiler
• Compile-time and deployment-time processing
• Runtime processing
- wikipedia
Avantages & Inconvéniants
+ language en constante évolution
+ communauté très active
+ Java Specification Requests (JSRs)
+ diversité des outils : IDE, SCM, monitoring, etc…

- BEAUCOUP de configuration <xml/>
- documentation complexe et parfois incomplète
- javac n’est pas synonyme de user-friendly
Directives
Runtime
@Override
@SuppressWarnings(value = "unchecked")
ORM

@Entity
@Table(name = "clinics")
public class Clinic
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int clinicId;

@Column(length=50, nullable=false)
private String name;

@Column(length=40)
private String identifier;

(…)

}
REST

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Path("/clinics")
public class ClinicService extends BaseRESTfulWebService
{
@Inject private IClinicBean clinicService;

(…)

}
Oracle Glassfish
JBoss Application Server 7
JBoss Wildfly
i.e. JBosss AS 8
Object Relational Mapping
@Entity
@Table(name = "persons")
public class Person
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int personId;

@OneToOne
@JoinColumn(name = "personId", referencedColumnName = "userId", insertable = false, updatable = false)
private User user;

@Column(length=20)
private String personType;

@Column(length=50)
private String firstname;

@Column(length=50)
private String lastname;

(…)

}
persistence.xml
REST endpoints
@Path("/patients")
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PatientService extends BaseRESTfulWebService
{
@Path("/{patientId}/profile")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public PatientProfile getProfile(@PathParam("patientId") int patientId)
{
PatientProfileDescriptorDTO dto = patientService.getPatientProfile(patientId);
return patientProfileAdapter.createPatientProfile(dto);;
}

@Path("/{userId}/avatar")
@GET
public Response getUserAvatar(
@PathParam("userId") int userId,
@QueryParam("dimension") @DefaultValue("32") int dimension
)
{
Person person = userService.getPersonById(userId);
final String avatar = person.getUser().getAvatarFilename();

FileDTO fileDescriptor = fileService.getFileDescriptor(avatar);
File file = fileService.getAvatar(avatar);

if (file == null || !file.exists()) return Response.status(Status.NOT_FOUND).build();

return Response.ok(file).type(MimeTypes.getMimeType(fileDescriptor.getFileExtension())).build();
}

@Path("/{userId}/avatar")
@PUT
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public Response updateUserAvatar(
@PathParam("userId") int userId,
byte[] image,
@QueryParam("extension") @DefaultValue("jpg") String extension
)
{
FileDTO newFile = fileService.saveAvatar(userId, image, "avatar", extension);
userService.updateUserAvatar(userId, newFile.getFileName());

return Response.ok().build();
}

(..)

}
application.java
“java est certainement meilleur que vous pouvez le penser!”
-Guillaume Cauchon, 2013
maintenant; du code...
SOAP : ancienne couche de services toujours en utilisée par nos interfaces utilisateurs en Flex

events : exécution asynchrone

Mirth : ESB permettant de découpler les interactions avec les 3rd parties. Les échanges sont souvent basé sur la norme HL7.

realtime : Node.js + Socket.IO + Redis
Database performance strategies : cluster vs. sharding vs. split schema vs. externalizer une partie du schema dans d’autre engine de stockage plus approprié. (key-value, documents, etc…)

Authentication/Authorization : revoir notre implementation actuelle pour la remplacer par un standard actuel OAuth plus versatile.

Cache de niveau 2 (Infinispan) : Isoler la couche DB de la logique d’affaire même dans un contexte de cluster des serveurs applictifs ET des serveurs de base de données.
Advanced Message Queuing Protocol (AMQP) : remplacer le pub-sub de Redis par un protocole qui garantie la livraison, même dans un cluster.

Undertow : support les HTTP upgrade + Web Sockets; remplacer Node.js/Socjet.IO pour simplifier notre stack!

Metadata engine : pour limiter les exécutions répétitives directement sur la donnée transactionnelle.

Tirer profit de la JVM avec des processes fonctionnels (i.e Scala)
Futur...
Full transcript