Greach 2011 - Ringio, o como hacer realidad una aplicación de telefonía con Grails
-
Upload
greaches -
Category
Technology
-
view
1.283 -
download
0
description
Transcript of Greach 2011 - Ringio, o como hacer realidad una aplicación de telefonía con Grails
Mamen González4 Noviembre 2011
Ringio o cómo hacer realidad una
aplicación de telefonía en Grails
ÍNDICE
1. ¿Qué es Ringio?
2. Características
3. Ringio en acción
4. Arquitectura
5. Evolución de la arquitectura: Ringio over Rayo
6. Ventajas de RoR
7. ¿Por qué Grails?
8. Conclusiones
1 - ¿Qué es Ringio?
3
Ringio es una centralita telefónica virtual, integrada con CRMs, que ayuda a las PYMES a
mejorar la calidad de atención al cliente.
2 - Características
4
- Producto SaaS en la nube
- Configurable a través de la web
- Aplicaciones para escritorio y smartphones
- Permite utilizar cualquier teléfono
- Integración con CRMs y redes sociales
- Control de llamada (Call Control) y Respuesta de Voz Interactiva (IVR)
- Evita que se pierdan llamadas: callblast
3 – Ringio en acción (1/2) – Llamada entrante
http://www.screencast.com/t/EqQz2ElaZD
3 – Ringio en acción (2/2) – Llamada saliente
http://www.screencast.com/t/dFIVFNSfpz
Ringio Clients
CRM plugins
4 – Arquitectura
7
Ringio Core
BDAPI REST
Aplicación CCXML
Servidor ejabberd
Aplicaciones cliente móvil & escritorio
Ringio Server
HTTP
XMPP
Ringio Core
BD
Ringio Server
HTTP
XMPP
Servidor ejabberd
5 – Evolución de la arquitectura: Ringio over Rayo
8
Ringio over Rayo
Ringio Core
BD
Aplicación CCXML
Ringio Server
HTTP
Servidor ejabberd
JSR 309 JSR 289
server
clientXMPP
XMPP
6 – Ventajas de RoR
9
call.answer()
call.output(‘Hello Greach!’)
call.input(ringioMainMenuInput)
call.disconnect()
call.hold()
call.mute()
outgoingCall.join()
call.isHold()
call.unMute()
call.isMute()
call.unHold()
Call controlen Groovy / Java
Abstracción de los detalles de implementación
Facilita el desarrollo y la depuración
No es necesario utilizar CCXML / VoiceXML
<transition event="personal"> <var name="srcParticipant" expr="getSourceParticipant(participants)"/> <var name="dstParticipant" expr="getDestinationParticipant(participants)"/> <if cond="srcParticipant.isBlackListed"> <dialogstart src="blackDlgPath()" type="TYPE" dialogid="blacklistedDlg" connectionid="getSrcConnId(participants)" parameters="voxeoUrls"/> <assign name="state" expr="'release'"/> <elseif cond="srcParticipant.isVIP && dstParticipant.isCheckedIn"/> <dialogstart src="welcomeDlgPath()" type="TYPE" dialogid="welcomeDlg" connectionid="getSrcConnId(participants)" parameters="participants extensionSelected voxeoUrls"/> <assign name="state" expr="'waitingForUser'"/> <elseif cond="!dstParticipant.isIdle || !dstParticipant.isCheckedIn"/> <dialogstart src="userNotAvailPath()" type="TYPE" dialogid="userNotAvailableDlg" connectionid="getSrcConnId(participants)" parameters="participants voxeoUrls"/> <assign name="state" expr="'vmailorcallback'"/> <else/> <dialogstart src="welcomeDlgPath()" type="TYPE" dialogid="welcomeDlg" connectionid="getSrcConnId(participants)" parameters="participants extensionSelected voxeoUrls"/> <assign name="state" expr="'waitingForUser'"/> </if> </transition>
Flujo más legible
7 – ¿Por qué Grails? (1/5)
10
Desarrollo más ágil
• Scaffolding
• Convención sobre configuración
• Facilidades para configuración de entornos
• Se escribe menos en Groovy que en Java
7 – ¿Por qué Grails? (2/5)
11
Facilidad para crear servicios JSON
• En Ringio hacemos un uso extenso de JSON (comunicaciones con Voxeo, con aplicaciones desktop / móvil, API REST…)
• parsers y converters de Grails:
render. participant as JSONJSON.parse(response)
7 – ¿Por qué Grails? (3/5)
12
Sistema de plugins
• El plugin ringobon-base contiene el modelo de datos y los servicios básicos.
• El módulo Ringio Server está dividido en varios submódulos independientes que utilizan ese plugin.
7 – ¿Por qué Grails? (4/5)
13
Acceso a librerías Java
• Se pueden usar APIs Java
• En Ringio usamos, entre otras:
XMPP, Google Contacts, Voxeo Rayo…
7 – ¿Por qué Grails? (5/5)
14
GORM
• Facilidades para realizar consultas mediante Criteria, Dynamic finders o HQL. Ejemplos:
User.findAllByAccount(account)
Conversation.findAll()
• Facilidades para almacenar datos de auditoría (fechas de creación, actualización…)
8 – Conclusiones
15
Nuestra experiencia con Grails ha sido muy satisfactoria.
ágiles desarrollando
rápidos en la adaptación a los cambios
De ahí que en Paradigma Tecnológico se hayan implementado más proyectos en Grails
16
Q&A
17
¡¡Gracias!!@gmamenl@mpermar