KELA Presentacion Costa Rica 2024 - evento Protégeles
Greach 2011 - Ringio, o como hacer realidad una aplicación de telefonía con Grails
1. Ringio o cómo hacer realidad una
aplicación de telefonía en Grails
Mamen González
4 Noviembre 2011
2. Í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
3. 1 - ¿Qué es Ringio?
Ringio es una centralita telefónica
virtual, integrada con CRMs, que ayuda a las
PYMES a mejorar la calidad de atención al
cliente.
3
4. 2 - Características
- 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
4
8. 5 – Evolución de la arquitectura:
Ringio over Rayo BD
Ringio
BD Server Servidor
ejabberd
XMPP
Ringio Servidor
HTTP
ejabberd
Server Ringio over Rayo
XMPP
client
XMPP
server
Aplicación
HTTP CCXML JSR 309 JSR 289
Ringio Core Ringio Core
8
9. 6 – Ventajas de RoR
<transition event="personal">
<var name="srcParticipant" expr="getSourceParticipant(participants)"/>
No es necesario
<var name="dstParticipant" expr="getDestinationParticipant(participants)"/> utilizar CCXML /
<if cond="srcParticipant.isBlackListed">
call.output(‘Hello Greach!’)
<dialogstart src="blackDlgPath()" type="TYPE" dialogid="blacklistedDlg" VoiceXML
connectionid="getSrcConnId(participants)" parameters="voxeoUrls"/>
<assign name="state" expr="'release'"/> call.hold()
<elseif cond="srcParticipant.isVIP && dstParticipant.isCheckedIn"/> Flujo más legible
call.input(ringioMainMenuInput)
<dialogstart src="welcomeDlgPath()" type="TYPE" dialogid="welcomeDlg"
connectionid="getSrcConnId(participants)" parameters="participants
extensionSelected voxeoUrls"/> call.disconnect()
<assign name="state" expr="'waitingForUser'"/>
Call control
call.isHold() cond="!dstParticipant.isIdle || !dstParticipant.isCheckedIn"/>
call.answer()
<elseif en Groovy / Java
<dialogstart src="userNotAvailPath()" type="TYPE"
outgoingCall.join()
call.isMute()
dialogid="userNotAvailableDlg" connectionid="getSrcConnId(participants)"
parameters="participants voxeoUrls"/> Abstracción de
call.unHold()
call.mute() name="state" expr="'vmailorcallback'"/>
<assign
<else/> los detalles de
call.unMute()
<dialogstart src="welcomeDlgPath()" type="TYPE" dialogid="welcomeDlg"
implementación
connectionid="getSrcConnId(participants)" parameters="participants
extensionSelected voxeoUrls"/>
<assign name="state" expr="'waitingForUser'"/> Facilita el
</if>
</transition> desarrollo
y la depuración
9
10. 7 – ¿Por qué Grails? (1/5)
Desarrollo más ágil
• Scaffolding
• Convención sobre configuración
• Facilidades para configuración de entornos
• Se escribe menos en Groovy que en Java
10
11. 7 – ¿Por qué Grails? (2/5)
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 JSON
JSON.parse(response)
11
12. 7 – ¿Por qué Grails? (3/5)
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.
12
13. 7 – ¿Por qué Grails? (4/5)
Acceso a librerías Java
• Se pueden usar APIs Java
• En Ringio usamos, entre otras:
XMPP, Google Contacts, Voxeo Rayo…
13
14. 7 – ¿Por qué Grails? (5/5)
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…)
14
15. 8 – Conclusiones
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
15