<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7054420788675814404</id><updated>2011-12-20T03:53:08.812-08:00</updated><category term='plugings'/><category term='clustering'/><category term='msc api'/><category term='seam'/><category term='JAIN SLEE'/><category term='jboss seam'/><category term='mobicents'/><category term='pbx'/><category term='sip'/><category term='application routing'/><category term='conference'/><category term='fault tolerance'/><category term='geographical'/><category term='load balancer'/><category term='conferencing'/><category term='devoxx08'/><category term='red hat summit'/><category term='balancing'/><category term='jbossworld'/><category term='devoxx'/><category term='compliance'/><category term='ipbx'/><category term='phone plugin'/><category term='sip servlets'/><category term='eclipse'/><category term='ivr'/><category term='jsr-289'/><category term='jruby'/><category term='redundancy'/><category term='eclipslee'/><category term='media server'/><category term='ide'/><title type='text'>Vladimir Ralev's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-6579768866152336642</id><published>2011-12-15T08:45:00.001-08:00</published><updated>2011-12-20T03:53:08.820-08:00</updated><title type='text'>Meanwhile, in Russia...</title><content type='html'>&lt;img style="border:0;display:block;margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://4.bp.blogspot.com/-St3qDKYMqw4/Tu39rQo_2LI/AAAAAAAAAIo/0RbXhQbuP6o/s1600/meanwhile-in-russia-come-here-you-bastard.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Back from the Mobicents Community Summit 2011 - Sochi, Russia. Very untraditional place for a conference, but Oleg made it work for us despite the logistic nightmare. Technically the meeting was in Krasnaya Polyana, which is the winter resort place for the 2014 winter olympics, but other than being remote and very cold it doesn't really shine with anything at the moment. And there is a waterfall. The &lt;span style="font-style:italic;"&gt;summer capital of Russia -&lt;/span&gt; Sochi was better, although I almost checked myself into a mental hospital in the middle of nowhere due to booking.com map glitch and poor travel guides.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;hr/&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="border:0;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 97px;" src="http://2.bp.blogspot.com/-KtjNFhNSHIo/Tu8gzqSafxI/AAAAAAAAAI0/m_uOokAJ1Ck/s400/telestax_logo_small.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5687800926289166098" /&gt;&lt;div style="text-align: justify;"&gt;The highlights from the conference include a couple of big moves from the business side: &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;Ivelin officially announced &lt;a href="http://www.telestax.com/"&gt;Telestax&lt;/a&gt; will be taking over the commercial support from Red Hat, which will no longer provide JBCP support. &lt;/li&gt;&lt;li&gt;Part of the Mobicents team left Red Hat, the main Sip Servlets team including me and the project leader Jean in particular. This should be good news for long-term Sip Servlets users who can be sure Telestax has the same support capacity in terms of talent plus more due to new hires. Any past investments in Mobicents Sip Servlets products should be well covered by Telestax in the future. &lt;/li&gt;&lt;li&gt;SS7 appears very strong with Amit who is also moving to Telestax.&lt;/li&gt;&lt;li&gt;Telestax also builds teams in the community for other Mobicents projects.&lt;/li&gt;&lt;/ul&gt;This spin-off occurs precisely at the peak of the community and customer interest. It looks like Telestax really has a shot now at becoming a success story in the telco market if it plays the cards right. In theory, Telestax should be able to perform much better without the JBCP restrictions by building quickly on top of what was learned in the past few years. I personally am not joining Telestax yet, but I will be helping there one way or another once I get some time off and sort through my options.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I also had to cover some of my own topics in the conference. &lt;a href="https://docs.google.com/present/view?id=dc5jp5vx_252hp8256g2"&gt;These&lt;/a&gt; are the updated slides for the load balancer with a new roadmap. Didn't have much time to prepare because I was in Istanbul, but I pulled off a &lt;i&gt;&lt;a href="http://www.youtube.com/watch?v=fXZj4Wy58Pk"&gt;fuck it, we'll do it live&lt;/a&gt; &lt;/i&gt; :). I will be refining the slides further to reflect the discussions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-6579768866152336642?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/6579768866152336642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=6579768866152336642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/6579768866152336642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/6579768866152336642'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2011/12/meanwhile-in-russia.html' title='Meanwhile, in Russia...'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-St3qDKYMqw4/Tu39rQo_2LI/AAAAAAAAAIo/0RbXhQbuP6o/s72-c/meanwhile-in-russia-come-here-you-bastard.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-2409273783187434212</id><published>2011-03-05T13:17:00.000-08:00</published><updated>2011-03-19T08:32:59.013-07:00</updated><title type='text'>Bridging SIP videophones to RTSP providers</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Just a quick post about trying to bridge SIP video phones to RTSP video content providers. The goal is to enable SIP phones to display audio and video from regular RTSP providers such as &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;. Even though SIP and RTSP have nothing to do with each other, they carry SDP inside the messages, so it shouldn't be too hard to make them talk to each other.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size:130%;"&gt;App overview&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To achieve the goal here we will need a SIP stack, RTSP stack and potentially an RTP stack. For SIP we'll use &lt;a href="http://www.mobicents.org/"&gt;Mobicents&lt;/a&gt; Sip Servlets, for RTSP we can use &lt;a href="http://www.jboss.org/netty"&gt;JBoss Netty&lt;/a&gt; where the RTSP codecs were contributed by Mobicents Media Server team. RTP is really optional, because we should be able to wire the client and the RTSP server to talk directly with each-other RTP and there is no need the app server to understand what's going on.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-6Hm2ddigfUs/TYTL1oMC_bI/AAAAAAAAAGo/XdIWhm2doAU/s1600/RTSP-bridge.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;border:0;" alt="" id="BLOGGER_PHOTO_ID_5580711223113966850" border="0" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Basically a Sip Servlets application will initiate RTSP play sequence for each INVITE transaction and it will tear down the RTSP session when the client disconnects with a BYE.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Simple enough. Let's see the code we need:&lt;/div&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;    protected void doInvite(SipServletRequest request) throws ServletException,&lt;br /&gt;            IOException {&lt;br /&gt;        &lt;br /&gt;        RTSPStack rtsp = new RTSPStack();&lt;br /&gt;        &lt;br /&gt;        // Try to take RTSP URI from the SIP request &amp;quot;To&amp;quot; header&lt;br /&gt;        String rtspParameter = request.getTo().getURI().getParameter(&amp;quot;rtsp&amp;quot;);&lt;br /&gt;        if(rtspParameter == null) {&lt;br /&gt;            rtspParameter = request.getRequestURI().getParameter(&amp;quot;rtsp&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        if(rtspParameter != null) {&lt;br /&gt;            rtsp.uri = &amp;quot;rtsp://&amp;quot; + rtspParameter;&lt;br /&gt;        }&lt;br /&gt;         .. SDP pre-processing..&lt;br /&gt;&lt;br /&gt;        rtsp.init(); // start the OPTIONS, DESCRIBE, SETUP, PLAY sequence&lt;br /&gt;        &lt;br /&gt;         .. SDP post-processing ..&lt;br /&gt;&lt;br /&gt;        sipServletResponse = request.createResponse(SipServletResponse.SC_OK);&lt;br /&gt;        sipServletResponse.setContent(rtsp.sdp, &amp;quot;application/sdp&amp;quot;);&lt;br /&gt;        sipServletResponse.send();&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size:130%;"&gt;Negotiating the SDP&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-b4ezdjyr2pw/TXKw9idtZII/AAAAAAAAAGA/a2kdRyxPV5k/s1600/Screen%2Bshot%2B2011-03-05%2Bat%2B11.43.38%2BPM.png"&gt;&lt;img src="http://4.bp.blogspot.com/-b4ezdjyr2pw/TXKw9idtZII/AAAAAAAAAGA/a2kdRyxPV5k/s400/Screen%2Bshot%2B2011-03-05%2Bat%2B11.43.38%2BPM.png" style="text-align: justify;float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 10px; cursor: pointer; width: 400px; height: 244px; " alt="" id="BLOGGER_PHOTO_ID_5580717459535389826" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;The SDP used by normal SIP phones is slightly different from the SDP used by most RTSP servers, but it is close enough. If your phones and RSTP servers know exactly the same codecs and payload types, the integration would be effort-less. For YouTube it requires a few pre- and post-processing steps on both sides:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Extract the audio and video RTP socket port numbers from the client SDP advertised in the INVITE&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Translate the SDP the the RTSP server returns. The Wireshark screenshot on the right shows the captures RSTP SDP (note the track information and the way ports are shown in the RTSP response).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;One big challenge for all this to work is to have a phone that understands the standard RTSP codecs used by many RTSP providers. Most commonly those are AMR/G722.2 for audio and H263-2000 for video advertised with the following RTP map:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;a=rtpmap:99 AMR/8000/1&lt;br /&gt;a=rtpmap:98 H263-2000/90000&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Unfortunately, neither of these codecs is supported by any free SIP phone making it very difficult to build a one-for-all solution and test it without transcoding through a media server. Transcoding should be avoided, because it adds great computational complexity and difficulties with the project scalability.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size:130%;"&gt;Matching the RTP/SDP payload type&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Even without transcoding, apparently, very often you will have to deal with RTP payload number incompatibility. IANA assigns the standard RTP payload types &lt;a href="http://www.iana.org/assignments/rtp-parameters"&gt;over here&lt;/a&gt;. RTSP from YouTube uses the dynamic payload type range (96-127) where the numbers don't correspond strictly to particular codec and it is up to the phones to interpret it correctly with codec name string matching or some other method. This can also be be compensated for in the SIP server side. If you have phones that understand exactly the same payload types as the RTSP server, then great - no extra work is needed. If not, you will want to convert the types.&lt;br /&gt;&lt;br /&gt;To allow payload type modification we will need to bring the app server back in the RTP traffic to translate the RTP. We don't need a media server for this, just a very light-weight stack to pass-thru the RTP traffic. I added the &lt;span style="font-style: italic;"&gt;RTPPacketForwarder&lt;/span&gt; class to the project which can be managed by the &lt;span style="font-style: italic;"&gt;RTSPStack&lt;/span&gt;. Basically it binds sockets on both interfaces on the server and forwards the RTP packets unchanged except for the payload type which can optionally be overwritten to match the payload number required by the phone. Note that, when payload number modification is required the SDP must also be adapted in the Sip Servlets app to advise both the phone and the RTSP server to talk to the ports owned by the &lt;span style="font-style: italic;"&gt;RTPPackerForwarder&lt;/span&gt;.&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-5owSXCqlGkQ/TYTL-yMnd-I/AAAAAAAAAGw/DcZjNUbTLfg/s1600/RTSP-bridge-NAT.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;border:0;" src="http://1.bp.blogspot.com/-5owSXCqlGkQ/TYTL-yMnd-I/AAAAAAAAAGw/DcZjNUbTLfg/s1600/RTSP-bridge-NAT.png" alt="" id="BLOGGER_PHOTO_ID_5580722177463056770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size:130%;"&gt;NAT/firewall problems&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;SIP already has means for NAT traversal but for RTP it's a different story. There are two cases here - a firewall between the client and MSS or a firewall between MSS and the RTSP server. In the first case it would be responsibility of the SIP client to work around it. In the second case this means our server will have to implement at least a dumb RTP stack to pass packets from one side of the firewall to the other - a modification to the &lt;span style="font-style: italic;"&gt;RTPPacketForwarder&lt;/span&gt; would enabled this. The &lt;span style="font-weight: bold; font-style: italic;"&gt;stun4j&lt;/span&gt; module is added to the project to allow STUN lookup of the addresses if needed. That would once again require extra SDP modification to change the port numbers and addresses. The good news is that this is not required in many cases, because a good number of firewalls will do application layer gateway-ing or simply forward certain port ranges to the computer behind the firewall automatically or after asking the router to do it.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size:130%;"&gt;Code&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The example is available in the Mobicents SVN, you will probably need to customize it for particular SIP phone and RTSP provider depending on the supported codecs and network topology. By default it is configured for YouTube.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;svn co http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-examples/sip-rtsp-gateway&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-2409273783187434212?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/2409273783187434212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=2409273783187434212' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2409273783187434212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2409273783187434212'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2011/03/bridging-sip-videophones-to-rtsp.html' title='Bridging SIP videophones to RTSP providers'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-6Hm2ddigfUs/TYTL1oMC_bI/AAAAAAAAAGo/XdIWhm2doAU/s72-c/RTSP-bridge.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-3631076117980798194</id><published>2010-11-27T07:20:00.000-08:00</published><updated>2010-11-29T01:40:04.646-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='application routing'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='clustering'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Sip Servlets Application Routing Guidelines and Best Practices</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sip Servlets 1.1 enjoys great adoption in the telco industry displacing proprietary and legacy applications. One of the big promises of Sip Servlets 1.1 is the application (WAR module) composition and isolation provided by the Application Routing feature which is supposed to allow the applications to grow over time independently from each other and orchestrated in different services.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;On the surface...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Application Routing is probably one of the most misunderstood parts of the specification. Misunderstood not in terms of function, but in terms of use and consequences. From JSR-289 application routing is described as a separation of concern concept similar to the &lt;a href="http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern"&gt;Chain of Responsibility Design Pattern&lt;/a&gt; where each application is responsible for it's own small part of the service and can be added or removed on demand. In fact it would often look like a pipeline on your architecture diagrams:&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/__bYtjOSoe5A/TPD-LVevTtI/AAAAAAAAAE4/2r26ywyYGh0/s1600/ARDiagramSimple.png" style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " border="0" alt="" id="BLOGGER_PHOTO_ID_5544210611991170770" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;i&gt;Call Blocking&lt;/i&gt; will check if the &lt;b&gt;Callee&lt;/b&gt; has blocked the &lt;b&gt;Caller&lt;/b&gt; and if so it will reject the call. Otherwise if the the &lt;b&gt;Caller&lt;/b&gt; is not blocked it will just proxy the call to the next app.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;i&gt;Call Forwarding&lt;/i&gt; will forward the call to the &lt;b&gt;Callee&lt;/b&gt; or her voicemail depending on availability status.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;The &lt;i&gt;Voicemail&lt;/i&gt; application (if reached) will act on behalf of the &lt;b&gt;Callee&lt;/b&gt; and it will answer the call to record a message.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Looking great - clear responsibilities for each application, zero coupling, applications are completely unaware of each other, ..&lt;i&gt;blah, blah, blah. Every architect's dream!&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Real World Picture&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;What is not shown in these diagrams however is how it works inside the container with all external entities. JSR-289 mandates that applications communicate with each other through SIP, which means all messages go up and down the stack to reach the next application. Internally, Mobicents and most Sip Servlets containers optimize the message passing by skipping a few stages of the SIP protocol stack, but still you have to do it. And that's not the problem at all. There are a number of things from the real world that are missing in the picture:&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/__bYtjOSoe5A/TPJ2dsR4NPI/AAAAAAAAAFg/OMeQWG1oUd8/s1600/ARDiagram.png" style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " border="0" alt="" id="BLOGGER_PHOTO_ID_5544214974484132962" /&gt;&lt;div style="text-align: justify;"&gt;Each application creates it's own application session. The B2BUA application creates two Sip Sessions while the Proxy and the UAS application create one session each. Additionally if the container operates with dialogs it will create 2, 3 or 4 dialog representations. Sip Servlets applications have no awareness of the SIP dialogs and have no references to dialogs directly but they are in the memory. The Sip Servlets specification says that dialogs roughly correspond to &lt;i&gt;SipSessions&lt;/i&gt;, which is true from application point of view, but in SIP terms the dialog spans from UAC to UAS through any proxies in the way, thus in the best case it is possible two or more sessions to share the same dialog instance if they are on the same machine.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;So what's the big deal? The applications care only about their own state and not the other application's state, right?&lt;/i&gt; Not exactly. To maintain the call internally, the containers keep references to a number of objects that represent the transactions or the the application routing chain in some way. SipApplicationSessions have timers associated with them and so do the SIP client and server transactions. B2BUA and proxy implicitly have to keep the associated inbound and outbound requests/responses. There are also a number of properties that users can specify and are maintained in memory. That's just for empty sessions. Once the developers start adding session attributes independently for each app, it is almost certain that they will have duplicate data.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In real-world applications most of the data would be somewhere in persistent storage such as a database. The data would be queried and loaded in the sessions by the applications. Because the applications can't share state they will have to query the database independently and very likely transfer and use duplicate data like the user profiles and preferences. Note that I am not assuming that it has to be that way. You may be able to organize the data and the queries not to transfer redundant data, but this is very hard to do correctly over time and especially when you need to have separate Web UI to access the data. It is just better to make one network request than many.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;On top of that if you took advantage of the application router properly it may also query the database, especially since it is responsible for assigning subscriber identity and function selection.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To summarize what we got so far for a single call in this 3-app service:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;4 times &lt;i&gt;SipSession&lt;/i&gt; with attributes and properties&lt;/li&gt;&lt;li style="text-align: justify;"&gt;3 times &lt;i&gt;SipApplicationSession&lt;/i&gt; with attributes and properties&lt;/li&gt;&lt;li style="text-align: justify;"&gt;2 times &lt;i&gt;SIPDialog&lt;/i&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Whatever transactions are in progress multiplied by at least 3 (client and server)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;3 times the timers&lt;/li&gt;&lt;li style="text-align: justify;"&gt;3 times JDBC over the network, once for each app, each in separate DB transaction&lt;/li&gt;&lt;li style="text-align: justify;"&gt;3 times call the &lt;i&gt;getNextApplication()&lt;/i&gt; to the application router, each potentially querying the database again&lt;/li&gt;&lt;li style="text-align: justify;"&gt;..and I am probably forgetting something&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Fault tolerance&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;When you account for the fault-tolerance, you need to have at least one replica of the above state. Replication occurs all the time continuously and has very serious additional consequences for memory, network traffic and CPU utilization. Application Routing also amplifies any gaps in time where a failure is unrecoverable depending on the replication policy.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/__bYtjOSoe5A/TPENAFcsG9I/AAAAAAAAAFQ/ioDXsoBicyQ/s1600/ARDiagramReplication.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5544226911383460818" style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In the end, with or without fault tolerance, having this service implemented in 3 applications probably costs around 3 times more in terms of consumed hardware, development/testing and has much slower response time compared to a monolithic application that does the same with simple &lt;i&gt;if .. then .. else &lt;/i&gt;statements. Application chaining doesn't look like such a good idea any more.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Converged HTTP applications spaghetti&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Unlike SIP, HTTP servlet applications do not allow composition. Usually each SIP application would have some sort of Web UI in the same WAR module allowing users and administrators to configure the system or user profiles. Do you really want your service to have 3 different entry-points of configuration? Block users from one app, configure forwarding in another and set the voicemail greeting in a third app. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;One option would be to use a Java Portal (JSR-168 or JSR-286 with WSRP) portlets to combine the UI. That may or may not work. I am not going to cover the limitations of Java Portals, but the fact is that it has some limitations, greater complexity, performance penalty and so on. If you turn on and off application from the application router, your application router will have to update the portal configuration to reconfigure the UI.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In most cases you will have a separate Web UI application that is aware of the schema used by all 3 applications, which limits the potential of the SIP applications to grow independently from each other. A modification in one app may force a change in your Web UI app.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;No matter which way you go, there will be a chain of dependencies that your applications or the application router should be aware of, which breaks the promise of isolation to some extent.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;Application Composition is not a design pattern&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;You shouldn't design or plan your service to be in different applications. Sip Servlets application composition is not a chain of responsibility implementation. Applications are &lt;b&gt;deployment units&lt;/b&gt;, not architectural building blocks. You don't design your Web Services specifically to be orchestrated with BPEL and certainly not with a particular BPEL implementation. Just like application routing, BPEL's power is in the integration.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Application composition is probably best fit for unrelated services from different vendors that consume different databases and in most cases run without being chained together with other applications. Application routing is OK as long as the actual application chaining is rare and applications are self-sufficient as individual services that have a single Web access point.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In that sense, application routing can also be used as a cheap rolling upgrade technique - just switch the requests to a new application and the new sessions will arrive in your new app while the old sessions will continue to go to the old app until they finish. AFAIK this will work on any container.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In conclusion, if you are an architect or developer you should forget that application routing exists. It is sysadmin job to reconfigure applications if they see fit or have no other choice.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-3631076117980798194?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/3631076117980798194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=3631076117980798194' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/3631076117980798194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/3631076117980798194'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2010/11/application-routing-guidelines-and-best.html' title='Sip Servlets Application Routing Guidelines and Best Practices'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__bYtjOSoe5A/TPD-LVevTtI/AAAAAAAAAE4/2r26ywyYGh0/s72-c/ARDiagramSimple.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-7303947503965481681</id><published>2010-10-15T01:01:00.000-07:00</published><updated>2010-10-15T03:00:44.001-07:00</updated><title type='text'>Another crazy year with Mobicents...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__bYtjOSoe5A/TLgQOc5CCFI/AAAAAAAAAEg/OpyA-xymUsc/s1600/Screen+shot+2010-10-15+at+11.22.27+AM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;border: 0;" src="http://2.bp.blogspot.com/__bYtjOSoe5A/TLgQOc5CCFI/AAAAAAAAAEg/OpyA-xymUsc/s1600/Screen+shot+2010-10-15+at+11.22.27+AM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5528186383056898130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;More than 20 releases in the past year, 6000+ revisions, almost 1000 tracker issues, airline miles to go many times around the world, and here we are in Belek, Antalya just 500km from my home town.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;iframe width="695" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;amp;t=h&amp;amp;ll=39.53794,29.399414&amp;amp;spn=11.854942,32.958984&amp;amp;z=5&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/?ie=UTF8&amp;amp;t=h&amp;amp;ll=39.53794,29.399414&amp;amp;spn=11.854942,32.958984&amp;amp;z=5&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Thanks to Eduardo for arranging this exceptional venue for us.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This year for the first time we had the whole team together from all over the world - USA, Europe, Asia, Australia, and also for a first time customers and users were invited to attend the technical sessions.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We had a very tight agenda, but even so a couple of extra sessions were added due to demand. Eventually, we were able to focus the agenda on the most interesting topics and had a lot of discussions on each project. It was a great very productive meeting with lots of impact on the roadmaps and the direction of the projects.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I had a talk dedicated on general clustering, which is a key topic for all projects and easily generates even more discussions. My slides are here, but I should probably annotate them a bit more, if you have any questions ask away:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;iframe src="https://docs.google.com/present/embed?id=dc5jp5vx_247g8tvkfdh&amp;amp;size=l" frameborder="0" width="700" height="559"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://docs.google.com/present/view?id=dc5jp5vx_247g8tvkfdh"&gt;This&lt;/a&gt; is the version for fullscreen viewing. The rest of the slides will be available in our Antalya directory in google docs &lt;a href="https://docs.google.com/#folders/folder.0.0BywyxCyoPtynNjRhYTQ5NDMtMTA3Yi00NDBkLWI0M2QtOTdlZDRkNjEyZTEy"&gt;over here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__bYtjOSoe5A/TLggP6D6cfI/AAAAAAAAAEo/rjot_ZR7jOQ/s1600/meetingroom.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;border:0;" src="http://4.bp.blogspot.com/__bYtjOSoe5A/TLggP6D6cfI/AAAAAAAAAEo/rjot_ZR7jOQ/s1600/meetingroom.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5528204000253080050" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Great meeting, great party!&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a week in the paradise I also got to "enjoy" an extra stay is this &lt;a href="http://www.tripadvisor.com/Hotel_Review-g293974-d296336-Reviews-Sevcan_Hotel-Istanbul.html"&gt;hotel&lt;/a&gt; when I missed my flight in Istanbul. Excellent choice if you need to catch up with reality :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-7303947503965481681?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/7303947503965481681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=7303947503965481681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7303947503965481681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7303947503965481681'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2010/10/another-crazy-year-with-mobicentsdraft.html' title='Another crazy year with Mobicents...'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__bYtjOSoe5A/TLgQOc5CCFI/AAAAAAAAAEg/OpyA-xymUsc/s72-c/Screen+shot+2010-10-15+at+11.22.27+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-9146669528556542298</id><published>2010-04-16T16:16:00.000-07:00</published><updated>2010-04-22T13:54:18.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='fault tolerance'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='geographical'/><category scheme='http://www.blogger.com/atom/ns#' term='redundancy'/><category scheme='http://www.blogger.com/atom/ns#' term='clustering'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>The dreaded so-called "geographical failover" and SIP</title><content type='html'>&lt;div&gt;&lt;div style="text-align: justify;"&gt;This interesting requirement just keeps popping-up in the middleware world and is a topic of many threads in developer discussions as we are designing our HA architecture to be adequate and performant. The problem stems from a common deployment architecture where you have two or more data-centers in distant geographical locations (think WAN distance, where LAN is not possible) . Each data-center site has the same service deployed, but is responsible for serving only the requests from their geographical area. All data centers are independently fault-tolerant, but if one site goes down for any reason, this would cause service outage in the area it is supposed to cover.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Geographical failover&lt;/b&gt; usually refers to being able to temporary redirect the requests to other more distant data-center sites when a local total data-center failure occurs. Even if it is slower or more expensive, it is better than a completely unavailable service.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;This problem is common for HTTP and SIP, and the strategies to solve it are very similar. The challenge is in two aspects:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 153, 0);"&gt;&lt;b&gt;Load balancing.&lt;/b&gt;&lt;/span&gt; Obviously, you need to make sure your local load balancers survive the data center failure. There are many ways this can done, but commonly you can just host the load balancers somewhere close to the users and keep it isolated from the data center. You should also make sure there is enough backup power and network infrastructure to keep them alive for a few hours or days.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__bYtjOSoe5A/S9AkffzsUHI/AAAAAAAAAEM/8NeunL7u3p4/s1600/lbdata.gif"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 286px; height: 235px;border:0px;" src="http://4.bp.blogspot.com/__bYtjOSoe5A/S9AkffzsUHI/AAAAAAAAAEM/8NeunL7u3p4/s400/lbdata.gif" alt="" id="BLOGGER_PHOTO_ID_5462906471533269106" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In Mobicents and JBCP, we introduced &lt;a href="http://vladimirralev.blogspot.com/2009/10/mobicents-sip-load-balancing.html"&gt;pluggable algorithms&lt;/a&gt; for the SIP/HTTP converged load balancer, and it is not hard at all to come up with a working solution. For instance, the load balancer algorithm may have two lists of server nodes - local nodes and distant nodes. If and only if all local application server nodes are dead, then the load balancer can start routing to the distant nodes. Plain and simple.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;If you are using a distributed load balancer (&lt;i&gt;shown in the figure on right&lt;/i&gt;), one per site, it will behave the same way, and you may have several additional options depending on the IP load balancer capabilities.&lt;div style="text-align: center;"&gt;&lt;a onblur="try  {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__bYtjOSoe5A/S9AZTA_KVSI/AAAAAAAAAEE/zCwY_i-KfZQ/s1600/lbdata.gif"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__bYtjOSoe5A/S9AZTA_KVSI/AAAAAAAAAEE/zCwY_i-KfZQ/s1600/lbdata.gif"&gt;&lt;/a&gt;As long as the SIP load balancers are aware of the topology, the IP load balancer doesn't have to be aware of the other data-centers. It might be possible to instruct the IP load balancer to route requests to the backup data-center site, but the mechanism doesn't depend on it.&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 153, 0);"&gt;&lt;b&gt;State Replication&lt;/b&gt; (a.k.a &lt;i&gt;What happens with the ongoing calls after the failure?&lt;/i&gt;). &lt;/span&gt;In the case of complete data-center failure, the whole LAN cluster will go down. Let's first take a look at the case where Mobicents nodes only replicate state within the data-center network.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__bYtjOSoe5A/S8-rSZULDqI/AAAAAAAAAD8/W7UgTJ2hxb4/s1600/datacenters2.gif"&gt;&lt;img style="cursor: pointer; border: 0px none;" src="http://2.bp.blogspot.com/__bYtjOSoe5A/S8-rSZULDqI/AAAAAAAAAD8/W7UgTJ2hxb4/s1600/datacenters2.gif" alt="" id="BLOGGER_PHOTO_ID_5462773205545193122" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;The ongoing calls are likely to have some state associated with them and this state will be lost without replication. Unlike HTTP, in SIP the containers generally do not deliver requests to the applications if their dialog state doesn't exist in the protocol stack. SIP has strict rules about the state machines in the dialogs and transactions, thus the overall consistency depends on that state. All SIP requests sent after the failure would not succeed and the calls are technically lost. But, let's look at what exactly happens with lost calls in the following cases:&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Simple media calls, audio or video calls - once the SDP exchange is complete the users can hear each-other and have a normal call without any SIP messages. So the failure in the SIP server will not affect them at all. As long as the Media Server is alive or the Media is flowing directly between the User Agents, the call will be fine. When the users hang-up, the BYE is lost, but it won't matter any more, because the call is over. Unless you need to capture the BYE and do some logic, you will be fine after the failure.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;SIP-intensive applications - presence, chat, some IVR applications and so on. In these cases the application will fail due to the lost state.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Being aware of the limitations, lets see what are the options of for state replication between data-centers.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First, you have to realize that if you had enough network capacity to replicate the call state to distant nodes, you could just organize all nodes in small JBoss clusters where the nodes are from different geographical areas. JBoss already has a lot of settings in &lt;a href="http://www.jboss.org/jbosscache"&gt;JBoss Cache&lt;/a&gt;/&lt;a href="http://www.jboss.org/infinispan"&gt;Infinispan&lt;/a&gt; and &lt;a href="http://www.jgroups.org/"&gt;JGroups&lt;/a&gt; to fine-tune the connections, even if there is no dedicated feature for geography.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Thus, let's assume you don't have enough bandwidth for that. At this point it is very-application specific, because you must decide what part of the state you can lose. There are several options:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Partial replication per call between the geographical areas - lose some bits from each call&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Rare replication - do the full replication, but only in steady-state calls when changes are unlikely to occur.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Priority calls - pick high priority calls and only replicate them.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;No replication - invest in reducing the risk of complete data center failure. How hard is that? If the data-center is down, but your users are still online, this implies that there is massive working infrastructure somewhere. Moreover, power and network backup resources are available cheaply and they scale well. In fact, I can think of many reasons why the geographical replication methods mentioned above are not a good idea:&lt;/li&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;There may be a noticeable memory impact. In most implementations the local and the geographically replicated call state resides in different memory structures (so double the memory).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;The performance impact may be huge - first because of the additional replication protocol logic in each node and second because your data centers must run at lower utilization to be ready to take the extra load in case of data-center failure.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;Incidentally, the long distance network bandwidth is the most expensive. So you will have to pay for that as well.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;Investing in hardware fault-tolerant resources for your data-center makes the reliability independent of the software. In other words - even cluster-unaware applications will benefit and will be more reliable.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;Even if you recover some SIP state and your SIP applications don't fail, you still need to think how to keep the Media Servers alive or to switch them over to the other data-center.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;Partial replication in general will still produce a lot of lost calls. It is just on best-effort basis.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#336666;"&gt;Application are hard to code and test in partially replicated environment. It is an explosion of cases to be considered and tested when developing.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;In summary, the geographically redundant load balancing is justified and easy to achieve at reasonable price. However state replication between data-centers is too expensive. It is much more efficient to focus on reducing the probablity of data-center failure, which is low anyways. Unless you have some service-specific condition that really fits the model, there is no point in state replication between data-centers.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-9146669528556542298?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/9146669528556542298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=9146669528556542298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/9146669528556542298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/9146669528556542298'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2010/04/dreaded-so-called-geographical-failover.html' title='The dreaded so-called &quot;geographical failover&quot; and SIP'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__bYtjOSoe5A/S9AkffzsUHI/AAAAAAAAAEM/8NeunL7u3p4/s72-c/lbdata.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-7646973651881557343</id><published>2009-10-26T19:51:00.000-07:00</published><updated>2009-11-01T17:03:47.737-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fault tolerance'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='load balancer'/><category scheme='http://www.blogger.com/atom/ns#' term='balancing'/><category scheme='http://www.blogger.com/atom/ns#' term='clustering'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Mobicents SIP Load Balancing</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Check out our SIP Load Balancing (SIP LB) designs and deployment scenarios. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Our goal is to support as many scenarios as possible in a simple way and maintain flexibility for future enhancements and custom load balancing. We look at the load-balancer as a platform where you can implement your own routing decision logic - distributed or standalone, stateful or stateless, layer 3/4 or layer 7, it is all up to you.&lt;br /&gt;&lt;br /&gt;The new load balancer provides quite a few improvements on top of the old one:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Performance &lt;/span&gt;(&gt;1000 cps, but depending on the algorithm)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Flexibility &lt;/span&gt;- pluggable algorithms and customizable algorithms&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fault Tolerance&lt;/span&gt; - multiple smart SIP LBs can work together and nterchangeably in case of failure when sprayed by "dumb" IP load balancers&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Cooperative Load Balancing&lt;/span&gt; - very often, mutliple protocols and sessions are involved in a telco service. Then you need to group calls, HTTP or other protocol sessions to stick together and be failed-over together. Only your application knows the right way to group these sessions, thus sometimes it is crucial to delegate load-balancing decisions to your application. Now, you could implement your own algorithms that take hints or instructions from the applications.&lt;/li&gt;&lt;/ul&gt;For more details you can look at these slides:&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/present/embed?id=dc5jp5vx_89cxdvtxcm&amp;amp;size=l" frameborder="0" height="559" width="695"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Feedback is welcome!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;UPDATE: Revised November 1st, 2009&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-7646973651881557343?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/7646973651881557343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=7646973651881557343' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7646973651881557343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7646973651881557343'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/10/mobicents-sip-load-balancing.html' title='Mobicents SIP Load Balancing'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-4588587442067881180</id><published>2009-10-14T04:29:00.000-07:00</published><updated>2009-10-18T01:46:22.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='pbx'/><category scheme='http://www.blogger.com/atom/ns#' term='ipbx'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Introducing Mobicents IPBX</title><content type='html'>&lt;div style="text-align: justify;"&gt;Many Mobicents community users are already familiar with IPBX, which is complete (and open-source) Media PBX with rich Web User Interface, but it's been on the background for some time due to higher priority tasks. Now with the increased community feedback, we present the new version of IPBX 1.0 CR, which is stable and covers a number of real use-cases. I cannot not mention the guys from &lt;a href="http://manaty.fr/"&gt;Manaty&lt;/a&gt; for their help testing the IPBX and finding/solving a number of problems. But I want to thank all users who gave feedback and reported their experiences.&lt;br /&gt;&lt;br /&gt;For those who are new to IPBX - this is a converged application (meaning it serves several protocols HTTP, SIP, Media/RTP) and as such it provides integrated experience acrosss several technologies. Let's see this short video of what the application really does:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;object type="application/x-shockwave-flash" style="width: 700px; height: 490px;" data="http://www.youtube.com/v/jjHrcezBCgY&amp;amp;autoplay=1"&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;What we see here is users authenticating against the application over HTTP and SIP protocols from Web browsers and SIP Phones respectively. They use the same credentials for both HTTP and SIP, the sessions are related to each other by the users and the state of the calls can be displayed in the Web browser of particular users. Moreover, when users call each-other they participate in the same calls, thus many users may want to see the state of the same call or conference bridge - the IPBX provides that as well.&lt;br /&gt;&lt;br /&gt;Once you are in a call, you can invite more people in a conference, or you can remove participants. When you need to type something, use the conference chat. All participants in the conference will see the messages. The video also shows a function known as &lt;span style="font-style: italic;"&gt;call parking&lt;/span&gt;, which allows you to transfer a call from one phone to another.&lt;br /&gt;&lt;br /&gt;There are many things not shown in this video. When you are getting started you should take a look at the administrative panels (log in as &lt;span style="font-weight: bold; font-style: italic;"&gt;admin&lt;/span&gt;/&lt;span style="font-weight: bold; font-style: italic;"&gt;admin&lt;/span&gt;). Three important features there:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;PSTN Accounts - allows you to call PSTN phones such as mobile and landline phones through a PSTN gateway service provider&lt;/li&gt;&lt;li&gt;PBX Settings - allows you to configure the PBX behaviour, the system announcement files, calling prefix, etc&lt;/li&gt;&lt;li&gt;User Administration - you can edit the user accounts from here&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;It is important to note that once configured, the PBX can operate without any Web User Interface. If you like you can register your phones blindly and start making calls by dialing peers or PSTN numbers (with the prefix). The SIP and Web parts of the application, although implemented by the same application logic can operate independently and still catch-up with each other if you want to log in from the Web UI.&lt;br /&gt;&lt;br /&gt;On the technical side, this application was implemented on top of Mobicents Sip Servlets 1.0 for JBoss AS 4.2.3, &lt;a href="http://groups.google.com/group/mobicents-public/web/seam-telco-framework-for-sip-servlets"&gt;Seam Telco Framework&lt;/a&gt; 2.2, &lt;a href="http://seamframework.org/"&gt;JBoss Seam&lt;/a&gt; and &lt;a href="http://www.jboss.org/richfaces"&gt;Richfaces&lt;/a&gt; with &lt;a href="http://www.jboss.com/products/devstudio/"&gt;JBoss Developer Studio&lt;/a&gt; and &lt;a href="http://vladimirralev.blogspot.com/2009/06/all-mobicents-ide-tools-online.html"&gt;Mobicents Eclipse Plugins&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I really hope this project to gain more developer community interest to help us build the next features on the roadmap. Right now the following features are planned for the near future:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Recording calls&lt;/li&gt;&lt;li&gt;Better UI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Voicemail&lt;/li&gt;&lt;li&gt;Multiline calls&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;There are certainly a lot of other features we'd like to add, and if you have other ideas they are more than welcome.&lt;br /&gt;&lt;br /&gt;There are few other videos, but I will just add this one for the Linux users with another set of phones:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;object type="application/x-shockwave-flash" style="width: 700px; height: 404px;" data="http://www.youtube.com/v/JvsC87nEw0w&amp;amp;autoplay=1"&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Finally, some links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mobicents.googlecode.com/svn/downloads/list/ipbx.zip"&gt;Download &lt;/a&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;- the war and the xml files must be deployed on Mobicents Sip Servlets 1.0 JBoss 4.2.3, which can be &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://sourceforge.net/projects/mobicents/files/Mobicents%20Sip%20Servlets/Mobicents%20Sip%20Servlets%201.0/mss-1.0-jboss-4.2.3.GA-0907231440.zip/download"&gt;downloaded from here&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://mobicents.googlecode.com/svn/downloads/list/ipbx.zip"&gt;.&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mobicents.googlecode.com/svn/trunk/applications/ipbx"&gt;Source Code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobicents.org/mss-ipbx.html"&gt;IPBX Project Homepage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobicents.org/"&gt;Mobicents Homepage&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-4588587442067881180?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/4588587442067881180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=4588587442067881180' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4588587442067881180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4588587442067881180'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/10/introducing-mobicents-ipbx.html' title='Introducing Mobicents IPBX'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-1045710131144440581</id><published>2009-10-06T04:32:00.000-07:00</published><updated>2009-10-13T13:16:15.154-07:00</updated><title type='text'>Amazing OKI Technology</title><content type='html'>&lt;hr /&gt;Last week, I visited &lt;a href="http://www.oki.com/"&gt;OKI&lt;/a&gt;, a major japanese telecom product vendor, to help creating a better technical relationship for the telecom vertical between OKI and Red Hat JBCP team. Along with our technical meetings I got to see one of their new products in action.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;It's no secret that Japan is way ahead in many IT&amp;amp;Telecom fields. New things are developed fast and pushed to the market quickly. As a result, the people I see on the streets are almost always "on the phone" - looking the the screen, pressing some buttons or waving the phone around. I quickly learned that the phones usually come with tons of apps and services that make you stick around such as built-in contact-less e-wallets chips, bar-code readers, TV (the Japanese TV is crazy!) and what not. I don't even mention the browsers and all the internet/IP services here. You can walk through the subway doors with the phone in your hand and the ticketing transactions occur automatically. You can scan some QR code to pick up information about items in the store, on the street or elsewhere.&lt;br /&gt;&lt;br /&gt;Obviously, when you create a new service here, you can leverage a lot of unique infrastructure, but the Japanese market is massive and very saturated and staying on top is a real challenge.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;The&lt;/span&gt; new product from OKI is up for the challenge. It is an advanced platform for a variety of services delivered in a unique integrated and rich user interface. Basically you call a number, it turns out the service you dialed supports streaming the enhanced user interface and your phone picks it up. Your TV, PC or other devices at home can join the service session and show you visually the current menus in the service or the results of your operations. The feedback from the system is both audio and video updated accurately in real time on all devices in the session. With your voice you can navigate through the menus or ask operations to be executed. You could use DTMF to enter a password or a code privately in case you don't want to speak out confidential information to feed the system. One of the coolest features is that if you are not at home, you could use some nearby ATM or other kiosk in Japan as a display. So, you are walking on the street and you just literally tell your phone to move the visualization to the kiosk and it's there. Additionally, kiosk and other devices may have more UI controls such as touchscreen, keyboard or a mouse. Within your service session you can use the extra controls for input. The OKI team allowed me to blog about this omitting some details and features. They put a lot of attention to details in the UI and interop interfaces, and some are really worth keeping secret :)&lt;br /&gt;&lt;br /&gt;One of the example services implemented on top of the platform is ordering food for a family. You go through the usual steps - identifying yourself, searching for a particular type of food, selecting a restaurant, going through the menu, examine additional options, ask questions, make your order and then confirm the payment. On every step of the order the platform adds something unique to the UI that couldn't be done otherwise especially when it comes to ordering for a group of people or while on the go.&lt;br /&gt;&lt;br /&gt;I think along with the typical customer services this platform can be useful for a number of office or enterprise applications - collaboration tools, e-meeting tools, online business workflow and so forth.&lt;br /&gt;&lt;br /&gt;This is just one of the mind-blowing things I've seen in Japan, which is truly a very special place on Earth in every aspect. I will try to cover more "Only in Japan" stories when I catch up with my regular job.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-1045710131144440581?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/1045710131144440581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=1045710131144440581' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/1045710131144440581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/1045710131144440581'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/10/amazing-oki-technology.html' title='Amazing OKI Technology'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-758542105985773682</id><published>2009-09-05T06:33:00.000-07:00</published><updated>2009-09-05T08:25:56.942-07:00</updated><title type='text'>JBossWorld update</title><content type='html'>JBossWorld is over. Overall, it was a good experience and a big step ahead in gaining mindshare, especially with Jean's efforts to deliver the Mobicents message internally and externally.&lt;br /&gt;&lt;br /&gt;On the BOF side we ended up with a few requests about how to get started. So, this is the &lt;a href="http://people.redhat.com/vralev/blog/RapidTelcoDev-BOF-VladimirRalev-JBossWorld2009.odp"&gt;Rapid Telco App Development BOF Slide Deck&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the other useful links discussed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mobicents.org/"&gt;Mobicents Homepage &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.redhat.com/solutions/telco/communications_platform/"&gt;JBCP Homepage &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobicents.org/examples.html"&gt;Sip Servlets Examples &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/mobicents-public/web/seam-telco-framework-for-sip-servlets"&gt;Seam Telco Framework &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://vladimirralev.blogspot.com/2009/06/all-mobicents-ide-tools-online.html"&gt;Eclipse Update Site &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobicents.org/mms/mms-main.html"&gt;Media Server Homepage &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And for the people with no experience in Telco, this is the fast-track on the theory:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.siptutorial.net/"&gt;SIP protocol/RTP protocol tutorial&lt;/a&gt; (you can also check the &lt;a href="http://www.ietf.org/rfc/rfc3261.txt"&gt;SIP Protocol Specification&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr289/index.html"&gt;Sip Servlets spec&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.redhat.com/docs/en-US/JBoss_Communications_Platform/1.2.1/html-single/Media_Server/index.html"&gt;Media Server User Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Take some software SIP phones and play with the examples&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I hope it helps and if there is anything else we'd be glad to give more info.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-758542105985773682?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/758542105985773682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=758542105985773682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/758542105985773682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/758542105985773682'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/09/jbossworld-update.html' title='JBossWorld update'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-727918284657344407</id><published>2009-07-10T03:40:00.000-07:00</published><updated>2009-07-13T11:19:26.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='red hat summit'/><category scheme='http://www.blogger.com/atom/ns#' term='jbossworld'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss seam'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Join us at JBossWorld 2009 in Chicago</title><content type='html'>&lt;img style="border-style: none; padding: 0px;" src="http://www.redhat.com/g/summit/2009/summit_website_header.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="float: right;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jbossworld.com/"&gt;&lt;img src="http://1.bp.blogspot.com/__bYtjOSoe5A/SlcgqsmdcVI/AAAAAAAAACQ/7f79FtY4vo0/s400/jbw_summitpage_promo.png" style="border-style: none; margin-left: 25px;" alt="" id="BLOGGER_PHOTO_ID_5356786199679562066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.redhat.com/promo/summit/2009/"&gt;&lt;img src="http://1.bp.blogspot.com/__bYtjOSoe5A/Slcl2Ks_nJI/AAAAAAAAACY/yRKkMXtRXO4/s400/Summit_300x90_0309ay.png" style="border-style: none; margin-left: 25px;" alt="" id="BLOGGER_PHOTO_ID_5356791894296730770" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Once again, someone made a terrible mistake and I will be leading the BOF session on &lt;a href="http://www.jbossworld.com/agenda/tracks/"&gt;Rapid VoIP development - SIP Servlets 1.1, Seam Telco Framework, JRuby on Rails, Eclipse VoIP tooling&lt;/a&gt;. They just never learn :)&lt;br /&gt;&lt;br /&gt;The talk is on September, 2nd at 5:45 PM. It seems a bit late, but knowing the JBoss parties that occur during summits, that's actually early and a very good slot. The other good news is that I will have &lt;a href="http://jeanderuelle.blogspot.com/"&gt;Jean Deruelle&lt;/a&gt; and some guests with me. Jean also has another talk on Telco 2.0 on Friday in the &lt;span style="font-style: italic; font-weight: bold;"&gt;What's next&lt;/span&gt; track. It is worth mentioning that this year JBossWorld and Red Hat Summit take place at the same time on the same location and visitors have have access to both with their passes.&lt;br /&gt;&lt;br /&gt;In my BOF session, we will begin with a short presentation and demos how to start developing VoIP and Converged applications with Mobicents from scratch with our telco application frameworks/platforms focusing on &lt;a href="http://groups.google.com/group/mobicents-public/web/seam-telco-framework-for-sip-servlets?pli=1"&gt;Seam Telco Framework&lt;/a&gt; and the IDEs. We will move on to some real-world examples. We will have a lot of time for questions and discussion on other Mobicents topics, VoIP technology and the current trends in the market. I hope it will be a great experience for everybody.&lt;br /&gt;&lt;br /&gt;As always, if you are around Chicago, we can do another Mobicents user meeting somewhere.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; &lt;a href="http://www.redhat.com/promo/summit/2009/register/?sc_cid=70160000000Hs3iAAC"&gt;Early bird registration extended until 17th.&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-727918284657344407?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/727918284657344407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=727918284657344407' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/727918284657344407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/727918284657344407'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/07/join-us-at-jbossworld-2009-in-chicago.html' title='Join us at JBossWorld 2009 in Chicago'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__bYtjOSoe5A/SlcgqsmdcVI/AAAAAAAAACQ/7f79FtY4vo0/s72-c/jbw_summitpage_promo.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-4264418445384110259</id><published>2009-06-12T05:29:00.001-07:00</published><updated>2009-06-12T09:18:09.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='JAIN SLEE'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='phone plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='plugings'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipslee'/><title type='text'>All Mobicents IDE Tools Online</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__bYtjOSoe5A/SjJhVrsB-AI/AAAAAAAAACI/5iIOa0Lqv74/s1600-h/mobicents.plugins.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 293px;" src="http://4.bp.blogspot.com/__bYtjOSoe5A/SjJhVrsB-AI/AAAAAAAAACI/5iIOa0Lqv74/s400/mobicents.plugins.PNG" alt="" id="BLOGGER_PHOTO_ID_5346442732774750210" border="0" /&gt;&lt;/a&gt;Some news from the past few days - all Mobicents Eclipse Plug-ins are now updated and available from the new repository. Previously, only the Sip Servlets tools were maintained, but now the EclipSLEE, the JAIN SLEE Service Creation Tool is there as well.&lt;br /&gt;&lt;br /&gt;What's new in this latest update?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;EclipSLEE &lt;/span&gt;&lt;span&gt;1.2.5&lt;/span&gt; updated to work with Eclipse 3.4 Ganymede and with JAIN SLEE 1.1 - Many thanks to &lt;span class="author"&gt;&lt;span style="white-space: nowrap; font-weight: bold; font-style: italic;"&gt;wernerdit&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt; &lt;/span&gt;for &lt;a href="http://code.google.com/p/mobicents/issues/detail?id=693"&gt;the patches&lt;/a&gt;. Ec&lt;/span&gt;&lt;span class="author"&gt;lipSLEE still needs to be updated to support the new deployment mechanism. For now you can only deploy to localhost.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="author"&gt;&lt;span style="font-weight: bold;"&gt;Sip Servlets Core Plugin&lt;/span&gt; 1.0.3 updated to fix a deployment issue and some glitches with Windows when loading the management console. It works with both JBoss Application Server 4.2.x and 5.1.x distros.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="author"&gt;&lt;span style="font-weight: bold;"&gt;Sip Phone Plugin&lt;/span&gt; 1.0.1 updated to fix some Windows issues. There is still a flicker in the graphs in Windows, but it's reduced now. Will work on that later.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Well, with this set of tools you can create and test both Sip Servlets and JAIN SLEE applications. Note that all 3 plugins do not depend on each other and you can install them separately, but they look best together :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__bYtjOSoe5A/SjJgkpc_SHI/AAAAAAAAAB4/7oAjtWYJipw/s1600-h/mobicents.ide.screen.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/__bYtjOSoe5A/SjJgkpc_SHI/AAAAAAAAAB4/7oAjtWYJipw/s400/mobicents.ide.screen.PNG" alt="" id="BLOGGER_PHOTO_ID_5346441890361198706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is our update site: &lt;a href="http://mobicents.googlecode.com/svn/downloads/sip-servlets-eclipse-update-site/"&gt;http://mobicents.googlecode.com/svn/downloads/sip-servlets-eclipse-update-site/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(i admit, putting the update site in "sip-servlets-..." was a shortsighted idea, because we have JAIN SLEE tools there as well, but it's just a path name, it doesn't matter)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see the documentation about the Sip Servlets plugins &lt;a href="http://www.mobicents.org/mss-eclipse-tools.html"&gt;here&lt;/a&gt;.&lt;br /&gt;While the EclipSLEE documentation will remain at the &lt;a href="http://groups.google.com/group/mobicents-public/web/eclipslee-tutorial"&gt;old location&lt;/a&gt; for now.&lt;br /&gt;&lt;br /&gt;I hope you enjoy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-4264418445384110259?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/4264418445384110259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=4264418445384110259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4264418445384110259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4264418445384110259'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/06/all-mobicents-ide-tools-online.html' title='All Mobicents IDE Tools Online'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__bYtjOSoe5A/SjJhVrsB-AI/AAAAAAAAACI/5iIOa0Lqv74/s72-c/mobicents.plugins.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-3432215970451716999</id><published>2009-05-31T08:19:00.000-07:00</published><updated>2009-06-02T05:43:43.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='ivr'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='msc api'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='conferencing'/><category scheme='http://www.blogger.com/atom/ns#' term='media server'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss seam'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Time for Seam Telco Framework 2.1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__bYtjOSoe5A/SiKrVxXcmTI/AAAAAAAAABw/QvPeJ0RuGFQ/s1600-h/SeamTelco.png"&gt;&lt;img src="http://4.bp.blogspot.com/__bYtjOSoe5A/SiKrVxXcmTI/AAAAAAAAABw/QvPeJ0RuGFQ/s400/SeamTelco.png" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 392px; height: 400px;" alt="" id="BLOGGER_PHOTO_ID_5342020498532112690" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;The &lt;a href="http://www.mobicents.org"&gt;Mobicents&lt;/a&gt; application framework for SIP and Media on top of Seam is now officially named &lt;span style="font-weight: bold;"&gt;Seam Telco Framework&lt;/span&gt; (STF) and it just reached &lt;span style="font-weight: bold;"&gt;version 2.1&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;There have been a number of changes and fixes since &lt;a href="http://vladimirralev.blogspot.com/2009/02/rich-telco-applications-with-seam.html"&gt;the last public version &lt;/a&gt;and the current 2.1 version must be stable enough to be consumed by all users.&lt;br /&gt;&lt;br /&gt;The goal is still the same - to unify the programming model for Telco and JEE application. A somewhat new perspective for the framework  is to minimize the new APIs and reuse as many standard or established APIs as possible (&lt;span style="font-style: italic;"&gt;JSR-289, MSC or JSR-309&lt;/span&gt;) in order to keep a flat learning curve. You can think of it as something using the Seam infrastructure to expose these APIs to your application. For example the SIP messages and the media notification are delivered through Seam events in the context of a JSR-289 Sip Servlets Session. The Sip Servlets Session itself is backing the Seam &lt;span style="font-style: italic;"&gt;SESSION&lt;/span&gt; scope context similarly to how the HTTP sessions work in Seam. Additionally, most of the framework objects are available and exposed through the Seam IoC and scoped at the right level. The STF simply plugs into Seam and reuses whatever makes sense in the SIP world. By the same logic, Seam uses that same infrastructure to expose the other APIs from the diagram (JEE, JBoss Frameworks and others) in certain roles - JSF for presentation,  jBPM for flow and navigation, Drools for security and so forth.&lt;br /&gt;&lt;br /&gt;We also want to highlight the point that most major IDEs already have support for Seam core syntax. You can use the same IDE tools to code SIP components without any extra plugins. Again, everything from STF is exposed through the Seam core infrastructure as events, components or scopes.&lt;br /&gt;&lt;br /&gt;You should note the following changes:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;The new documentation is &lt;a href="http://groups.google.com/group/mobicents-public/web/seam-telco-framework-for-sip-servlets"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;This source code of the latest stable release 2.1 is &lt;a href="http://mobicents.googlecode.com/svn/tags/frameworks/sip-servlets/seam-telco-framework/seam-telco-framework-parent-2.1/"&gt;here&lt;/a&gt; (where the examples are stable).&lt;/li&gt;&lt;li&gt;The source code trunk has moved to &lt;a href="http://mobicents.googlecode.com/svn/trunk/frameworks/sip-servlets/seam-telco-framework/"&gt;here&lt;/a&gt; (including the dev examples).&lt;/li&gt;&lt;li&gt;The media framework is bundled.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-style: italic;"&gt;Connection &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;Link &lt;/span&gt;IVR helper classes are unified under a single &lt;span style="font-style: italic;"&gt;IVRHelper &lt;/span&gt;class now. You can check the examples and the documentation for more information.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; To have quick glance let's dive into the familiar conference IVR example:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;@Scope(ScopeType.STATELESS)&lt;br /&gt;public class MediaFrameworkDemo {&lt;br /&gt; @Logger Log log;&lt;br /&gt; @In MediaController mediaController;&lt;br /&gt; @In SipSession sipSession;&lt;br /&gt; @In MediaSessionStore mediaSessionStore;&lt;br /&gt; @In IVRHelper ivrHelper;&lt;br /&gt; @In MediaEventDispatcher mediaEventDispatcher;&lt;br /&gt;&lt;br /&gt; @In(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt; @Out(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt;&lt;br /&gt; String conferenceEndpointName;&lt;br /&gt;&lt;br /&gt; private final String announcement =&lt;br /&gt;     "http://mobicents.googlecode.com/svn/branches/servers/media/1.x.y/examples/mms-demo/web/src/main/webapp/audio/welcome.wav";&lt;br /&gt;&lt;br /&gt; @Observer("INVITE")&lt;br /&gt; public void doInvite(SipServletRequest request) throws Exception {&lt;br /&gt;     // Extract SDP from the SIp message&lt;br /&gt;     String sdp = new String((byte[]) request.getContent());&lt;br /&gt;&lt;br /&gt;     // Tell the other side to ring (status 180)&lt;br /&gt;     request.createResponse(SipServletResponse.SC_RINGING).send();&lt;br /&gt;&lt;br /&gt;     // Store the INVITE request in the sip session&lt;br /&gt;     sipSession.setAttribute("inviteRequest", request);&lt;br /&gt;&lt;br /&gt;     // If this is the first INVITE in the app, then we must start a new conference&lt;br /&gt;     if (conferenceEndpointName == null)&lt;br /&gt;         conferenceEndpointName = "media/trunk/Conference/$";&lt;br /&gt;&lt;br /&gt;     // Create a connection between the UA and the conference endpoint&lt;br /&gt;     mediaController.createConnection(conferenceEndpointName).modify("$",&lt;br /&gt;             sdp); // also updates the SDP in Media Server to match capabilities of UA&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Observer("connectionOpen")&lt;br /&gt; public void doConnectionOpen(MsConnectionEvent event) throws IOException {&lt;br /&gt;     // Save this connection where the framework can read it&lt;br /&gt;     // mediaSessionStore.setMsConnection(event.getConnection());// This is done automatically in STF 2.0&lt;br /&gt;&lt;br /&gt;     // The conference endpoint is now assiged after we are connected, so save it too&lt;br /&gt;     conferenceEndpointName = event.getConnection().getEndpoint()&lt;br /&gt;     .getLocalName();&lt;br /&gt;&lt;br /&gt;     // Recall the INVITE request that we saved in doInvite&lt;br /&gt;     SipServletRequest request = (SipServletRequest) sipSession&lt;br /&gt;     .getAttribute("inviteRequest");&lt;br /&gt;&lt;br /&gt;     // Make OK (status 200) to tell the other side that the call is established&lt;br /&gt;     SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);&lt;br /&gt;&lt;br /&gt;     // Put the SDP inside the OK message to tell what codecs and so on we agree with&lt;br /&gt;     response.setContent(event.getConnection().getLocalDescriptor(),&lt;br /&gt;     "application/sdp");&lt;br /&gt;&lt;br /&gt;     // Now actually send the message&lt;br /&gt;     response.send();&lt;br /&gt;&lt;br /&gt;     // And start listening for DTMF signals&lt;br /&gt;     ivrHelper.detectDtmf();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Observer("DTMF")&lt;br /&gt; public void dtmf(String button) {&lt;br /&gt;     // If the other side presses the button "0" stop the playback&lt;br /&gt;     if("0".equals(button)) {&lt;br /&gt;         ivrHelper.endAll();&lt;br /&gt;     } else {&lt;br /&gt;         // otherwise play announcement&lt;br /&gt;         ivrHelper.playAnnouncementWithDtmf(announcement);&lt;br /&gt;     }&lt;br /&gt;     // Also log the DTMF buttons pressed so far in this session&lt;br /&gt;     log.info("Current DTMF Stack for the SIP Session: "&lt;br /&gt;             + mediaEventDispatcher.getDtmfArchive(sipSession));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Observer( { "BYE" })&lt;br /&gt; public void doBye(SipServletRequest request) throws Exception {&lt;br /&gt;     request.createResponse(200).send();&lt;br /&gt;&lt;br /&gt;     // And clean up the connections (not really required, because there is automatic cleanup in STF 2.1)&lt;br /&gt;     MsConnection connection = mediaSessionStore.getMsConnection();&lt;br /&gt;     connection.release();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Observer("REGISTER")&lt;br /&gt; public void doRegister(SipServletRequest request) throws Exception {&lt;br /&gt;     request.createResponse(200).send();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This is how you can do conferencing and IVR just by subscribing a few methods to a few events without implementing any callback interfaces or keeping track of how the media and SIP events are related. You will notice some differences and comments. There is significant effort by STF to automatically assign and cleanup media objects when it's clear what is expected or when they should not be used any more (for example they are cleaned up when the SIP session is destroyed). Overall we just try to keep the glue code out of your application or at worst keep the glue in the metadata.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What happened with version 2.0?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Version 2.0 is was released without announcment only to solve particular problems without being fully tested. The 2.1 version has some fixes on top of 2.0 and the API changes are explained in the &lt;a href="http://groups.google.com/group/mobicents-public/web/seam-telco-framework-for-sip-servlets"&gt;documentation&lt;/a&gt;. If you are 2.0 user all APIs are back-compatible and you should be able to switch to 2.1 without any effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;As usual, any suggestions and feedback are welcome!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-3432215970451716999?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/3432215970451716999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=3432215970451716999' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/3432215970451716999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/3432215970451716999'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/05/time-for-seam-telco-framework-21.html' title='Time for Seam Telco Framework 2.1'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__bYtjOSoe5A/SiKrVxXcmTI/AAAAAAAAABw/QvPeJ0RuGFQ/s72-c/SeamTelco.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-5075431725180625298</id><published>2009-03-23T13:56:00.001-07:00</published><updated>2009-03-23T14:00:35.413-07:00</updated><title type='text'>Google Summer of Code 2009 with Mobicents</title><content type='html'>&lt;div style="text-align: justify;"&gt;This year, the Mobicents project is part of the JBoss/Red Hat/Fedora GSoC student mentoring organisation. We have collected some project ideas &lt;a href="http://www.jboss.org/community/docs/DOC-13401#mobicents"&gt;here&lt;/a&gt;, but if you have others ideas, they are welcome and you can work on them as well.&lt;br /&gt;&lt;br /&gt;I signed up as a mentor and I am particularly interested in seeing some contributors on the PBX project or the tooling. The PBX project combines all the cutting edge Web and VoIP technologies and there are many cool tasks on the todo-list. Moreover, the project is allows you to push your own design ideas and contribute to our Seam Telco Framework.&lt;br /&gt;&lt;br /&gt;Check the &lt;a href="http://code.google.com/soc/"&gt;program homepage&lt;/a&gt;, where you can read more details, register and apply.&lt;br /&gt;&lt;br /&gt;Any questions or comments should go to &lt;a href="http://groups.google.com/group/mobicents-public/"&gt;our google group&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-5075431725180625298?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/5075431725180625298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=5075431725180625298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5075431725180625298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5075431725180625298'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/03/google-summer-of-code-2009-with.html' title='Google Summer of Code 2009 with Mobicents'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-2392865166837603191</id><published>2009-02-03T18:45:00.000-08:00</published><updated>2009-02-06T18:36:13.254-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='media server'/><category scheme='http://www.blogger.com/atom/ns#' term='seam'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss seam'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Rich Telco Applications with Seam</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE: The post was edited for clarity.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Mobicents &lt;a href="http://vladimirralev.blogspot.com/2008/11/jboss-seam-enhances-sip-servlets.html"&gt;Seam-based Sip Servlets framework&lt;/a&gt; was extended with Media functions  and now goes beyond SIP to unify the component models for Telco and Web applications. With this move, we are addressing the need to build quickly Media-intensive applications like PBX, conferencing, Interactive Voice Response (IVR), transaction confirmation and others.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;With the help of the Seam development tools these applications can be written and tested in no time, so even if you don't want to use the Seam model in your production applications, you will find it useful for smaller &lt;span style="font-style: italic;"&gt;"disposable"&lt;/span&gt;  applications, or for rapid prototyping and proof-of-concept applications.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Need a conferencing application?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0) ! important; background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;@Name("conference")&lt;br /&gt;@Scope(ScopeType.STATELESS)&lt;br /&gt;public class Conference {&lt;br /&gt;   @Logger Log log;&lt;br /&gt;   @In MediaController mediaController;&lt;br /&gt;   @In SipSession sipSession;&lt;br /&gt;  &lt;br /&gt;   @In(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt;   @Out(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt;   String conferenceEndpointName;&lt;br /&gt;  &lt;br /&gt;   @Observer("INVITE")&lt;br /&gt;   public void doInvite(SipServletRequest request) throws Exception {&lt;br /&gt;       String sdp = new String((byte[]) request.getContent());&lt;br /&gt;       request.createResponse(180).send();&lt;br /&gt;       sipSession.setAttribute("inviteRequest", request);&lt;br /&gt;       if (conferenceEndpointName == null)&lt;br /&gt;           conferenceEndpointName = "media/trunk/Conference/$";&lt;br /&gt;       mediaController.createConnection(conferenceEndpointName).modify("$",&lt;br /&gt;               sdp);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Observer("connectionOpen")&lt;br /&gt;   public void doConnectionOpen(MsConnectionEvent event) throws IOException {&lt;br /&gt;       conferenceEndpointName = event.getConnection().getEndpoint()&lt;br /&gt;               .getLocalName();&lt;br /&gt;       SipServletRequest request = (SipServletRequest) sipSession&lt;br /&gt;               .getAttribute("inviteRequest");&lt;br /&gt;       SipServletResponse response = request.createResponse(200);&lt;br /&gt;       response.setContent(event.getConnection().getLocalDescriptor(),&lt;br /&gt;               "application/sdp");&lt;br /&gt;       response.send();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Observer( { "BYE", "REGISTER" })&lt;br /&gt;   public void sayOK(SipServletRequest request) throws Exception {&lt;br /&gt;       request.createResponse(200).send();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;That's all. No cheating.&lt;br /&gt;&lt;br /&gt;What is happening here is that when an INVITE comes (i.e. when you dial the server), we connect the call to a conference endpoint in Mobicents Media Server. If this is the first call, the conference endpoint is not assigned yet (null) and we allocate a new endpoint (with &lt;span style="font-style: italic;"&gt;.../Conference/$&lt;/span&gt;) for the application. Once the connection is established, the &lt;span style="font-style: italic;"&gt;connectionOpen&lt;/span&gt; event occurs, then we store the conference endpoint name at the application scope and when the subsequent calls in this application see it they will connect to the same endpoint. We can easily extend this application to work with multiple conferences or add other media functionality.  All SIP and Media events occur in a SIP Session, which is basically one call from one user (or one phone). If you want to share data in the SIP session scope simply inject the SipSession as shown in the application or create a SESSION-scoped Seam component. This conference example is available &lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-seam/demo/"&gt;here&lt;/a&gt;. If you want to understand Mobicents Media Server and the MSC API you should read &lt;a href="http://groups.google.com/group/mobicents-public/web/mobicents-media-server-guide"&gt;the Mobicents Media Server Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In addition to the basic media support we are aiming to simplify the most common use-cases for media applications. While developing media applications I noticed that one SIP call is always constructed like this:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__bYtjOSoe5A/SYi7LQz1BKI/AAAAAAAAABg/X9f5M8PmQsw/s1600-h/UA-SIP-SESSION-MEDIA-MODEL.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 101px;" src="http://1.bp.blogspot.com/__bYtjOSoe5A/SYi7LQz1BKI/AAAAAAAAABg/X9f5M8PmQsw/s400/UA-SIP-SESSION-MEDIA-MODEL.png" alt="" id="BLOGGER_PHOTO_ID_5298690763766695074" border="0" /&gt;&lt;/a&gt;or the more simple chain:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__bYtjOSoe5A/SYi9eGBcDAI/AAAAAAAAABo/vLpGdcgqcqo/s1600-h/UA_SIMPLE_MEDIA.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 250px; height: 100px;" src="http://3.bp.blogspot.com/__bYtjOSoe5A/SYi9eGBcDAI/AAAAAAAAABo/vLpGdcgqcqo/s400/UA_SIMPLE_MEDIA.png" alt="" id="BLOGGER_PHOTO_ID_5298693286311758850" border="0" /&gt;&lt;/a&gt;In both chains the call is terminated at some media endpoint - IVR or Conference or an Announcement endpoint (which is not shown in the diagrams). After the call is established, the user agent is connected to exactly one media endpoint at any time, either directly or through a Packet Relay endpoint. This means that we can safely store all these links and endpoints related to the call right into the SIP session and never worry again about how to pass them to another method or component. If you need to switch to another chain just keep the session data updated. That's why we are looking into reserving a special place in the SIP session for the media objects.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;To understand it better let's look at another example:&lt;br /&gt;&lt;/div&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0) ! important; background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;@Name("mediaFrameworkDemo")&lt;br /&gt;@Scope(ScopeType.STATELESS)&lt;br /&gt;public class MediaFrameworkDemo {&lt;br /&gt;   @Logger Log log;&lt;br /&gt;   @In MediaController mediaController;&lt;br /&gt;   @In SipSession sipSession;&lt;br /&gt;   @In MediaSessionStore mediaSessionStore;&lt;br /&gt;   @In ConnectionIVRHelper connectionIVRHelper;&lt;br /&gt;   @In MediaEventDispatcher mediaEventDispatcher;&lt;br /&gt;  &lt;br /&gt;   @In(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt;   @Out(scope=ScopeType.APPLICATION, required=false)&lt;br /&gt;  &lt;br /&gt;   String conferenceEndpointName;&lt;br /&gt;  &lt;br /&gt;   private final String announcement =&lt;br /&gt;       "http://mobicents.googlecode.com/svn/branches/servers/media/1.x.y/examples/" +&lt;br /&gt;       "mms-demo/web/src/main/webapp/audio/welcome.wav";&lt;br /&gt;  &lt;br /&gt;   @Observer("INVITE")&lt;br /&gt;   public void doInvite(SipServletRequest request) throws Exception {&lt;br /&gt;       // Extract SDP from the SIp message&lt;br /&gt;       String sdp = new String((byte[]) request.getContent());&lt;br /&gt;      &lt;br /&gt;       // Tell the other side to ring (status 180)&lt;br /&gt;       request.createResponse(SipServletResponse.SC_RINGING).send();&lt;br /&gt;      &lt;br /&gt;       // Store the INVITE request in the sip session&lt;br /&gt;       sipSession.setAttribute("inviteRequest", request);&lt;br /&gt;      &lt;br /&gt;       // If this is the first INVITE in the app, then we must start a new conference&lt;br /&gt;       if (conferenceEndpointName == null)&lt;br /&gt;           conferenceEndpointName = "media/trunk/Conference/$";&lt;br /&gt;      &lt;br /&gt;       // Create a connection between the UA and the conference endpoint&lt;br /&gt;       mediaController.createConnection(conferenceEndpointName).modify("$",&lt;br /&gt;               sdp); // also updates the SDP in Media Server to match capabilities of UA&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Observer("connectionOpen")&lt;br /&gt;   public void doConnectionOpen(MsConnectionEvent event) throws IOException {&lt;br /&gt;       // Save this connection where the framework can read it&lt;br /&gt;       mediaSessionStore.setMsConnection(event.getConnection());&lt;br /&gt;      &lt;br /&gt;       // The conference endpoint is now assiged after we are connected, so save it too&lt;br /&gt;       conferenceEndpointName = event.getConnection().getEndpoint()&lt;br /&gt;               .getLocalName();&lt;br /&gt;      &lt;br /&gt;       // Recall the INVITE request that we saved in doInvite&lt;br /&gt;       SipServletRequest request = (SipServletRequest) sipSession&lt;br /&gt;               .getAttribute("inviteRequest");&lt;br /&gt;      &lt;br /&gt;       // Make OK (status 200) to tell the other side that the call is established&lt;br /&gt;       SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);&lt;br /&gt;      &lt;br /&gt;       // Put the SDP inside the OK message to tell what codecs and so on we agree with&lt;br /&gt;       response.setContent(event.getConnection().getLocalDescriptor(),&lt;br /&gt;               "application/sdp");&lt;br /&gt;      &lt;br /&gt;       // Now actually send the message&lt;br /&gt;       response.send();&lt;br /&gt;      &lt;br /&gt;       // And start listening for DTMF signals&lt;br /&gt;       connectionIVRHelper.detectDtmf();&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   @Observer("DTMF")&lt;br /&gt;   public void dtmf(String button) {&lt;br /&gt;       // If the other side presses the button "0" stop the playback&lt;br /&gt;       if("0".equals(button)) {&lt;br /&gt;           connectionIVRHelper.endAll();&lt;br /&gt;       } else {&lt;br /&gt;           // otherwise play announcement&lt;br /&gt;           connectionIVRHelper.playAnnouncementWithDtmf(announcement);&lt;br /&gt;       }&lt;br /&gt;       // Also log the DTMF buttons pressed so far in this session&lt;br /&gt;       log.info("Current DTMF Stack for the SIP Session: "&lt;br /&gt;               + mediaEventDispatcher.getDtmfArchive(sipSession));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Just say OK to these messages.&lt;br /&gt;   @Observer( { "BYE", "REGISTER" })&lt;br /&gt;   public void sayOK(SipServletRequest request) throws Exception {&lt;br /&gt;       request.createResponse(200).send();&lt;br /&gt;      &lt;br /&gt;       // And clean up the connections&lt;br /&gt;       MsConnection connection = mediaSessionStore.getMsConnection();&lt;br /&gt;       connection.release();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This is almost the same conference application with some IVR capabilities and some comments between the lines. The &lt;span style="font-weight: bold;"&gt;MediaSessionStore&lt;/span&gt; stores the call-related media objects (the &lt;span style="font-weight: bold;"&gt;MsConnection&lt;/span&gt; in this case) and &lt;span style="font-weight: bold;"&gt;ConnectionIVRHelper&lt;/span&gt; will read it from there when it is doing DTMF detection or playing announcement.&lt;br /&gt;&lt;br /&gt;Once you are connected to the conference the application works like this - when you press a button 1-9 it will play a personal announcement (only the user who pressed the button can hear it). If the users presses "0" the announcement will be stopped. Note that &lt;span style="font-weight: bold;"&gt;MediaSessionStore&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;MediaEventDispatcher&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;ConnectionIVRHelper&lt;/span&gt; are not part of the framework right now, but you can copy and paste them into your own application from &lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-seam/media-framework-demo/"&gt;the media framework demo application in SVN&lt;/a&gt; (the discussed example). Eventually the classes from the &lt;span style="font-style: italic;"&gt;org.mobicents.servlet.sip.seam.session.framework&lt;/span&gt; package will be moved into the main framework jar.&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;Development&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you've read the previous post about the Seam framework, you would already know that these applications can use almost all Seam features including hot-deployment and JBoss Tools-assisted development. Note that you don't need JBoss Tools, you can use your own IDE or no IDE with Ant or Maven or whatever you want.&lt;br /&gt;&lt;br /&gt;Here is what you need to get started with JBoss Tools:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=102670&amp;amp;package_id=262024"&gt;Mobicents Sip Servlets 0.7.2 with JBoss AS 4.2.3&lt;/a&gt; or &lt;a href="http://www.mobicents.org/products_sip_servlets.html"&gt;Mobicents Sip Servlets 0.8&lt;/a&gt; with JBoss AS 4.2.3 (please do not use it with JBoss AS 5.0 for now, since the Media support there is still in technology preview stage)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install the latest nightly build of JBoss Tools in Eclipse 3.4 (&lt;a href="http://download.jboss.org/jbosstools/updates/nightly/trunk/"&gt;this is the update site&lt;/a&gt;) - you need JBoss Seam, JBoss AS Tools and Richfaces plug-ins as minimum. You must use the nightly builds for Seam 2.1 support. Soon, a new JBoss Developer Studio will be released with official Seam 2.1 support.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=22866&amp;amp;package_id=163777&amp;amp;release_id=647861"&gt;Seam 2.1.1.GA&lt;/a&gt; and configure it as Seam runtime in JBoss Tools when asked.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Once you create a Seam 2.1 project you can extend it with the Telco framework by following these steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get the &lt;a href="http://repository.jboss.org/maven2/org/mobicents/servlet/seam/sip-servlets-seam-entrypoint/1.0/sip-servlets-seam-entrypoint-1.0.jar"&gt;sip-servlet-seam-entrypoint.jar&lt;/a&gt; and put in the Web App lib folder (under &lt;span style="font-style: italic;"&gt;WebContent/WEB-INF/lib&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Put this sip.xml in &lt;span style="font-style: italic;"&gt;WebContent/WEB-INF/&lt;/span&gt; :&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0) ! important; background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;sip-app&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;app-name&amp;gt;PUT_SOME_APPLICATION_NAME_HERE&amp;lt;/app-name&amp;gt;&lt;br /&gt;   &amp;lt;display-name&amp;gt;SeamEntryPointApplication&amp;lt;/display-name&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;SeamEntryPointApplication&amp;lt;/description&amp;gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;main-servlet&amp;gt;&lt;br /&gt;       SeamEntryPointServlet&lt;br /&gt;   &amp;lt;/main-servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;servlet&amp;gt;&lt;br /&gt;       &amp;lt;servlet-name&amp;gt;SeamEntryPointServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;       &amp;lt;display-name&amp;gt;SeamEntryPointServlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Seam Entry Point Servlet&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;servlet-class&amp;gt;&lt;br /&gt;           org.mobicents.servlet.sip.seam.entrypoint.SeamEntryPointServlet&lt;br /&gt;       &amp;lt;/servlet-class&amp;gt;&lt;br /&gt;       &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;   &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;listener&amp;gt;&lt;br /&gt;       &amp;lt;listener-class&amp;gt;&lt;br /&gt;           org.mobicents.servlet.sip.seam.entrypoint.SeamEntryPointServlet&lt;br /&gt;       &amp;lt;/listener-class&amp;gt;&lt;br /&gt;   &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/sip-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Now you are done. Just start adding Seam components.&lt;/li&gt;&lt;/ul&gt;Another way to get started is to checkout one of the examples mentioned above and play with them without IDE support (but it requires Maven).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Some guidelines&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Do not subscribe methods to SIP and media events in Seam components with SESSION or CONVERSATION scopes! &lt;/span&gt;The reason is that each of these SESSION or CONVERSATION scoped components is likely to have multiple instances (depending on the number of the sessions) and they all will be called, which is probably not what you want.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Always subscribe public methods to SIP and media events.&lt;/span&gt; Any other access modifier will cause you method not to be called.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;When dealing with JPA, always use your own EntityManager.&lt;/span&gt; Either EVENT or METHOD scoped or manage it manually through the EntityManagerFactory. The default CONVERSATION-scoped entityManager might produce "EntityManager closed" errors.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;When initiating a SIP request from a Web session, do it in another thread! &lt;/span&gt;Seam uses thread-local storage and the Web contexts will collide with the SIP contexts. We are working on solving this issue and will probably be addressed in the future.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Keep in mind that outjection occurs at the end of a method call. If you attempt to use an outjected variable from a nested method call, it will fail.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Any feedback or contributions are welcome!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-2392865166837603191?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/2392865166837603191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=2392865166837603191' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2392865166837603191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2392865166837603191'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2009/02/rich-telco-applications-with-seam.html' title='Rich Telco Applications with Seam'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__bYtjOSoe5A/SYi7LQz1BKI/AAAAAAAAABg/X9f5M8PmQsw/s72-c/UA-SIP-SESSION-MEDIA-MODEL.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-1653094503290279832</id><published>2008-12-06T14:33:00.000-08:00</published><updated>2008-12-17T08:40:29.110-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='devoxx08'/><category scheme='http://www.blogger.com/atom/ns#' term='devoxx'/><category scheme='http://www.blogger.com/atom/ns#' term='seam'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Mobicents at Devoxx</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE: &lt;/span&gt;&lt;span&gt;Making the slides available in PDF and google documents.&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://people.redhat.com/vralev/blog/Mobicents%20Sip%20Servlets%20-%20Devoxx.pdf"&gt;Mobicents Sip Servlets - Telco Applications In Java (quickie)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://people.redhat.com/vralev/blog/Web%20+%20VoIP%20v3%20-%20Devoxx.pdf"&gt;Web + VoIP Convergence (BOF)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;And if you want to view in your browser here is &lt;/span&gt;&lt;a href="http://docs.google.com/Presentation?docid=dc5jp5vx_33gwrztffw&amp;amp;hl=en"&gt;the quickie&lt;/a&gt;&lt;span&gt; and this is &lt;/span&gt;&lt;a href="http://docs.google.com/Presentation?docid=dc5jp5vx_43dbkzr8dq&amp;amp;hl=en"&gt;the BOF&lt;/a&gt; (some formatting is lost).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devoxx.com/"&gt;Devoxx&lt;/a&gt; (a.k.a. JavaPolis) is starting tomorrow. Ed and I have a &lt;a href="http://www.devoxx.com/display/JV08/BOF+Day+2"&gt;converged applications BOF on Day 2&lt;/a&gt;, where we will be covering the Mobicents platform and you can ask questions about any Mobicents technology - JAIN SLEE, Sip Servlets, Media Server, etc. Also, there will be another &lt;a href="http://www.devoxx.com/display/JV08/Quickie+Day+3"&gt;talk on Mobicents Sip Servlets&lt;/a&gt; about what's new and cool there. Among other things, I will be demoing the Seam integration, how to code&amp;amp;deploy SIP applications quickly with JBoss Developer Studio and possibly some ways to make active Web UI with AJAX and Reverse AJAX.&lt;br /&gt;&lt;br /&gt;If you are up for a meeting ping me on vladimir.ralev at gmail.com.&lt;br /&gt;&lt;br /&gt;Looking forward..&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-1653094503290279832?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/1653094503290279832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=1653094503290279832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/1653094503290279832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/1653094503290279832'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/12/mobicents-at-devoxx.html' title='Mobicents at Devoxx'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-7240896677160324008</id><published>2008-11-20T16:33:00.000-08:00</published><updated>2008-11-21T18:29:30.097-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='seam'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss seam'/><title type='text'>JBoss Seam enhances Sip Servlets</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://seamframework.org/"&gt;Seam&lt;/a&gt;-managed SIP components. How about that? Seam components can now handle real &lt;span style="font-weight: bold;"&gt;SipServletRequest&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt; while taking advantage of the Seam perks - bijection, scoping, transaction management, interceptors and everything else.&lt;br /&gt;&lt;br /&gt;Your SIP and  HTTP Servlets are running in the same servlet context and they share the same application-scoped components, while the session-scoped components are mapped to the respective SIP and HTTP sessions*.  You can work with both EJBs and POJOs, interact with your web-layer, and still build very loosely coupled telco components working on the same messages without being aware of each-other. Seam provides synchronous and asynchronous light-weight message passing through the &lt;span style="font-weight: bold;"&gt;@Observer&lt;/span&gt;-annotated methods, which covers most of the communication needs in converged applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;How it works?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Seam 2 core is now mostly independent of HTTP Servlets and JSF. Basically we hooked a controller Sip Servlet and session listeners to the Seam lifecycle to control the context assignment for incoming SIP messages. When a SIP message arrives, we raise Seam events to notify the Seam components subscribed to receive the SIP events. We had to use a small Java reflection hack to reach some protected Seam contexts, but I believe it is safe. We will try to make it more clean.&lt;br /&gt;&lt;br /&gt;The setup is straightforward - just add the controller servlet to your Seam application in a Sip Servlets container and it's ready to go. For now you can start with the sample application.&lt;br /&gt;&lt;br /&gt;Theoretically this technique can work on any JSR289-compliant container that supports JBoss Seam, but I have only tested it on &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=102670&amp;amp;package_id=262024"&gt;Mobicents Sip Servlets&lt;/a&gt;  0.6/0.7 with JBoss Application Server 4.2.3 and Seam 2.1.0.SP1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;One example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is simple SIP service which responds to an INVITE and counts the number of messages per session. There is a session-scoped counter, which is incremented on every message. Note how you can subscribe methods to SIP events. You can subscribe as many methods as you like in any Seam component, they all will be notified.&lt;br /&gt;&lt;/div&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0) ! important; background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;@Name("simpleSeamSipService")&lt;br /&gt;@Scope(ScopeType.STATELESS)&lt;br /&gt;@Transactional&lt;br /&gt;public class SimpleSeamSipService {&lt;br /&gt;    @Logger Log log;&lt;br /&gt;    @In SessionMessageCounter sessionMessageCounter;&lt;br /&gt;&lt;br /&gt;    public void incrementMessageCounter() {&lt;br /&gt;        sessionMessageCounter.increment();&lt;br /&gt;        log.info(&amp;quot;Processed SIP messages &amp;quot;&lt;br /&gt;                + sessionMessageCounter.getMessages());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Observer(&amp;quot;INVITE&amp;quot;)&lt;br /&gt;    public void doInvite(SipServletRequest request)&lt;br /&gt;    throws Exception {&lt;br /&gt;        incrementMessageCounter();&lt;br /&gt;        request.createResponse(180).send();&lt;br /&gt;        Thread.sleep(100);&lt;br /&gt;        request.createResponse(200).send();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Observer(&amp;quot;ACK&amp;quot;)&lt;br /&gt;    public void doAck(SipServletRequest request)&lt;br /&gt;    throws Exception {&lt;br /&gt;        incrementMessageCounter();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Observer({&amp;quot;REGISTER&amp;quot;,&amp;quot;BYE&amp;quot;})&lt;br /&gt;    public void sayOK(SipServletRequest request)&lt;br /&gt;    throws Exception {&lt;br /&gt;        incrementMessageCounter();&lt;br /&gt;        request.createResponse(200).send();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Observer({&amp;quot;RESPONSE&amp;quot;})&lt;br /&gt;    public void sayOK(SipServletResponse response)&lt;br /&gt;    throws Exception {&lt;br /&gt;        incrementMessageCounter();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;You should keep in mind that the Seam events are application-wide. If you need cross-application messaging use JMS (which accidentally is also effortless with Seam).&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;And here is the SIP-session scoped component:&lt;br /&gt;&lt;/div&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;@Name(&amp;quot;sessionMessageCounter&amp;quot;)&lt;br /&gt;@Startup&lt;br /&gt;@Scope(ScopeType.SESSION)&lt;br /&gt;public class SessionMessageCounter {&lt;br /&gt;    private int messages;&lt;br /&gt;    &lt;br /&gt;    public int getMessages() {&lt;br /&gt;        return messages;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void increment() {&lt;br /&gt;        messages++;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Actually, this component is created and stored in every Seam session, no matter if it's SIP or HTTP. This is a bit inefficient, but has some advantages. Ultimately we would want to have a separate SipSession and SipApplicationSession scopes in Seam and we will probably get there with the user-defined scopes in Web Beans (JSR 299) or a newer version of Seam.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Why use it?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://docs.jboss.com/seam/latest/reference/en-US/html/index.html"&gt;All the Seam goodness.&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Development will be easier, because you can take advantage of the Seam &lt;span style="font-style: italic;"&gt;WEB-INF/dev&lt;/span&gt; classloader to deploy Seam components faster. Otherwise you have to redeploy the whole war/ear (10-20 secs vs 1-2 secs). This feature is not perfect yet.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Testing - Seam provides a great framework for testing based on dependency injection and mocking. &lt;/li&gt;&lt;li&gt;Programming model is practically the same as the one you use for Web apps with Seam and similar to the future Web Beans.&lt;/li&gt;&lt;li&gt;Potential to integrate with jBPM and JBoss Rules through Seam. (contributors?)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Why not to use it?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;It is not standards-based.&lt;/li&gt;&lt;li&gt;Performance is suffering a bit with Seam.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;You can find the sample application in SVN:&lt;br /&gt;&lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-seam"&gt;http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-seam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We will soon provide a kit for integrating this capability in your applications. Until then, use the sample application.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;*(We currently have no use for conversation scope in SIP.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-7240896677160324008?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/7240896677160324008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=7240896677160324008' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7240896677160324008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7240896677160324008'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/11/jboss-seam-enhances-sip-servlets.html' title='JBoss Seam enhances Sip Servlets'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-4280254393004463947</id><published>2008-10-25T00:44:00.000-07:00</published><updated>2008-11-20T20:14:36.201-08:00</updated><title type='text'>A Conference Demo for Sip Servlets</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; Now the Media Server has been released and the application doesn't need any tweaks to work. All dependencies come from the maven repository.&lt;br /&gt;&lt;br /&gt;There is a new example application for Sip Servlets - a conference demo. Conferencing has been important for many of our users and this is a good way to get them started and show them how easy it is. In fact I spent more time fighting with Maven than actually writing the code for this example (and I know this is not really an achievement).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__bYtjOSoe5A/SQMBaXaBOUI/AAAAAAAAABQ/gc4LmGCYhbI/s1600-h/conference.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 144px;" src="http://4.bp.blogspot.com/__bYtjOSoe5A/SQMBaXaBOUI/AAAAAAAAABQ/gc4LmGCYhbI/s320/conference.png" alt="" id="BLOGGER_PHOTO_ID_5261050342170245442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The features demonstrated by this applications are the following:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Mobicents Media Server 1.0.0.CR2 - the latest version of Media Server with the latest MSC API. This Medis Server is not released yet, so you will need to build it from the trunk.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sip Servlets Conference API Preview - this API will help Sip Servets users to create and manage conferences in Media Server and will be part of the future Mobicents Sip Servlets PBX.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ"&gt;Server Push updates with GWT&lt;/a&gt; - providing instant updates in the browser about the conference status without polling and enabling desktop-like experience. JSR 315 (HTTP Servlets 3.0) will have support for delayed request/response handling, so this is definitely becoming part of the asynchronous web applications in Java, which is particularly useful for real-time interaction with telco applications.&lt;a href="http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Completely annotated Sip Servlets application - minimum glue code and XML.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;The application still has some bugs, but I am working on it.&lt;br /&gt;&lt;br /&gt;The example is available in SVN from &lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-examples/conference-demo"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-4280254393004463947?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/4280254393004463947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=4280254393004463947' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4280254393004463947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4280254393004463947'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/10/conference-demo-for-sip-servlets.html' title='A Conference Demo for Sip Servlets'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__bYtjOSoe5A/SQMBaXaBOUI/AAAAAAAAABQ/gc4LmGCYhbI/s72-c/conference.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-4207440822443474113</id><published>2008-09-30T12:52:00.000-07:00</published><updated>2008-09-30T13:53:32.533-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='compliance'/><category scheme='http://www.blogger.com/atom/ns#' term='jsr-289'/><category scheme='http://www.blogger.com/atom/ns#' term='mobicents'/><title type='text'>Mobicents Sip Servlets 0.6 achieves JSR-289 compliance!</title><content type='html'>The freshly released Mobicents Sip Servlets 0.6 is now the first open-source JSR-289 compatible server. Or more precisely two servers, since we have both JBoss and Tomcat versions.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__bYtjOSoe5A/SOKOG4gH8xI/AAAAAAAAABA/GIKUB8y5MO8/s1600-h/TCK-results.png"&gt;&lt;img style="border: 1px none ; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/__bYtjOSoe5A/SOKOG4gH8xI/AAAAAAAAABA/GIKUB8y5MO8/s400/TCK-results.png" alt="" id="BLOGGER_PHOTO_ID_5251916364364903186" border="1" /&gt;&lt;/a&gt;Pick your distro from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=102670&amp;amp;package_id=262024&amp;amp;release_id=629778"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Read more in&lt;a href="http://jeanderuelle.blogspot.com/2008/09/mobicents-sip-servlets-is-jsr-289-sip.html"&gt; Jean Deruelle's blog&lt;/a&gt;, &lt;a href="http://groups.google.com/group/mobicents-public/t/67aa7f25f2fc8bcb?hl=en"&gt;the official announcement&lt;/a&gt; and &lt;a href="http://www.mobicents.org/products_sip_servlets.html"&gt;the project homepage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you enjoy watching successful TCK results:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hudson.jboss.org/hudson/job/MobicentsSipServletsReleaseTest/76/testReport"&gt;Mobicents Sip Servlets JBoss JSR-289 TCK Results&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hudson.jboss.org/hudson/job/MobicentsSipServletsTomcatReleaseTest/13/testReport"&gt;Mobicents Sip Servlets Tomcat JSR-289 TCK Results&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Jean is the man!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-4207440822443474113?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/4207440822443474113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=4207440822443474113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4207440822443474113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/4207440822443474113'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/09/mobicents-sip-servlets-06-achieves-jsr.html' title='Mobicents Sip Servlets 0.6 achieves JSR-289 compliance!'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__bYtjOSoe5A/SOKOG4gH8xI/AAAAAAAAABA/GIKUB8y5MO8/s72-c/TCK-results.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-7476399187208926677</id><published>2008-09-25T14:06:00.000-07:00</published><updated>2008-09-25T16:22:09.404-07:00</updated><title type='text'>Mobicents team visits the Red Hat office in Munich</title><content type='html'>&lt;div style="text-align: justify;"&gt;We started with an inventory inspection. Turned out there is enough beer in the office to host the entire Oktoberfest. As a moral obligation we had to reduce the amount of alcohol to the lawful limit. Then we moved on to the real Oktoberfest (managers know it as an important telecom conference). After this, everything is blurry.&lt;br /&gt;&lt;br /&gt;In the few flashbacks I have from time to time there are some slides about Mobicents, german bars and "forty dollar". Later, a summary of the meetings surfaced &lt;a href="http://groups.google.com/group/mobicents-public/web/mobicents-dev-team-meeting---munich-september-2008"&gt;here&lt;/a&gt;. Check it out if you are interested in the Mobicents roadmaps and current status. I see some exciting things there :)&lt;br /&gt;&lt;br /&gt;On the flight back to home (trying to impress the girl next to me) I mixed wine, beer, coffee and apple juice. It rocks.&lt;br /&gt;&lt;br /&gt;Munich, sorry for the mess.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-7476399187208926677?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/7476399187208926677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=7476399187208926677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7476399187208926677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/7476399187208926677'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/09/mobicents-team-visits-red-hat-office-in.html' title='Mobicents team visits the Red Hat office in Munich'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-5766162559799562083</id><published>2008-05-12T14:38:00.001-07:00</published><updated>2008-05-12T21:58:03.243-07:00</updated><title type='text'>Mobicents Sip Servlets Management Console</title><content type='html'>One of the things that got shipped with Mobicents 1.2.0.BETA1, but didn't receive enough attention is the &lt;a href="https://sip-servlets.dev.java.net/ssmc/sip-servlets-managment.htm"&gt;Sip Servlets Management Console&lt;/a&gt; and hopefully this post will reach the users.&lt;br /&gt;&lt;br /&gt;The managment console is a web application available at &lt;a href="http://localhost:8080/sip-servlets-management/"&gt;http://localhost:8080/sip-servlets-management/&lt;/a&gt; for those who have the latest Mobicents.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/__bYtjOSoe5A/SCi9ZEcpfHI/AAAAAAAAAAU/NxTh3KQG91c/s1600-h/mssm.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/__bYtjOSoe5A/SCi9ZEcpfHI/AAAAAAAAAAU/NxTh3KQG91c/s400/mssm.jpg" alt="" id="BLOGGER_PHOTO_ID_5199614008187518066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Currently it allows configuring the application router in the Sip Servlets container by dragging the blocks or the columns of the applications associated with certain SIP method and we plan to enhance it with application management and monitoring module, stun, media and other configuration options.&lt;br /&gt;&lt;br /&gt;You can see it in action &lt;a href="https://sip-servlets.dev.java.net/ssmc/sip-servlets-managment.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the future we plan to add wildcard and rules matching to the Application Router configuration tool, so stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-5766162559799562083?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/5766162559799562083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=5766162559799562083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5766162559799562083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5766162559799562083'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/05/mobicents-sip-servlets-management.html' title='Mobicents Sip Servlets Management Console'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/__bYtjOSoe5A/SCi9ZEcpfHI/AAAAAAAAAAU/NxTh3KQG91c/s72-c/mssm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-2851362650813949551</id><published>2008-05-12T13:28:00.000-07:00</published><updated>2008-05-12T21:53:55.267-07:00</updated><title type='text'>JavaOne 2008 Materials</title><content type='html'>JavaOne 2008 was interesting.  The Mobicents team held short sessions on the Mobicents Platform. In my presentation I tried to cover the basics of VoIP, show some real world examples and applications, explain the components and the features in Mobicents. I also had a few slides on the new programming model that we are developing now. At the end I made a quick demo of a Facebook click-to-call application that calls two different phones and links them (web-initiated 3pcc).&lt;br /&gt;&lt;br /&gt;Unfortunately, it didn't go as planned. It was supposed to be 15 mins presentation and 45 mins demos, and it was 45 mins of presentation and just a few minutes of demo. And I sucked. They shouldn't let me talk to people :)&lt;br /&gt;&lt;br /&gt;Anyway, it seems the Mobicents sessions attracted a lot of people interested to learn about converged and VoIP applications. There are a few requests to post the presentations and demos, so here they are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://people.redhat.com/vralev/blog/JavaOne%202008%20Presentation%20-%20Vladimir.pdf"&gt;Building Converged Applications with Mobicents&lt;/a&gt; by me&lt;/li&gt;&lt;li&gt;&lt;a href="http://people.redhat.com/vralev/blog/JavaOne%202008%20Presentation%20-%20Jean%20Deruelle.pdf"&gt;Mobicents Communications Platform - Java EE, JAIN-SLEE, SIP Servlets, Media Server&lt;/a&gt; by Jean Deruelle&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The demos can be found here:&lt;ul&gt;&lt;li&gt;&lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-examples/facebook-c2c"&gt;Facebook Click2Call Demo (source code)&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The Facebook demo basically asks for two phone numbers, then you can click Dial and the phones should start ringing. Once you pick up both phones the call is established and both parties can hear each other.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/__bYtjOSoe5A/SCizRUcpfGI/AAAAAAAAAAM/76NiqDn-i1A/s1600-h/facebook-c2c.jpg"&gt;&lt;img style="cursor: pointer; width: 352px; height: 229px;" src="http://bp0.blogger.com/__bYtjOSoe5A/SCizRUcpfGI/AAAAAAAAAAM/76NiqDn-i1A/s400/facebook-c2c.jpg" alt="" id="BLOGGER_PHOTO_ID_5199602879927254114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://mobicents.googlecode.com/svn/trunk/servers/sip-servlets/sip-servlets-examples/jslee-sips-interop"&gt;JSLEE and Sip Servlets Interop Demo (source code)&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: left;"&gt;This demo shows is a web store where once the user has checked out with some items in the basket, he receives a call on his phone and must confirm the payment by pressing 1. It is similar to the original &lt;a href="http://groups.google.com/group/mobicents-public/web/converged-application-demo"&gt;JAIN SLEE Converged demo (Shopping demo)&lt;/a&gt; and the &lt;a href="https://sip-servlets.dev.java.net/examples/shopping-demo.html"&gt;Sip Servlets Shopping Demo&lt;/a&gt; but it uses both JAIN SLEE and Sip Servlets.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-2851362650813949551?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/2851362650813949551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=2851362650813949551' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2851362650813949551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/2851362650813949551'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/05/mobicents-on-javaone-2008.html' title='JavaOne 2008 Materials'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/__bYtjOSoe5A/SCizRUcpfGI/AAAAAAAAAAM/76NiqDn-i1A/s72-c/facebook-c2c.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7054420788675814404.post-5040511026851083968</id><published>2008-05-12T11:07:00.001-07:00</published><updated>2008-05-12T11:11:56.671-07:00</updated><title type='text'>First post</title><content type='html'>Testing&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7054420788675814404-5040511026851083968?l=vladimirralev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimirralev.blogspot.com/feeds/5040511026851083968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7054420788675814404&amp;postID=5040511026851083968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5040511026851083968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7054420788675814404/posts/default/5040511026851083968'/><link rel='alternate' type='text/html' href='http://vladimirralev.blogspot.com/2008/05/first-post.html' title='First post'/><author><name>Vladimir Ralev</name><uri>http://www.blogger.com/profile/09798787309652650770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/__bYtjOSoe5A/StX95LNFwHI/AAAAAAAAAC8/ZZwsxTC0csg/S220/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
