<?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-5947766887998996490</id><updated>2011-12-06T01:22:03.667-08:00</updated><category term='Scripting'/><category term='SVF'/><category term='JPA'/><category term='OpenSpaces.org'/><category term='GigaSpaces'/><category term='ESB'/><category term='NoSql'/><category term='OpenSpaces'/><category term='Netscaler'/><category term='Citrix'/><category term='Predictability'/><category term='XenServer'/><category term='Sql'/><title type='text'>Uri Cohen's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-2316303608048996919</id><published>2011-04-07T21:00:00.000-07:00</published><updated>2011-04-07T01:51:29.571-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>XAP 8.0.1 is Out!</title><content type='html'>&lt;p&gt;We’ve just released XAP 8.0.1, with a lot of goodies included. 8.0.1 is the first feature and service pack on top of XAP 8.0.0. It includes many enhancements and a few exciting new features. Here’s a short recap: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Improved Web UI Dashboard with Alerts View: &lt;/strong&gt;The dashboard view now gives you a single click view of the entire cluster, including alerts on various problematic conditions. The previous view is now available under the topology tab. This is the first stage in the new Web based UI planned for XAP. You can find more details about it &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/The+XAP+Web+Based+Dashboard" target="_blank"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_ksxjtYRhpeY/TZsp3d8e3wI/AAAAAAAABCw/drx4Bb-KqZ0/s1600-h/dashboard%5B2%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 80px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="dashboard" border="0" alt="dashboard" src="http://lh5.ggpht.com/_ksxjtYRhpeY/TZsp4vtbt4I/AAAAAAAABC0/dQaZv3iC5x4/dashboard_thumb.png?imgmax=800" width="244" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Elastic Deployment for Stateless and Web Processing Units&lt;/strong&gt;: The &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Elastic+Processing+Unit"&gt;elastic deployment model&lt;/a&gt; introduced in 8.0 for stateful and data grid only processing units has now been extended to support stateless and web processing units. You can scale web applications and stateless processing units up and down based on CPU, memory or available resources. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Document (Schema-Free) API support for .Net&lt;/strong&gt;: The .Net edition &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8NET/Document+%28Schema-Free%29+Entries"&gt;now includes the all new document API&lt;/a&gt; which was introduced in the 8.0.0 in the Java version. It enables you to maintain a completely flexible domain model without any restrictions on the entry's schema, and add/remove properties as your application evolves. It also simplifies interoperability with Java since when using the Document API it's no longer tied to a concrete .Net and Java classes. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Improved complex object querying and indexing for .Net: &lt;/strong&gt;The .Net edition now enables you to query and index complex object structures, including nested collections and arrays. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Deep POJO/PONO - Document Interoperability: &lt;/strong&gt;Documents and POJOs can now be mixed interchangeably across all nesting level. You can read a document as a POJO/PONO (assuming its type name corresponds to the POJO/PONO class name) and vice versa. The space will convert between the formats across all nesting levels, so if you have a complex Java object for example which contains a reference to a nested Java Object or a collection of nested objects, the space will convert the entire object graph to documents and sub documents. In addition, you can also define a &amp;quot;bag&amp;quot; of dynamic properties for a certain POJO/PONO so that new properties that are added via the document API to the entry are exposed in the POJO/PONO instance via this bag. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Map/Reduce and Native Query Support for JPA: &lt;/strong&gt;The XAP JPA Implementation &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/JPA+Support#JPASupport-JPASupportNativeQueryExecution"&gt;now supports&lt;/a&gt; the JPA &lt;tt&gt;NativeQuery&lt;/tt&gt; facility. On top of running queries in the Space's native syntax, it also enables you to actually execute Space tasks across one or all cluster nodes and bring the power of the grid to the JPA API. Tasks can be defined using the GigaSpaces &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Task+Execution+over+the+Space"&gt;task execution interfaces&lt;/a&gt; or even as a dynamic language script for scripting languages that are supported as part of the JVM. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Method Level routing and result reducers for Space Based Remoting: &lt;/strong&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Space+Based+Remoting"&gt;Space Based Remoting&lt;/a&gt; has traditionally been a very popular facility to reliably expose scalable business services to your application clients. In 8.0.1, you can specify method level behaviors for the foundational remoting constructs such as &lt;font face="Courier New"&gt;RemoteRoutingHandler&lt;/font&gt;s and &lt;font face="Courier New"&gt;RemoteResultReducer&lt;/font&gt;s via the dedicated &lt;a href="http://www.gigaspaces.com/docs/JavaDoc8.0/org/openspaces/remoting/ExecutorRemotingMethod.html"&gt;@ExecutorRemotingMethod&lt;/a&gt; and &lt;a href="http://www.gigaspaces.com/docs/JavaDoc8.0/org/openspaces/remoting/EventDrivenRemotingMethod.html"&gt;@EventDrivenRemotingMethod&lt;/a&gt; annotations. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;WAN Replication Improvements: &lt;/strong&gt;8.0.1 adds a number of important improvements and bug fixes to the &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Multi-Site+Replication+over+WAN"&gt;replication over WAN module&lt;/a&gt;, such as better peer classloading behavior (when the classes written to the space are not part of the space's classpath), better cleanup of replicated entries, and support for replication of .Net entries. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Improved Performance of .Net Executor API: &lt;/strong&gt;The .Net task execution API has gone some optimization in the way that tasks are passed to the space and executed in it, which resulted in performance boosts of up to 250%. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;More JPA goodies&lt;/strong&gt;: In addition to &lt;tt&gt;NativeQuery&lt;/tt&gt; support, we have also implemented a number of other changes, including better JPQL syntax support (&lt;tt&gt;LIKE, IS NULL&lt;/tt&gt;), optimistic locking support and improved relationship handling. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Improved XA Transaction Support: &lt;/strong&gt;XA transactions can now work against a partitioned space cluster as a single XA resource (via the &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Transaction+Management#TransactionManagement-ransactionManagementDistributedJiniTransactio..."&gt;distributed Jini transaction manager&lt;/a&gt;) rather than working with each partition separately. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Mule 3.1 Support: &lt;/strong&gt;The build in &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Mule+ESB"&gt;Mule ESB support&lt;/a&gt; has been ungraded to support Mule version 3.1. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The full list of changes, improvements and bug fixes can be found in our &lt;a href="http://www.gigaspaces.com/wiki/display/RN/GigaSpaces+8.0.X+Release+Notes" target="_blank"&gt;release notes section&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;You welcome to &lt;a href="http://www.gigaspaces.com/LatestProductVersion" target="_blank"&gt;give it a go&lt;/a&gt; and let us know what you think.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-2316303608048996919?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/2316303608048996919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=2316303608048996919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2316303608048996919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2316303608048996919'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2011/04/xap-801-is-out.html' title='XAP 8.0.1 is Out!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ksxjtYRhpeY/TZsp4vtbt4I/AAAAAAAABC0/dQaZv3iC5x4/s72-c/dashboard_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-593072543088659545</id><published>2011-03-08T15:06:00.001-08:00</published><updated>2011-03-09T03:13:31.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Data Grid Querying, Revisited</title><content type='html'>&lt;blockquote&gt; &lt;p&gt;There has been a great deal of talk lately about the new EHCache &lt;a href="http://www.dzone.com/links/559109.html" target="_blank"&gt;cache querying&lt;/a&gt; capabilities and the advantages of &lt;a href="http://www.nytimes.com/external/gigaom/2011/02/15/15gigaom-terracotta-brings-real-time-analytics-to-the-java-77320.html" target="_blank"&gt;real-time analytics through in-memory cache querying&lt;/a&gt;. I find that rather odd since extensive querying and processing capabilities have been around for years with in memory data grids like GigaSpaces XAP, Oracle Coherence, Gemstone GemFire and more recently Hazelcast and GridGain. So I don’t really understand the big fuss around EHCache finally supporting it….&lt;/p&gt; &lt;p&gt;But that’s actually a great opportunity to revisit some of the work we’ve done in our recent 8.0 release in the context of querying. There are two main features we’ve introduced in 8.0 that take data grid querying to the next level. &lt;/p&gt; &lt;h4&gt;Complex Object Querying&lt;/h4&gt; &lt;p&gt;The first one is complex object graph querying. Simply put, you can now index and any type of property, at any nesting level, of your data grid objects: primitive types, user defined types, or collections/arrays of either.&lt;br /&gt;Think of an Author object, which has a collection of books, each of them containing a collection of user reviews.&lt;br /&gt;Here are just two examples of what you can achieve with XAP 8.0:&lt;br /&gt;•    List all the Authors that wrote at list one sci-fi book:  &lt;/p&gt;  &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;Author[] authors = gigaSpace.readMultiple(new SQLQuery&amp;lt;author&amp;gt;(Author.class,&lt;br /&gt;&amp;quot;books[*].genre = ‘Sci-Fi’ ORDER BY name&amp;quot;,Integer.MAX_VALUE);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;•    List all the Authors who have at least one book on which your friend on Facebook commented: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;Author[] authors = gigaSpace.readMultiple(new SQLQuery&amp;lt;author&amp;gt;(Author.class,&lt;br /&gt;&amp;quot;books[*].comments[*].username= ?&amp;quot;, “myFacebookFriend”, Integer.MAX_VALUE);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This goes hand in hand with our &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Document+(Schema-Free)+API" target="_blank"&gt;new Document support&lt;/a&gt;, so you can apply the above to schema free documents as well as just plain Java or .Net objects. &lt;/p&gt;&lt;br /&gt;&lt;h4&gt;GigaSpaces JPA&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;The second feature is our &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Introduction+to+XAP+JPA" target="_blank"&gt;all new JPA support&lt;/a&gt;. We believe this to be a major step towards ease of use and standardization of distributed data store access. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;There have been a &lt;a href="http://nosql.mypopescu.com/post/284626517/nosql-vs-sql-articles" target="_blank"&gt;lot of discussions&lt;/a&gt; in the developer community about how the “classic” querying and interaction models (such as SQL/JDBC and JPA) can be mapped to the world of distributed data stores (which in memory data grids are a part of). &lt;/p&gt;&lt;br /&gt;&lt;p&gt;When it comes down to querying, each distributed data store defines its own querying language and semantics. Some are completely proprietary (e.g. &lt;a href="http://gregluck.com/blog/archives/2011/02/ehcache-2-4-with-the-new-search-feature-is-out/" target="_blank"&gt;EHCache’s new query DSL&lt;/a&gt;, or MongoDB’s &lt;a href="http://www.mongodb.org/display/DOCS/Querying" target="_blank"&gt;query syntax&lt;/a&gt;), some are modeled after standard SQL to some extent or the other (e.g. &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/SQLQuery" target="_blank"&gt;GigaSpaces’ native querying&lt;/a&gt; support, &lt;a href="http://download.oracle.com/docs/cd/E15357_01/coh.360/e15723/api_cq.htm" target="_blank"&gt;Coherence’s recent QL&lt;/a&gt;, or &lt;a href="http://www.dzone.com/links/r/sql_for_inmemory_cache_queries.html" target="_blank"&gt;GridGain’s query language&lt;/a&gt;).  &lt;br /&gt;All of these seem be solid query implementations (naturally you can guess which one I like best :) ). &lt;/p&gt;&lt;br /&gt;&lt;p&gt;But when developing to each of those products, you need to learn their interaction model, data access semantics (such as transaction management) and of course querying language. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The first take at bridging the two worlds, and IMO pretty successful one considering the inherent difficulties in bridging the two models (see &lt;a href="http://www.slideshare.net/uri1803/session-5741437" target="_blank"&gt;this presentation&lt;/a&gt; I’m giving at &lt;a href="http://qconlondon.com/" target="_blank"&gt;QCon London&lt;/a&gt; in two days), was actually done by Google almighty with the &lt;a href="http://code.google.com/appengine/docs/java/datastore/jpa/overview.html" target="_blank"&gt;JPA support in AppEngine&lt;/a&gt;.&lt;br /&gt;Although not 100% standard (actually &lt;a href="http://code.google.com/appengine/docs/java/datastore/jpa/overview.html#Unsupported_Features_of_JPA" target="_blank"&gt;not even close&lt;/a&gt;), it gives you as a developer a very easy and familiar way to implement scalable data access on top of their BigTable data store, and a very clear migration path for putting your apps on AppEngine, should you choose to do so. It also makes your code a lot more portable since JPA, even a partial version of it, is still way more standard and portable than any proprietary API. &lt;/p&gt;&lt;br /&gt;&lt;h4&gt;GigaSpaces JPA – Design Principles&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;When we initially thought of implementing a JPA interface to our data grid, we had the following goals in mind: &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Make our user’s life easier &lt;/strong&gt;by providing a standard way for the to interact with the data grid that will allow them to easily get up to speed with new applications, and port existing JEE applications more smoothly and quickly.&lt;br /&gt;For that, we created a thin layer on top of the excellent &lt;a href="http://openjpa.apache.org/" target="_blank"&gt;OpenJPA framework&lt;/a&gt; so that configuring a GigaSpaces EntityManagerFactory is a breeze if you’re already into JPA in general and OpenJPA in particular. We also managed to support a nice set of features from the JPA specification (actually more extensive than Google’s AppEngine JPA) so that most of the stuff users actually do with JPA is covered. Naturally, this is just our first take at this huge project, and we’ll add more and more capabilities as we move forward.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Enable our users to leverage the power and scalability of the data grid &lt;/strong&gt;to scale their data access, even when they’re using JPA (which was originally designed for a centralized data model). This means exposing content based routing and data grid indexing to their JPA domain model, and abstracting away cluster wide transactions and queries.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Protect our users from making wrong implementation decisions &lt;/strong&gt;when modeling and accessing their distributed data. In Google AppEngine’s terminology, this means supporting Owned Relationship only such that object graphs are not scattered across many nodes and are always limited to a single node.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Allow our users to use our powerful native APIs &lt;/strong&gt;for functions that are not covered by the JPA specification, e.g. &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Messaging+and+Events" target="_blank"&gt;event handling&lt;/a&gt;, &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Task+Execution+over+the+Space" target="_blank"&gt;distributed task execution&lt;/a&gt;, and more. So it actually means that you can use the JPA API, while still operate on the same data model and entities via our native POJO based API. This is a very powerful concept that covers not only JPA but all of our data access APIs, we call &lt;a href="http://www.enigmastation.com/?p=551" target="_blank"&gt;Same Data, Any API&lt;/a&gt; and it means that you can operate on the same data using a variety of APIs – besides our native POJO API and JPA. For example, you can read a JPA entity as a document (in case you want to treat it in a more loosely flexible manner, or use our C++ client side API from native clients to read this data. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;See for Yourself &lt;/h4&gt;&lt;br /&gt;&lt;p&gt;We have just published an &lt;a href="http://www.gigaspaces.com/wiki/display/XAP8/Introduction+to+XAP+JPA" target="_blank"&gt;comprehensive tutorial&lt;/a&gt; that explains the principles of the our JPA implementation using the good old Spring PetClinic sample app (we’ve added our own flavor to it :) ). It explains the data model considerations and shows how take advantage of data grid features such as space based remoting to optimize the data access of the application and use our &lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-593072543088659545?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/593072543088659545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=593072543088659545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/593072543088659545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/593072543088659545'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2011/03/data-grid-querying-revisited.html' title='Data Grid Querying, Revisited'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-4063521763955791845</id><published>2010-12-07T07:00:00.000-08:00</published><updated>2010-12-07T09:25:55.480-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>TV Made Right :)</title><content type='html'>&lt;div&gt;We've just created a &lt;a href="http://www.youtube.com/user/gigaspacestv"&gt;new channel on YouTube&lt;/a&gt; called GigaSpaces TV. It will feature interviews and tech talks on various aspects of the product, and you also get to see me unshaved in the first episode ;). In it I give a short overview of the new APIs we're coming our with in our 8.0 release. &lt;/div&gt;&lt;div&gt;Stay tuned by subscribing to the channel! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy, &lt;/div&gt;&lt;div&gt;Uri &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yiO4M3AKlQk?fs=1&amp;amp;hl=en_US"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/yiO4M3AKlQk?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/5947766887998996490-4063521763955791845?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/4063521763955791845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=4063521763955791845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4063521763955791845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4063521763955791845'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2010/12/tv-made-right.html' title='TV Made Right :)'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-3987588175331571361</id><published>2010-12-07T06:54:00.001-08:00</published><updated>2010-12-07T06:58:06.119-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>To Scale or Not to Scale - the Recording</title><content type='html'>The recording of my session at Devoxx 2010 is now &lt;a href="http://parleys.com/#st=5&amp;amp;id=2186"&gt;available online at parleys.com&lt;/a&gt;&lt;br /&gt;At this point you need a subscription to view it in full (which I highly recommend anyway since there's a lot of valuable content there), but it will be made fully public over coarse of the next few months. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy, &lt;/div&gt;&lt;div&gt;Uri  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-3987588175331571361?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/3987588175331571361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=3987588175331571361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3987588175331571361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3987588175331571361'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2010/12/to-scale-or-not-to-scale-recording.html' title='To Scale or Not to Scale - the Recording'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-9022974031799265424</id><published>2010-11-05T01:23:00.001-07:00</published><updated>2010-11-05T01:31:25.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='Sql'/><category scheme='http://www.blogger.com/atom/ns#' term='NoSql'/><title type='text'>Yes, Sql!</title><content type='html'>See below the slide deck from my session today at &lt;a href="http://qconsf.com/"&gt;QCon SF&lt;/a&gt; titled "Yes, Sql!" (hopefully you liked it if you attended :) ). It focuses on how the classic querying models like plain SQL and JPA map to distributed data stores. It first reviews the current distributed data stores landscape, and its querying models (K/V, Column, Document), and discusses the wide range of APIs for data extraction from these data stores.  It then discusses the main challenges of mapping various APIs to a distributed data model as we've done over the past few months in GigaSpaces, and the trade offs to be aware off.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;color: #0000CC;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideboom.com/presentations/232665/Yes%2C-Sql%21" title="Yes, Sql!"&gt;Yes, Sql!&lt;/a&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="425" height="370" id="onlinePlayer232665"&gt;&lt;param name="movie" value="http://www.slideboom.com/player/player.swf?id_resource=232665" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="quality" value="high" /&gt;&lt;param name="bgcolor" value="#ffffff" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="flashVars" value="" /&gt;&lt;embed src="http://www.slideboom.com/player/player.swf?id_resource=232665" width="425" height="370" name="onlinePlayer232665" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"allowScriptAccess="always" quality="high" bgcolor="#ffffff" allowFullScreen="true" flashVars="" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View &lt;a href="http://www.slideboom.com" style="color: #0000CC;"&gt;more presentations&lt;/a&gt; or &lt;a href="http://www.slideboom.com/upload" style="color: #0000CC;"&gt;Upload&lt;/a&gt; your own.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The direct link is &lt;a href="http://www.slideboom.com/presentations/232665/Yes,-Sql!"&gt;http://www.slideboom.com/presentations/232665/Yes,-Sql!&lt;/a&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/5947766887998996490-9022974031799265424?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/9022974031799265424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=9022974031799265424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/9022974031799265424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/9022974031799265424'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2010/11/yes-sql.html' title='Yes, Sql!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-8249062438132418789</id><published>2010-10-19T13:53:00.000-07:00</published><updated>2010-10-19T22:08:30.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='XenServer'/><category scheme='http://www.blogger.com/atom/ns#' term='Netscaler'/><category scheme='http://www.blogger.com/atom/ns#' term='Citrix'/><title type='text'>Our Citrix Integration Demo</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;This week we’re attending the &lt;a href="http://www.interop.com/newyork/"&gt;Interop conference&lt;/a&gt; in New York to present our integrated solution with Citrix Netscaler and XenServer. The solution enables GigaSpaces XAP applications to utilize the Netscaler load balancer AND XenServer infrastructure to dynamically and automatically scale applications (e.g. a standard JEE web app) based on real time application load. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;The following screen cast demonstrates how a standard JEE web application (in this case the Spring framework &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;PetClinic demo application) is dynamically scaled on the &lt;a href="http://www.softlayer.com/"&gt;Citrix SoftLayer&lt;/a&gt; cloud. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;It runs on a number of virtual hosts which in turn run the Netscaler load balancer, the Web container and the MySql database. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;The demo shows how the web application automatically scales out when the load increases. The scale out process includes the following stages:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The system identifies that the average load has crossed a certain threshold.&lt;/li&gt;&lt;li&gt;&lt;span style="mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;/span&gt;The system dynamically starts a new Xen virtual machine to host a new instance of the web application. This VM includes the GigaSpaces Agent component which enables XAP to dynamically start new JVM to host another web application instance.&lt;/li&gt;&lt;li&gt;A new web application instance is provisioned to the newly started JVM&lt;/li&gt;&lt;li&gt;The Netscaler load balancer configuration is automatically updated to reflect the new web container and route traffic to it&lt;/li&gt;&lt;li&gt;The average load goes back to normal since the traffic is not evenly balanced across the old and new web container.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The demo also shows how the system automatically recovers from a forced virtual machine failure by re-instantiating the virtual machine and the GigaSpaces components on it, and then re-provisioning the missing web application instance onto it. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Enjoy,&lt;br /&gt;Uri &lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AYKF01oC" type="application/x-shockwave-flash" width="600" height="480" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-8249062438132418789?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/8249062438132418789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=8249062438132418789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/8249062438132418789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/8249062438132418789'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2010/10/our-citrix-integration-demo.html' title='Our Citrix Integration Demo'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-4057698199575931043</id><published>2010-04-14T04:38:00.001-07:00</published><updated>2010-04-14T04:45:10.494-07:00</updated><title type='text'>XAP 7.1 Released!</title><content type='html'>We've just released XAP version 7.1 today, and are very excited about what it has to offer!&lt;div&gt;You can find a good description of the release contents in &lt;a href="http://blog.gigaspaces.com/2010/04/13/gigaspaces-xap-71-being-released-tomorrow/"&gt;Joe Ottinger's post from yesterday.&lt;/a&gt; &lt;/div&gt;&lt;div&gt;I've also done a &lt;a href="http://news.dzone.com/articles/xap-71-adds-jetty-7-spring-3x"&gt;short interview for DZone&lt;/a&gt;, describing the motivation behind it and the overall vision we have for XAP (you're most welcome to vote for it :) ). &lt;/div&gt;&lt;div&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/5947766887998996490-4057698199575931043?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/4057698199575931043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=4057698199575931043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4057698199575931043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4057698199575931043'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2010/04/xap-71-released.html' title='XAP 7.1 Released!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-8863023441358593103</id><published>2009-10-27T10:40:00.001-07:00</published><updated>2009-10-27T10:40:50.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Join Us for the New XAP Security Framework Webinar</title><content type='html'>&lt;p&gt;&lt;font size="2"&gt;You’re welcome to join our XAP security webinar on Wednesday, October 28. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;In this webinar I’ll will explain the motivation behind our revamped security framework and overview its capabilities. The session will also include a live demo in which I’ll show how to secure the GigaSpaces runtime environment in a few simple steps, and how to enable security for a typical application without changing a single line of code or configuration. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;The webinar will be held at 9am PDT, 12pm EST, 5pm CET. Please click &lt;a href="https://www1.gotomeeting.com/register/215969577"&gt;here&lt;/a&gt; to register &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Hoping to see you tomorrow,      &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;Uri &lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-8863023441358593103?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/8863023441358593103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=8863023441358593103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/8863023441358593103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/8863023441358593103'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/10/join-us-for-new-xap-security-framework.html' title='Join Us for the New XAP Security Framework Webinar'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-192255829822612882</id><published>2009-09-15T06:38:00.001-07:00</published><updated>2009-09-21T06:08:14.888-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>GigaSpaces XAP 7.0.1 Is Out!</title><content type='html'>&lt;p&gt;I’m happy to announce that today we’ve released our &lt;a href="http://www.gigaspaces.com/LatestProductVersion"&gt;latest version&lt;/a&gt;, XAP 7.0.1. I would like to share with you a few details about it. Version 7.0.1 is a service pack release on top of version 7.0.0 and as such is backwards compatible with it. In addition to a number of bug fixes on top of 7.0.0, It includes some very interesting features and improvements around 3 main areas: Enterprise grade security, improved usability and APIs and better troubleshooting and monitoring capabilities. In addition to that, we’ve also worked on further optimizing the performance of our data grid implementation. Here’s a short description of the release highlights:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Security: &lt;/strong&gt;7.0.1 introduces &lt;strong&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Security"&gt;a revamped security implementation&lt;/a&gt; &lt;/strong&gt;for the best possible data grid security. This implementation was specifically designed to support enterprise and cloud data grid scenarios in which the data grid is accessed by multiple applications and serves as a central data repository. In terms of relevance to the cloud, it brings a new level of data security which enables you to safely store data in cloud environments without having to worry about security hazard related to storing your data off premises. In addition to transport level security for all data grid related communication (based on SSL), it includes support for users and roles, with a comprehensive permissions system to enforce authorization for every operation, starting from the management of the GigaSpaces infrastructure, processing units and space (data grid) instances and ending with content based authorization to access the data grid contents and operate on it. The new security implementation is fully supported by the various management interfaces (GUI, CLI and administration API) and also provides open APIs for integration with 3&lt;sup&gt;rd&lt;/sup&gt; party user registries. For more details please refer to &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Security"&gt;this page&lt;/a&gt;. We will also dedicate a separate blog post to this important aspect of the XAP 7.0.1.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;API and Usability: &lt;/strong&gt;      &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;All new space based remoting implementation for XAP.NET&lt;/strong&gt;. Space based remoting has been around since version 6.0 in XAP for Java and extends the Spring remoting stack to provide a wealth of benefits in comparison to traditional remoting implementations, such as: high availability of exposed services, transparent client side failover, location transparency, load balancing across services in the cluster, map/reduce support and asynchronous invocation (please refer to “The Service Virtualization Framework” white paper in our &lt;a href="http://www.gigaspaces.com/WhitePapers"&gt;whitepapers section&lt;/a&gt; if you’d like to further learn about the benefits of space based remoting). As of version 7.0.1, it is also available for our XAP.NET users with all the goodies which are part of the Java implementation. The documentation of this feature can be found &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7NET/Space+Based+Remoting"&gt;here&lt;/a&gt;. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;XAP.NET built processing unit container&lt;/strong&gt;. In order to further ease and simplify the processing unit development and deployment experience in XAP.NET, we've implemented the &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7NET/Basic+Processing+Unit+Container"&gt;Basic Processing Unit Container&lt;/a&gt;, which is a smart built in implementation of the processing unit container interface. This container automatically starts and manages GigaSpaces related components for you (such as space instances, event containers and remote service endpoints), relieving you from the need to explicitly manage the life cycle of those components and allowing you to focus on your application’s business logic. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Easier cache eviction policy configuration&lt;/strong&gt;. This is a nice little configuration improvement that makes our users’ life easier when configuring the cache eviction policy. In previous releases, the recommended way to control the eviction policy was by using space properties. In 7.0.1, this has been made much more elegant with native XML namespace and Java code configuration support. Here’s an example of how you would have configured LRU eviction in your pu.xml and in code in 7.0.0 and 7.0.1:           &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_ksxjtYRhpeY/Sq-Y0lyvhTI/AAAAAAAAAno/WVen1zaZqEI/s1600-h/clip_image008%5B4%5D.jpg"&gt;&lt;img title="clip_image008" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="77" alt="clip_image008" src="http://lh6.ggpht.com/_ksxjtYRhpeY/Sq-Y1OPyO1I/AAAAAAAAAns/NKRLPl5Ai1I/clip_image008_thumb%5B1%5D.jpg?imgmax=800" width="152" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_ksxjtYRhpeY/Sq-Y1sEJ3TI/AAAAAAAAAnw/0k2dQpLLGHw/s1600-h/clip_image010%5B3%5D.jpg"&gt;&lt;img title="clip_image010" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="82" alt="clip_image010" src="http://lh6.ggpht.com/_ksxjtYRhpeY/Sq-Y2fe1UaI/AAAAAAAAAn0/1TZ7e-V_GQs/clip_image010_thumb.jpg?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Extended Indexing at the property level&lt;/strong&gt;: Extended indexing allows you to index properties of objects written to the space with a BTree index, thus allowing for range queries (based on the property type’s &lt;a href="http://java.sun.com/docs/books/tutorial/collections/interfaces/order.html"&gt;natural ordering&lt;/a&gt;). Prior to 7.0.1, extended indexing was only available at the class level, which means you had to either use the extended index for all the properties of a certain class or for none at all (and make do with basic indexing). In 7.0.1, we’ve enabled extended indexing at the property level, so you can now choose the right indexing scheme for each property. For example, the identifier property of a certain class would typically be indexed with a basic index, which does not have a sense of order between indexed values and is therefore more lightweight and faster than extended indexing. For another date/time or number property, you would use the extended indexing since if you would like to perform range queries (e.g. all the objects with date property before 1/1/2009). This can be configured via annotations, e.g. &lt;span style="font-size: 85%; font-family: courier new"&gt;@SpaceProperty(index=IndexType.Extended) &lt;/span&gt;or via XML, e.g.           &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;&amp;lt;property name=&amp;quot;lastName&amp;quot; index=&amp;quot;EXTENDED&amp;quot;/&amp;gt;&lt;/span&gt;.           &lt;br /&gt;          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Performance improvements for embedded operations&lt;/strong&gt;. As with every release, we have dedicated quite a lot of time to further optimize areas which we knew could be improved. In this release we have focused on performance of embedded space operations and by optimizing the concurrency of internal thread and object pools we have been able to present improvements of up to 200% for embedded space operations. The following graphs show across-the-board improvements in comparison to 7.0.1 (these were measured with 8 threads concurrently accessing the space). It is important to mention that these improvements were achieved without any sacrifice to the consistency and correctness of the space operations:       &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_ksxjtYRhpeY/Sq-YxEkQ_NI/AAAAAAAAAnQ/9tkE1vlr7YM/s1600-h/clip_image002%5B4%5D.jpg"&gt;&lt;img title="clip_image002" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="131" alt="clip_image002" src="http://lh3.ggpht.com/_ksxjtYRhpeY/Sq-YxpHFfeI/AAAAAAAAAnU/NN2lGMwTZy4/clip_image002_thumb%5B1%5D.jpg?imgmax=800" width="176" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_ksxjtYRhpeY/Sq-YyYR2xuI/AAAAAAAAAnY/rdp_sUp1rr8/s1600-h/clip_image004%5B4%5D.jpg"&gt;&lt;img title="clip_image004" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="137" alt="clip_image004" src="http://lh5.ggpht.com/_ksxjtYRhpeY/Sq-Yy7F2slI/AAAAAAAAAnc/MFnfHDTh4Qc/clip_image004_thumb%5B1%5D.jpg?imgmax=800" width="185" border="0" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_ksxjtYRhpeY/Sq-YzpE-KpI/AAAAAAAAAng/1lLS-kBRtZc/s1600-h/clip_image006%5B4%5D.jpg"&gt;&lt;img title="clip_image006" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="140" alt="clip_image006" src="http://lh4.ggpht.com/_ksxjtYRhpeY/Sq-Y0Jg4llI/AAAAAAAAAnk/9zsdK83X_oQ/clip_image006_thumb%5B1%5D.jpg?imgmax=800" width="144" border="0" /&gt;&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Better troubleshooting and monitoring:&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;More information in log files&lt;/strong&gt;: We are continuing to improve the quality and amount of information exposed via our log files. 7.0.0 introduced some major logging improvements (per-pu log messages, improved file naming scheme, time-based rollover policies and more). In 7.0.1 we’ve added some more helpful information to help you tune and troubleshoot the system. The first one is GC awareness. You can define a GC pause upper threshold (10 seconds by default). In case the garbage collection process takes longer, the system will log this for future reference. In addition, we’ve added logging for the recovery process (which occurs when starting a backup space instance and recovering the data from the primary) so you can now tell exactly what happened during the process and how long it took &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Replication statistics in administration API&lt;/strong&gt;. This is an important addition to the &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Administration+and+Monitoring+API"&gt;administration API&lt;/a&gt; which enables you to monitor the rate at which objects are replicated and whether or not there’s an issue with the replication mechanism. For more details refer to the &lt;span style="font-size: 85%; font-family: courier new"&gt;org.openspaces.admin.space.SpaceInstanceStatistics&lt;/span&gt; interface(specifically, the &lt;span style="font-size: 85%; font-family: courier new"&gt;getReplicationStatistics() &lt;/span&gt;method). &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As always, we would be happy to hear your feedback on the new release (you can send it directly to feedback7.0 at gigaspaces dot com). For the complete release content please consult to the &lt;a href="http://www.gigaspaces.com/wiki/display/RN/GigaSpaces+7.0.x+Release+Notes"&gt;official 7.0.x release notes&lt;/a&gt; (refer to the notes relevant for 7.0.1). &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-192255829822612882?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/192255829822612882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=192255829822612882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/192255829822612882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/192255829822612882'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/09/gigaspaces-xap-701-is-out.html' title='GigaSpaces XAP 7.0.1 Is Out!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ksxjtYRhpeY/Sq-Y1OPyO1I/AAAAAAAAAns/NKRLPl5Ai1I/s72-c/clip_image008_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-986220872055066010</id><published>2009-08-05T05:55:00.001-07:00</published><updated>2009-08-05T05:56:10.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>StockDemo and GigaSpaces Petclinic for XAP 7.0 Now Available</title><content type='html'>&lt;p&gt;If you’ve been following our webinars and demos in the last year or so, in many of them we’ve used two applications to demonstrate the product. The first one is the &lt;a href="http://www.openspaces.org/display/DAE/Stock+Demo+Documentation"&gt;stock demo&lt;/a&gt;, which is an AJAX enabled Spring MVC web application that communicates with the Space and displays real time stock quotes. The second one is the good old &lt;a href="http://www.openspaces.org/display/DAE/GigaSpaces+PetClinic"&gt;Spring PetClinic application&lt;/a&gt; with the data access layer accessing GigaSpaces instead of a relational database, and persisting asynchronously to a MySql database (via Hibernate). &lt;/p&gt;  &lt;p&gt;I’ve been planning for quite some time now to port both application to XAP 7.0 due to the &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Packaging+and+Deployment"&gt;packaging and deployment&lt;/a&gt; improvements of this version. &lt;/p&gt;  &lt;p&gt;I finally found the time to do this after finalizing the 7.0 release. You may now find the &lt;a href="http://www.openspaces.org/display/DAE/Project+Downloads"&gt;up to date version&lt;/a&gt; of both applications on our forge site, &lt;a href="http://www.openspaces.org/"&gt;OpenSpaces.org&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Note that both applications are also available as one-click demos on our &lt;a href="http://www.gigaspaces.com/cloud"&gt;cloud framework&lt;/a&gt;. The 7.0 compatible-version will soon be made available on this framework as well. &lt;/p&gt;  &lt;p&gt;Enjoy,   &lt;br /&gt;Uri &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-986220872055066010?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/986220872055066010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=986220872055066010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/986220872055066010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/986220872055066010'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/08/stockdemo-and-gigaspaces-petclinic-for.html' title='StockDemo and GigaSpaces Petclinic for XAP 7.0 Now Available'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-514253534922204844</id><published>2009-07-25T14:09:00.000-07:00</published><updated>2009-07-25T03:13:27.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Join Us for the 7.0 Overview Webinar</title><content type='html'>&lt;p&gt;You’re all welcome to join our 7.0 introduction webinar next Tuesday (July 28). In this technical update and live demo, I will go over the new and noteworthy in the 7.0 release. &lt;/p&gt;  &lt;p&gt;Joining me in this webinar will be &lt;a href="http://www.kimchy.org/"&gt;Shay Banon&lt;/a&gt;, our System Architect (who also runs the &lt;a href="http://www.compass-project.org/"&gt;Compass project&lt;/a&gt; in his spare time). &lt;/p&gt;  &lt;p&gt;I will explain how GigaSpaces XAP combines a robust in-memory data grid, the Jetty web container and a grid-based business logic execution framework to form a single, easy-to-use platform on which you can build and run extremely scalable enterprise applications. &lt;/p&gt;  &lt;p&gt;Key release highlights which I’ll cover in this webinar include performance and scalability improvements, new monitoring and administration API, new data grid APIs and cloud integration. These will be illustrated through the use of live demos.&lt;/p&gt;  &lt;p&gt;Shay will describe a real life use case in which XAP 7.0 was used to implement a distributed search functionality on a social network and drastically improve the performance of the application. &lt;/p&gt;  &lt;p&gt;Please click &lt;a href="http://www.gigaspaces.com/node/1265"&gt;here&lt;/a&gt; to register. Note that for your convenience the webinar will be held twice, on two separate schedules, to accommodate for different time zones.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-514253534922204844?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/514253534922204844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=514253534922204844' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/514253534922204844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/514253534922204844'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/07/join-us-for-70-overview-webinar.html' title='Join Us for the 7.0 Overview Webinar'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-2794839854222070984</id><published>2009-05-24T00:07:00.000-07:00</published><updated>2009-05-24T00:51:47.121-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Building GigaSpaces Apps in Minutes with Giga Systems Builder</title><content type='html'>If you're into &lt;a href="http://en.wikipedia.org/wiki/Model-driven_architecture"&gt;MDA&lt;/a&gt;, there are some great news for you. One of our partners, &lt;a href="http://www.nte.co.uk/java/index.html"&gt;New Technology/enterprise (NT/e)&lt;/a&gt; has created a very impressive tool to build and deploy end-to-end GigaSpaces applications in minutes. The tool is called &lt;a href="http://www.nte.co.uk/java/gsb.html"&gt;GigaSystemsBuilder (GSB).&lt;/a&gt;&lt;br /&gt;GSB is an Eclipse plugin which makes it quick and easy for Java developers to model, code and deploy GigaSpaces applications.&lt;br /&gt;Since it's based on well known and battle-proven patterns on top of the GigaSpaces XAP platform, it reduces learning time and on-going development effort, and also increases the likelihood of successful projects.&lt;br /&gt;It covers the entire application life cycle, and enables you to model, code, build, run and even deploy the application on the cloud (using our &lt;a href="http://www.gigaspaces.com/wiki/display/CCF/CCF4XAP+Documentation+Home"&gt;cloud framework&lt;/a&gt;) in a few clicks from within your IDE.&lt;br /&gt;The tool is free for development and deployment, and comes with optional paid support package from NT/e.&lt;br /&gt;A good place to start exploring this tool is this &lt;a href="http://www.nte.co.uk/java/movies/GigaSystemBuilder%20101/GigaSystemBuilder%20101.html"&gt;10-minute screen cast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;Uri&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-2794839854222070984?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/2794839854222070984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=2794839854222070984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2794839854222070984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2794839854222070984'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/05/building-gigaspaces-apps-in-minutes.html' title='Building GigaSpaces Apps in Minutes with Giga Systems Builder'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-3205741477519174315</id><published>2009-05-10T07:58:00.000-07:00</published><updated>2009-05-12T06:32:04.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>UI &amp; Manageability Improvements in XAP 7.0</title><content type='html'>As GigaSpaces XAP 7.0 release is &lt;a href="http://www.jroller.com/gnirpaz/entry/r7_0_m8_feature_complete"&gt;getting closer&lt;/a&gt;, it's time to overview some of the important new features and enhancements of this version. In this post I will focus on the manageability aspects of this release. I'll review the general concepts behind the management interfaces, namely the GUI and the new Administration API, and will also touch on these two interfaces.&lt;br /&gt;I will dedicate separate posts to each of them in future to keep things in a digestible size.&lt;br /&gt;&lt;br /&gt;One of the main issues with previous releases was that the tooling behind the product provided a lot of information about the GigaSpaces runtime, but the data was not fully organized according the product's domain model, and the tools did not expose all of the capabilities that you would have expected. In this release we have gone a great to deal to make sure the management interfaces are comprehensive, coherent, easy to use and accurately reflect to product's domain model.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The GigaSpaces Domain Model&lt;/span&gt;&lt;br /&gt;GigaSpaces is very simple to understand if you look at things hierarchically, starting from the physical infrastructure and ending at the application level.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;The physical infrastructure level:&lt;/span&gt;&lt;span style="font-size:100%;"&gt; At the bottom level, you have the physical infrastructure, which includes the physical (or virtual, if you're running on the cloud) hosts. Information about this level includes CPU, memory and network utilization, and naturally machine level properties such as operating system, processor architecture, etc.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;The process/JVM level: &lt;/span&gt;&lt;span style="font-size:100%;"&gt;The next level is the JVM level, which hosts three main components:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;  &lt;li&gt;&lt;span style="font-size:100%;"&gt;The GigaSpaces container (GSC) - this is a lightweight container, which hosts deployed application instances (e.g. a data grid instance, a Spring application or a web application instance). It's in fact a meta container, which exposes SLA and manageability capabilities on top of other lightweight containers such as Spring or Jetty.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The GigaSpaces manager (GSM) - this is the actual deployment manager. You deploy your application to the GSM, which takes care of provisioning application instances to the running GSCs and mobilizing the deployed application binaries to these GSCs. It is also responsible for monitoring the state of the deployed applications and using the GSCs to enforce the SLA requirements, e.g.  take action if a certain application instance fails&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The GigaSpaces agent (GSA) - New in 7.0. Think of it as a daemon or a background service which simply start and stops the other services (GSM, GSC) and receives remote commands from the management interface (GUI or admin API)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Information about this layer includes JVM systems properties, JVM stats (available heap size, number threads, GC stats, etc.) and information specific to the above components, such as the applications managed by a specific GSM or the application instances running on a certain GSC. This layer can also be actively managed, e.g. start, stop and restart components.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;The &lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;processing unit&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt; (application) level: &lt;/span&gt;&lt;span style="font-size:100%;"&gt;The next level is the processing unit level. A processing unit is, simply put, the deployment and packaging unit. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;A certain application can be composed of one or more processing units. A processing unit can take multiple forms, but in general we distinguish between 3 types of processing units:&lt;br /&gt;&lt;/span&gt;&lt;ul  style="font-family:verdana;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Data only, which only contains a data grid&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Business logic only, which contains application code which may or may not access a data grid, but does not host the actual data grid instance&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Data and business logic, which contains both the data grid and business logic, which in most cases interacts with the embedded data grid in memory to achieve the lowest possible latency the highest level of scalability&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt;Once deployed, the processing unit has one or more &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;instances, e.g. a data only processing unit with 5 space partitions would have 5 instances. If we define a backup to each of the partitions then it would have 10 instances. Typically, the processing unit is configured via Spring, with custom GigaSpaces namespace bindings to reflect the SLA associated with it and the GigaSpaces components it may contain. Furthermore, in version 6.6, we have also implemented processing units which are plain JEE web applications, &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Mule+ESB"&gt;Mule&lt;/a&gt; applications or even &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7NET/.NET+Processing+Unit+Container"&gt;.Net&lt;/a&gt; applications. This can be thought of as a mere extension to the basic processing unit model (after all, all of the above also run business logic and may or may not contain a space).&lt;br /&gt;Information about this layer includes the processing unit's name, type, number of instances, its contents, e.g. space instances, web application instances, exposed remote service and so on.&lt;br /&gt;It also includes runtime statistics like the throughput of space operations, web requests per second if it's a JEE web app, and many more runtime characteristics.&lt;br /&gt;Operations that can be taken on this layer include deployment, undeployment, relocation from one GSC to another, restart of a certain instance, increment/decrement the number of instances, etc.&lt;br /&gt;&lt;br /&gt;The following diagram depicts the above (click to enlarge):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ksxjtYRhpeY/SgfUyU-4StI/AAAAAAAAAkM/hNnLEANbj6w/s1600-h/admin-layers.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 132px;" src="http://3.bp.blogspot.com/_ksxjtYRhpeY/SgfUyU-4StI/AAAAAAAAAkM/hNnLEANbj6w/s400/admin-layers.jpg" alt="" id="BLOGGER_PHOTO_ID_5334466244734634706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;The management interfaces&lt;/span&gt;&lt;br /&gt;Let's start with the admin API. This is a completely new API, which gives you full control over the entire lifecycle of the GigaSpaces runtime components. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;Using this API, you can start and stop any GigaSpaces component (literally, at the JVM process level!)  or even your own custom components, deploy and undeploy your processing units, and monitor almost any aspect you can think of using either polling or event based notifications. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;Monitorable entities are all the ones mentioned above, namely the physical hosts (CPU, memory, network utilization), JVMs (number of threads, available heap memory, object count, etc.), deployed processing units (transactions committed, space data, JEE requests stats) or even the underlying network layer. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;The main benefit of this API, besides it's cleanliness and completeness, is that opens a variety of options to extend the core product functionality, e.g. implement sophisticated cluster-side bootstrapping, easily integrate with any 3rd party monitoring tools, implement automatic scaling for your web application (as shown in &lt;a href="http://blip.tv/file/1967368/"&gt;my latest webinar&lt;/a&gt;) and much more. But that's something I'll cover in detail in a separate post.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:100%;"&gt;As for the GUI, it also caters for all of the above, but allows to view everything graphically (and as they say, a picture is worth a thousand words). We used the excellent &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq Mockup&lt;/a&gt; tool to quickly create sketches of the way we want to see things, and from there the job went fairly smoothly. The user interface is now divided into 3 main tabs:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Hosts: which gives a physical view of things, but also shows the entire component hierarchy described above&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Applications: which focuses on the logical side of things, namely deployed processing unit and the components they contain&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Space browser: a pure data-grid only view to enable you to focus on data grid aspects&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Naturally, besides viewing things you are also able to operate on the cluster and do all the above mentioned operations using the UI (.e.g. restart a certain JVM, relocate a running processing unit instance from on host to another, or even increase the number of processing unit instances).&lt;br /&gt;The following image shows how we went from mockup to real implementation (in this case showing the "Hosts" view):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ksxjtYRhpeY/SgfOlTD-FBI/AAAAAAAAAkE/zo1cquczI4k/s1600-h/ui-7.0.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 141px;" src="http://1.bp.blogspot.com/_ksxjtYRhpeY/SgfOlTD-FBI/AAAAAAAAAkE/zo1cquczI4k/s400/ui-7.0.jpg" alt="" id="BLOGGER_PHOTO_ID_5334459423811048466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I encourage you to give it a try and let us know what you think. Naturally this milestone 8 and not the final release so there are a few more tweaks and improvements we will add, but this can give you the general sense of things.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;Uri&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&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/5947766887998996490-3205741477519174315?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/3205741477519174315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=3205741477519174315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3205741477519174315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3205741477519174315'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/05/ui-manageability-improvements-in-xap-70.html' title='UI &amp; Manageability Improvements in XAP 7.0'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ksxjtYRhpeY/SgfUyU-4StI/AAAAAAAAAkM/hNnLEANbj6w/s72-c/admin-layers.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-6104481210486802513</id><published>2009-03-25T06:35:00.000-07:00</published><updated>2009-03-25T09:26:29.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>My Session at the Banking and Finance Technology Forum in HK</title><content type='html'>You're welcome to view my session from the annual Banking and Finance Technology Forum held last week in Hong Kong. The session is 20 minutes long, and deals with the challenges in developing and deploying applications on the cloud as opposed to your local IT environment.&lt;br /&gt;I want to take the opportunity and thank our partners at &lt;a href="http://www.clustertech.com/"&gt;Cluster Technologies&lt;/a&gt; for setting up a very nice booth and making all the arrangements for the conference.&lt;br /&gt;As always, HK was action packed. Besides the conference, I had some very good meetings with various customers and prospects that focused on our &lt;a href="http://www.gigaspaces.com/wiki/display/RN/What%27s+New+in+GigaSpaces+7.0.0"&gt;upcoming 7.0 release&lt;/a&gt; and the &lt;a href="http://www.mulesource.com/resources/userinfo.php?fileId=34"&gt;GigaSpaces-Mule&lt;/a&gt; integration package which seems to be gaining quite a nice momentum these days.&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AfXLP5CzWA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; &lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;Uri&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-6104481210486802513?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/6104481210486802513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=6104481210486802513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6104481210486802513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6104481210486802513'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/03/my-session-at-banking-and-finance.html' title='My Session at the Banking and Finance Technology Forum in HK'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-2049262049920311347</id><published>2009-02-22T15:12:00.000-08:00</published><updated>2009-02-22T05:13:42.246-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Scalable SOA with Mule &amp; GigaSpaces</title><content type='html'>If you missed the joint Webinar &lt;a href="http://blog.mulesource.org/author/kenyagen/"&gt;Ken Yagen&lt;/a&gt; of MuleSource and I did last week, you can find the recorded version &lt;a href="http://www.mulesource.com/resources/userinfo.php?fileId=34"&gt;here&lt;/a&gt;. The demo application shown during the webinar can be downloaded &lt;a href="http://www.mulesource.com/webinars/gigaspaces/mule-gs-demo.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;The demo application requires the following to be installed on your machine: &lt;ul&gt;&lt;li&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/www.mulesource.org/display/MULE/Download');" href="http://www.mulesource.org/display/MULE/Download" target="_self"&gt;Mule 2.1.2 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/www.gigaspaces.com/wiki/display/RN/GigaSpaces+7.0.0+Early+Access');" href="http://www.gigaspaces.com/wiki/display/RN/GigaSpaces+7.0.0+Early+Access" target="_blank"&gt;Latest GigaSpaces XAP7.0 early access release &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/www.springsource.org/download');" href="http://www.springsource.org/download" target="_blank"&gt;Spring framework 2.5.6 or higher&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Please note that the Mule/GigaSpaces integration is also available in the &lt;a href="http://www.gigaspaces.com/LatestProductVersion"&gt;latest GigaSpaces GA release (6.6.x)&lt;/a&gt;, but XAP 6.6.x only supports the Mule 2.0 branch and not 2.1.&lt;br /&gt;The documentation for the integration can be found &lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Mule+ESB"&gt;here (6.6.3)&lt;/a&gt; and &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Mule+Processing+Unit"&gt;here (7.0 EA)&lt;/a&gt;.&lt;br /&gt;If you have any question please drop me a note here or use our &lt;a href="http://forum.openspaces.org/forum.jspa?forumID=175"&gt;online forums&lt;/a&gt;&lt;a href="http://forum.openspaces.org/forum.jspa?forumID=175"&gt;.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to take the opportunity and thank Ken and the rest of the team at MuleSource for hosting this webinar and giving us the chance to present the joint solution to the community.&lt;br /&gt;&lt;br /&gt;Uri&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-2049262049920311347?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/2049262049920311347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=2049262049920311347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2049262049920311347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2049262049920311347'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/02/scalable-soa-with-mule-gigaspaces_21.html' title='Scalable SOA with Mule &amp; GigaSpaces'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-7707334217232323241</id><published>2009-02-10T00:10:00.000-08:00</published><updated>2009-02-22T05:09:19.892-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Scalable SOA - with Mule &amp; GigaSpaces</title><content type='html'>You are welcome to &lt;a href="https://admin.acrobat.com/_a825170768/scale/event/registration.html"&gt;join&lt;/a&gt; Ken Yagen, Sr. Director of Engineering at MuleSource, and myself for our joint webinar on scaling your SOA implementation with GigaSpaces and Mule. The webinar will take place on Wednesday, February 11th 2009, at 9am PT / noon ET / 6pm CET.&lt;br /&gt;In this webinar we will introduce the &lt;a href="http://natishalom.typepad.com/nati_shaloms_blog/2009/02/simple-and-cost-effective-entpreisesoa-with-gigaspaces-and-mule.html"&gt;Mule &amp;amp; GigaSpaces joint solution&lt;/a&gt; and discuss the underlying details around how this integration works. We will also discuss a real life use case and present a short demo that shows the benefits of this integration.&lt;br /&gt;&lt;br /&gt;See you there!&lt;br /&gt;&lt;br /&gt;Uri&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-7707334217232323241?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/7707334217232323241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=7707334217232323241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7707334217232323241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7707334217232323241'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2009/02/scalable-soa-with-mule-gigaspaces.html' title='Scalable SOA - with Mule &amp; GigaSpaces'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-4538343400516225469</id><published>2008-12-30T00:46:00.001-08:00</published><updated>2009-01-11T05:31:29.277-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>XAP 7.0 Is on the Move!</title><content type='html'>After the release of GigaSpaces XAP 6.6, we are now deep into the planning and development of our next major release, 7.0.  This release, which is due in mid 2009, will include a few major themes, such as significantly better administration and monitoring capabilities, network resources optimizations, highly optimized and flexible local cache, reduced memory footprint, improved deployment model and support for deployment on the cloud.&lt;br /&gt;&lt;p&gt;If you've been following us in the past few years, you know that our R&amp;amp;D is practicing &lt;a href="http://www.youtube.com/watch?v=Q5k7a9YEoUI" target="scrum_pres"&gt;SCRUM&lt;/a&gt; for quite a while now as part of the development process. Our head of R&amp;amp;D, &lt;a href="http://www.jroller.com/gnirpaz/" target="nirpaz_blog"&gt;Guy Nirpaz&lt;/a&gt;, has &lt;a href="http://www.jroller.com/gnirpaz/entry/scrum_gigaspaces" target="scrumatgiga"&gt;talked about it&lt;/a&gt; numerous times to both our users and the development community at large. The nature of SCRUM and the fact that it's composed of sprints enable us to share recently developed features with our community, as we've done in the past for versions 6.5 and 6.6.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Our sprints last two weeks, at the end of which we publish the results of the sprint as an early access milestone release. &lt;a href="http://www.gigaspaces.com/wiki/display/RN/What%27s+New+in+GigaSpaces+7.0.0" target="eap"&gt;Our 7.0 early access program&lt;/a&gt; already includes the first two milestone releases, which you can download and play with. We will be happy to hear any feedback you have. The first two milestones include the following highlights:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Significantly improved cache eviction policies (most notably a &lt;span style="font-weight: bold;"&gt;new LRU implementation&lt;/span&gt;)&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;which improves LRU performance by a factor of &lt;span style="font-weight: bold;"&gt;10 &lt;/span&gt;to &lt;span style="font-weight: bold;"&gt;20 times &lt;/span&gt;(depending on the operation) for read operations without impacting write operation performance &lt;/li&gt;&lt;li&gt;Support for time based window scenarios by &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/POJO+Support+%28Annotations%2C+gs.xml%29+-+Advanced#POJOSupport%28Annotations%2Cgs.xml%29-Advanced-FieldLevelDecoration@SpaceLeaseExpiration" target="lease"&gt;maintaining the entry lease as part of the POJO instance&lt;/a&gt;. You can now annotate a field with the &lt;tt&gt;@SpaceLeaseExpiration&lt;/tt&gt; annotation and the space will use it to store and retrieve the lease expiration time for the instance. This value can later be propagated to an external data source. Based on it, expired instances can be filtered out of the space when loaded from the database.&lt;/li&gt;&lt;li&gt;The UI now enables you to the processing unit elements and the space cluster that belong to it in the same tab, so you have a coherent and intuitive view on your application components in one location. It also contains a summary view of all the space cluster details which enables you to quickly understand how your space cluster is functioning and what state it's in, as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ksxjtYRhpeY/SVpBRqg-rPI/AAAAAAAAAhI/jqAy-sFvanE/s1600-h/new+ui.jpg" target="newuiimage"&gt;&lt;img style="cursor: pointer; width: 400px; height: 247px;" src="http://1.bp.blogspot.com/_ksxjtYRhpeY/SVpBRqg-rPI/AAAAAAAAAhI/jqAy-sFvanE/s400/new+ui.jpg" alt="" id="BLOGGER_PHOTO_ID_5285608884398894322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP7NET/Local+Cache" target="dotnetlc"&gt;Ultra Fast Native local cache for XAP .Net&lt;/a&gt; - we have implemented our very own ConcurrentHashMap like data structure in .Net, which enables you to enjoy a performance of &lt;span style="font-weight: bold;"&gt;millions of ID based read operations per second&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SQL query optimizations: the space now processes SQL queries with OR staements in parallel, taking advantage of multi-core environments for reduced overall query times&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improved CLI deployment support: your deployment command will now only return after all application instances have been provisioned, enabling you to create complex scripts to deploy multiple dependant processing units&lt;/li&gt;&lt;/ul&gt;Naturally, there's a lot more than meets the eyes, and we're continuing to work on new and exciting stuff. You can stay tuned using our &lt;a href="http://www.gigaspaces.com/wiki/display/RN/What%27s+New+in+GigaSpaces+7.0.0" target="eap2"&gt;7.0 early access page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy new year,&lt;br /&gt;Uri&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-4538343400516225469?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/4538343400516225469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=4538343400516225469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4538343400516225469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4538343400516225469'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/12/xap-70-is-on-move.html' title='XAP 7.0 Is on the Move!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ksxjtYRhpeY/SVpBRqg-rPI/AAAAAAAAAhI/jqAy-sFvanE/s72-c/new+ui.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-2132419805086857842</id><published>2008-11-29T23:05:00.000-08:00</published><updated>2009-01-11T05:31:13.578-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Some Things that Kept Us Busy Lately</title><content type='html'>It's been a quite while since I last posted, but things have been more active than ever here at GigaSpaces. I'm writing this on the way back from Tokyo and HK, where I've had a few days packed with meetings with partners, prospects and customers (and of course good food and drinks…). It sometimes amazes me what people actually do and plan to do with our product, but I must admit that this time I was really blown away by some of the things I saw. Besides some very interesting meetings with number of financial institutions (many of which actually want to take advantage of the current crisis seeking to upgrade and improve their systems so that they'll be ready when things pick up), I also met companies from other sectors that are taking the product to uncharted territories, but in a good sense. Just to give you a taste of things (hopefully I will be able to discuss them in detail in a separate post), one of our customers implemented a system to share complex 3D models between designers and perform various types of simulations on it, doing real time sharing through GigaSpaces. Since they chose .Net as the implementation platform for this application, they used GigaSpaces XAP .Net to perform the model sharing, and when you see in your eyes how a complex and details 3D model is loaded from one client and gradually appears on a bunch of other machines, this is truly impressive.&lt;br /&gt;It also made me proud to see that many of our new features are adopted and used widely. Which brings me to the main topic – what kept us busy lately.&lt;br /&gt;First of all, we have released our 6.6 branch in September, which might well be the first version to truly offer an end-to-end application platform. Some of the things. Here's a glimpse of what it offers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Web+Processing+Unit+Container"&gt;Standard JEE web application support&lt;/a&gt; (via the Jetty web container)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66NET/"&gt;An optimized, native .Net distribution&lt;/a&gt; (named XAP .Net), with full SBA capabilites&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Executors+Component"&gt;A brand new task processing API&lt;/a&gt; (including peer classloading capabilities)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Scripting+Component"&gt;Support for dynamic language invocation across the grid&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Further enhancements of our r&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Remoting+(SVF)"&gt;emoting capabilities&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Maven+Plugin"&gt;Maven integration&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improved annotation support for configuring &lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Messaging+and+Events"&gt;messaging &lt;/a&gt;and &lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Remoting+(SVF)"&gt;remoting &lt;/a&gt;components&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/docs/JavaDocOS6.6/org/openspaces/core/GigaSpace.html#asyncRead(com.j_spaces.core.client.Query)"&gt;Asyncronous operations&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Mule+ESB"&gt;Out of the box integration with the Mule ESB&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/Platform+Interoperability+in+GigaSpaces"&gt;Seamless interoperability between Java, .Net and C++&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;UI improvements &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Optimizations, optimizations, optimizations…&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/XAP66/"&gt;Revamped documentation web site&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I encourage you all to give it a try and provide us your feedback. You can find the complete list of changes and enhancements &lt;a href="http://www.gigaspaces.com/wiki/display/RN/What's+New+in+GigaSpaces+6.5.X+and+6.6.X"&gt;here&lt;/a&gt;. &lt;br /&gt;Besides the official 6.6 release (we've just released 6.6.2 - which I'll discuss in a separate post), we have also invested significant effort in integrating GigaSpaces with cloud and virtualization vendors. The integration package with Amazon EC2 enables you in a single click to provision EC2 instances, install GigaSpaces XAP on them, start GigaSpaces containers and deploy your application to them. Furthermore, it can also provision a MySql database that sits on top of Amazon EBS, and an apache load balancer incase you deployed a web application. Monitoring is done through our stadard user interface, which runs on the cloud and is displayed automatically as a local window on your pc. And the nice part of it is that it's all done via a web application, so no special installation is required to use it. We are currently at beta stages with this offering, and will soon make it publicly available. In fact, we already have quite a few customers that are using XAP on EC2 in production.&lt;br /&gt;&lt;br /&gt;On another front, we have completely revamped our training offering (this is a good chance to thank &lt;a href="http://www.tricode.nl/"&gt;Tricode&lt;/a&gt;, our Dutch partners, for taking this on and providing high quality results).The syllabus and details will soon be made available on our web site. The general idea was to create a modular training for various target audiences besides the usual core training (which was also completely rewritten). We offer both on site and public training. We will publish the next available schedule soon.&lt;br /&gt;&lt;br /&gt;On the performance benchmarks front, Shay Hassidim, out deputy CTO, has been conducting numerous benchmarks in the last few months, which cover many aspects such as scalability, latency, web application performance and more. These benchmarks &lt;a href="http://blog.gigaspaces.com/category/benchmarks/"&gt;are posted from regularly in our company blog&lt;/a&gt;, and we have categorized them all for your convenience under one category. We will of course keep doing these benchmarks to provide more insights to our customers and prospects about how the product behaves in various scenarios.&lt;br /&gt;&lt;br /&gt;That's it for this time - plane is about to land and they'll take my laptop if I don't close it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-2132419805086857842?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/2132419805086857842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=2132419805086857842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2132419805086857842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/2132419805086857842'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/11/some-things-that-kept-us-busy-lately.html' title='Some Things that Kept Us Busy Lately'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-1752762878507567282</id><published>2008-07-20T12:21:00.000-07:00</published><updated>2008-07-22T01:46:10.924-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><title type='text'>The Space as a Messaging Backbone - Why You Should Care</title><content type='html'>One of the main themes of GigaSpaces 6.5 XAP release (which is also true for our direction as a company in general), is the fact that we consider ourselves as a very complete application platform, and not just an IMDG solution. This has been evident in prior versions of the product, by with 6.5 we believe we got even closer to that goal, and that in many cases we can replace altogether a JEE application server.&lt;br /&gt;We are taking this quite seriously, and actually invested a lot in making sure that this vision is also realized. A major part of this effort is a project we took upon ourselves to test and document the migration process from a typical JEE application to full Space Based Architecture. To keep the comparison as unbiased as possible, we delegated the actual coding and testing work to a team of professionals at &lt;a href="http://www.griddynamics.com/" target="blank1"&gt;Grid Dynamics&lt;/a&gt; (which BTW did a great job).&lt;br /&gt;They first implemented a typical OLTP application using JEE (JMS, EJB, Hibernate, Spring) deployed it on a leading app server and tested the application in terms of latency, throughput, CPU utilization, etc. Next, they migrated the application in a few steps to full SBA.&lt;br /&gt;Each step was documented and tested to assess its affect on the system and validate the benefits it gives. The steps were as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add 2nd level cache to Hiberante, which didn't require any code change.&lt;/li&gt;&lt;li&gt;Change the data acccess layer to use the space instead of the database, with data base write behind (or Persistency as a Service) in the background&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Change the messaging layer to use the Space instead of the app server's JMS implementation&lt;/li&gt;&lt;li&gt;Implement full SBA by collocating business logic, data and messaging in the same JVM by utilizing GigaSpaces processing units&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Interestingly, steps 1 and 2 provided nice improvement in latency, but almost none in the throughput front, as shown &lt;a href="http://www.gigaspaces.com/wiki/download/attachments/41746797/tp-steps.gif" target="blank2"&gt;here&lt;/a&gt;. After analyzing these results, we realized that the main bottleneck for throughput increase was the application server's messaging infrastructure, which uses the disk to maintain resiliency for JMS "persistent messages" and is working in an "active-standby" topology (which means only one node is handling messages at any given moment).&lt;br /&gt;When replacing it with the Space, we saw a major increase in throughput, as seen in steps 3 and 4 in the graph above. Another important fact which is not evident from the graph, is that GigaSpaces is much more scalable since the Space can be partitioned across multiple JVMs, and message load is shared between partitions (unlike most MOMs, which end up writing to the disk and typically use the active-standby topology).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Who Else Should Care&lt;/span&gt;&lt;br /&gt;Besides ordinary JEE applications, this information is also very relevant to ESB-based applications. When implementing such applications, most people overlook the above, and use messaging servers or even worse, relational databases to handle the transport for their ESB based applications. For example, 65.3 % of &lt;a href="http://www.mulesource.org/" target="blank3"&gt;Mule &lt;/a&gt;users use JDBC for transport, 48.4% use JMS, 30% use MQ Series for tarnsport (accroding to the &lt;a href="http://www.mulesource.com/company/press_releases/Survey_052207.php" target="blank4"&gt;2007 Mule user survey&lt;/a&gt;).&lt;br /&gt;So you see the benefit in using GigaSpaces as a transport layer instead of the traditional solutions.&lt;br /&gt;With GigaSpaces 6.5, we have built in the&lt;a href="http://www.gigaspaces.com/wiki/display/OLH/OpenSpaces+Mule+Integration" target="blank5"&gt; integration with Mule&lt;/a&gt; into the product, so you can enjoy the GigaSpaces scalable transport (and other integration points) out of the box.&lt;br /&gt;In addition, there are a number of other ESB integrations available.&lt;br /&gt;You can find a &lt;a href="http://www.openspaces.org/display/OSI" target="blank6"&gt;very complete integration package&lt;/a&gt; with &lt;a href="http://servicemix.apache.org/" target="blank7"&gt;Apache ServiceMix&lt;/a&gt; in our community web site, OpenSpaces.org. Also, &lt;a href="http://cwiki.apache.org/confluence/display/CAMEL/JavaSpace" target="blank8"&gt;here&lt;/a&gt;'s a nice integration project of JavaSpaces and &lt;a href="http://activemq.apache.org/camel/" target="blank9"&gt;Apache Camel&lt;/a&gt; which also enables you to use GigaSpaces as a transport layer with Camel.&lt;br /&gt;&lt;br /&gt;Going back to the migration project I mentioned above, we plan to publish the application itself and the results we came up with in the process so people can check it our for themselves and understand how we did things. So stay tuned, there's a lot more interesting stuff to follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-1752762878507567282?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/1752762878507567282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=1752762878507567282' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/1752762878507567282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/1752762878507567282'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/07/space-as-messaging-backbone-why-you.html' title='The Space as a Messaging Backbone - Why You Should Care'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-6290465462864326084</id><published>2008-07-20T11:08:00.000-07:00</published><updated>2008-07-21T07:35:08.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>My TechTalk at TSS.com</title><content type='html'>You're all welcome to watch my talk at TSSJS Prague about the challenges in scaling web 2.0 applications. It's now &lt;a href="http://theserversidecom.bitpipe.com/detail/RES/1214581333_207.html?src=wc_atssc_sitepost_06_26_08_c&amp;li=132071"&gt;online at TSS.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-6290465462864326084?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/6290465462864326084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=6290465462864326084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6290465462864326084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6290465462864326084'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/07/my-techtalk-at-tsscom.html' title='My TechTalk at TSS.com'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-405629921511180896</id><published>2008-05-15T13:22:00.000-07:00</published><updated>2008-05-17T14:26:08.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictability'/><title type='text'>About Predictability and Traceability</title><content type='html'>&lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;In this post I will discuss two somewhat overlooked benefits of SBA.&lt;br /&gt;But first I want to explain what triggered me to write it. &lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;A few weeks ago I read &lt;a href="http://dangerousintersection.org/?p=403"&gt;a post&lt;/a&gt; based on &lt;a href="http://www.amazon.com/Seven-Sins-Memory-Forgets-Remembers/dp/0618219196"&gt;a book by Daniel Schacter&lt;/a&gt;, a Psychology Professor at the Harvard University. According to Schacter, the human brain tends to generalize and categorize things so that we can easily remember them and relate to them, without having to think about all the details involved. This is thought to be an evolutionary advantage, since it enables us to categorize threats and identify them very quickly (albeit not always reliably…).&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;For example, most people would say "Italian cars are so fun to drive" (unless they had a Fiat Multipla), or "British cuisine sucks" (no offense my fellow Englishmen, there are very few things I like better than a hot, freshly fried fish n chips :) ). &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;Software products in general and GigaSpaces in particular are no exception to this human behavior.&lt;br /&gt;Facing prospects and being involved in numerous sales opportunities, I often see people categorizing us as "a high-scalability, low latency solution" (which I'm ok with, don't get me wrong) or "caching solution" (which I'm less ok with, as it's only part of the story). But naturally, as generalizations tend to do, this doesn’t tell the entire story. &lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;In one of my recent sessions for a certain prospect, I had an interesting discussion with one of the attendees, a savvy enterprise architect. After presenting our way of thinking, he said something in the following spirit: &lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;"Well, our JEE tier based application works just fine now. The latency is reasonable for all important use cases, my developers add and remove changes at a reasonable time, and I'm ok with the capacities I need to handle. In fact, I know I can handle about 50% more throughput than I do now.&lt;br /&gt;So, it's not that I don't like your solution, but I don't really need it for now. If I wrote an order management system for a bank I would definitely give it a shot, but for my current needs it's kind of an overkill"&lt;/p&gt;      &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;At first I thought that he had a good point. After all, we are defining ourselves as an XTP (eXtreme Transaction Processing) application server, so if your application is not extreme (like this architect here) you don't really need GigaSpaces, right?&lt;br /&gt;But after thinking for a few more seconds, we started a discussion in the following spirit (I'm U below, for Uri, and he is P, for prospect):&lt;/p&gt;                                                      &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;U: So do you think you will not need to grow with capacity anymore?&lt;br /&gt;P: I didn't say that, I said I'm good for another 50% increase or so&lt;br /&gt;U: And then what? Do you think you will get to a point when this will not cut it?&lt;br /&gt;P: Hopefully we will, if our business is successful enough. I'll do some testing, find where the bottleneck is, which will probably be the database or the messaging as always, and buy more hardware or better storage. After all this system is not running on a very expensive hardware setup, so it shouldn't be too hard to get more budget for it. I might also re-architect parts of my app to make it perform better&lt;br /&gt;(at this point my brain started to make funny noises trying to compile a proper response…)&lt;br /&gt;U: But can you really tell how much more hardware you will need, or how much that will cost you? Or where will patching the current architecture get you?&lt;br /&gt;P: hmmm… kind of.&lt;br /&gt;U: What do you mean?&lt;br /&gt;(pause…)&lt;br /&gt;P: I'm not sure how this will affect the performance of the database and the messaging server. It will probably improve, just not sure how much&lt;br /&gt;U: Are you sure? We have a customer using &amp;lt;database X with clustered configuration&amp;gt;. Going into this configuration actually slowed things down, because now the database servers need to coordinate everything with one another…&lt;br /&gt;Furthermore, how will you make capacity planning? How will you plan the budget for this?&lt;br /&gt;P: I have to check it first hand before I can really tell. I'll probably start with a couple of machines or change the relevant parts in the app, try it out to see if it's good enough, and if not add more machines to the mix&lt;br /&gt;U: So you will go through a complete development and performance testing cycle without knowing if and at what cost it's going to solve your problem?&lt;br /&gt;P: well, now that you put it like that…&lt;br /&gt;U: And another point, what if you will go through all of this, and get great throughput numbers, but not so great latency numbers?&lt;br /&gt;P: Then I need to trace and profile my app and find where I have a bottleneck&lt;br /&gt;U: How will you do that?&lt;br /&gt;P: Well there are a lot of tools out there for doing just that, very good ones I might add&lt;br /&gt;U: Do they show you the entire latency path? I mean can they tell you where is the bottleneck between your mix of DB, messaging and application servers?&lt;br /&gt;(pause…)&lt;br /&gt;P: Some sort of can…&lt;br /&gt;U: So let me get this correctly: To know your capacity, you need to build the entire production environment in advance, buy potentially very expensive tools to check in case something goes wrong, and even then you're not entirely sure if it'll do the trick for you?&lt;br /&gt;P (a bit aggressive): So what do you offer to solve this problem?&lt;br /&gt;(Finally, this conversation is heading somewhere…)&lt;br /&gt;U: Well, with SBA, the whole point is that everything happens in the same JVM. So it's much more predictable, because there are no other moving parts involved. When the application is partitioned correctly, and one JVM gives you 2000 operations/sec for example, two would give you more or less 4000, and so on. This is what linear scalability is all about, and the SBA model enables it.&lt;br /&gt;And since it's one JVM, you can just attach a simple profiler or even print you’re your own debug messages to a log file and analyze them later. It's as simple as profiling and debugging a stand alone Java app.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/database&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;I won't wear you down with the rest of this conversation, but hopefully you get the point. I think the above summarizes very well why GigaSpaces is not just about scalability or latency. It also gives a pretty easy way to answer the following questions, which is not so trivial to do with the classis tier based approach: &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style="font-weight: bold;"&gt;Predictability &lt;/span&gt;- If I add X more machines, how much more throughput will I gain? Is there a latency penalty for that?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style="font-weight: bold;"&gt;Traceability &lt;/span&gt;- Where the heck is my bottleneck?&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;Finally, if you'd like to read some real life story about how hard and expensive it was for people to use the "build, deploy, test, see what we got" methodology, and why scaling is something you need to think about in advance, &lt;a href="http://www.cioinsight.com/c/a/Past-News/Inside-MySpacecom/"&gt;here's a read &lt;/a&gt;well worth your time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-405629921511180896?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/405629921511180896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=405629921511180896' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/405629921511180896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/405629921511180896'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/05/about-predictability-and-traceability.html' title='About Predictability and Traceability'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-7831944320355936222</id><published>2008-04-27T06:44:00.000-07:00</published><updated>2008-11-13T08:19:49.113-08:00</updated><title type='text'>To Spring or not to Spring</title><content type='html'>Just got back from a few days in the Netherlands and Belgium, where I gave technical sessions at a few knowledge events organized by our partners in the region.&lt;br /&gt;One of the events was held by our Dutch affiliate, &lt;a href="http://www.tricode.nl/"&gt;Tricode&lt;/a&gt;, which did a great job in setting it up and attracting quite a few developers and architects to it. We even have a GigaSpaces &lt;a href="http://www.gigaspaces.nl/"&gt;Dutch web site &lt;/a&gt;now which Tricode guys have set up for us - so thanks guys.&lt;br /&gt;&lt;br /&gt;One of the questions I got after the session was something in the following spirit:&lt;br /&gt;"Sure, Spring is great and &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Overview"&gt;OpenSpaces&lt;/a&gt; integrates very nicely with it which is great. But what if I don't like all this XML in my project, or just (imagine that) don't use Spring but still want to use OpenSpaces APIs which are clean and nice"?&lt;br /&gt;&lt;br /&gt;Of course, you can always "imitate" Spring and call the OpenSpaces Spring factory beans from your own code, but that's not very clean and will require you to dig through the OpenSpaces code to understand how things work.&lt;br /&gt;Thankfully, you have another option -  OpenSpaces  configuration API, aka OpenSpaces configurers. It's fairly new (6.0.2 onwards) and therefore is still relatively unknown to many of our users.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Some (pretty recent) History&lt;/span&gt;&lt;br /&gt;Up until version 6.0, the preferred API to use GigaSpaces was JavaSpaces with proprietary extensions. In 6.0 we introduced OpenSpaces, which greatly simplified things and made the user experience much more positive by abstracting away lot of the API problems and inconsistencies.&lt;br /&gt;From day 1, OpenSpaces has been all about Spring: It uses Spring for configuration and utilizes a lot of goodies that Spring provides such as transaction management framework, namespace based configuration, etc.&lt;br /&gt;But since OpenSpaces' goal is become the preferred Java API for the product, the fact that you can only use it through Spring was a bit limiting to some of our customers and prospects.&lt;br /&gt;In addition, the trend towards code based configuration (first with &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; and now also with &lt;a href="http://springframework.org/javaconfig"&gt;Spring Java Config&lt;/a&gt;) also made us realize that we need a way to use OpenSpaces interfaces without wiring them through XML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configurers Demystified &lt;/span&gt;&lt;br /&gt;So here are a number of snippets to show you how this is done. Let's first show the Spring equivalent creating a space instance and then wiring your listener on top of it using a polling container:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;url=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"/./space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:giga-space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"simpleListener"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"SimpleListener"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"eventContainer"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:template&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.data.common.Data"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;property&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"processed"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;value=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"false"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:template&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:listener&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:annotation-adapter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:delegate&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"simpleListener"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:annotation-adapter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:listener&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The above XML snippet creates a space and registers to get notified on all objects of type Data whose processed field equals false. Here's how this is done in java code, via configurers:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;//creating a space&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;IJSpace space = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; UrlSpaceConfigurer(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"/./space"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;).space();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;//wrapping it with a GigaSpace&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;GigaSpace &lt;/span&gt;&lt;span style="text-decoration: underline; color: rgb(204, 204, 204);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;gigaSpace&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; GigaSpaceConfigurer(space).gigaSpace();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;//creating polling container&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;Data template = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; Data();&lt;br /&gt;template.setProcessed(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;);&lt;br /&gt;SimplePollingEventListenerContainer pollingEventListenerContainer = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; SimplePollingContainerConfigurer(gigaSpace)&lt;br /&gt;.template(template)&lt;br /&gt;.eventListenerAnnotation(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; SimpleListener())&lt;br /&gt;.pollingContainer();&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;That's it. as you can see, it's even simpler than the XML equivalent.&lt;br /&gt;A few interesting things about this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All our configurers use method chaining, which makes them very intuitive to use. It's about as close as you can get to domain specific languages in pure Java :)&lt;/li&gt;&lt;li&gt;There are configurers for all of the OpenSpaces constructs, specifically: Space, GigaSpace, Event containers, Remoting Proxies and Scripting Proxies.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Where is this documented?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Every OpenSpaces docs page includes XML snippets that show the configuration.&lt;br /&gt;Every such XML snippet is displayed in a tabbed pane, which typically has 3 tabs:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Namespace - which stands for the default configuration using Spring's namespaces support.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Plain XML - which shows how to configure the component via pure spring, without GigaSpaces specific namespaces&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Code - &lt;/span&gt;which shows how to configure the component using configurers&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Here's a screen shot to illustrate this:&lt;/span&gt;&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/uri/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ksxjtYRhpeY/SBbKDrpmN9I/AAAAAAAAAVk/zw4tci7CiuM/s1600-h/code.bmp"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ksxjtYRhpeY/SBbKDrpmN9I/AAAAAAAAAVk/zw4tci7CiuM/s400/code.bmp" alt="" id="BLOGGER_PHOTO_ID_5194561384824059858" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-7831944320355936222?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/7831944320355936222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=7831944320355936222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7831944320355936222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7831944320355936222'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/01/to-spring-or-not-to-spring.html' title='To Spring or not to Spring'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ksxjtYRhpeY/SBbKDrpmN9I/AAAAAAAAAVk/zw4tci7CiuM/s72-c/code.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-5227270714734182939</id><published>2008-04-06T01:31:00.000-07:00</published><updated>2008-04-06T04:02:31.673-07:00</updated><title type='text'>Impressions from MuleCon 2008</title><content type='html'>Just returned from San Francisco, where I gave a session about &lt;a href="http://www.gigaspaces.com/wiki/display/OLH/Open+Spaces+Mule+Integration"&gt;Mule and GigaSpaces integration&lt;/a&gt; at &lt;a href="http://www.mulesource.com/mulecon2008/"&gt;MuleCon&lt;/a&gt;. Although I'm still recuperating from the loooooong trip (about 18 hours each way) and the time differences (10 hours if really want to know), I think it was worth while attending the conference.&lt;br /&gt;I think the MuleSource guys did a great job, and the conference was quite packed.&lt;br /&gt;About 200 developers and architects from around the world attended and it was interesting to see the profile of Mule users and what people are doing with it.&lt;br /&gt;Many of them use Mule mainly as an integration and messaging platform - i.e. bridging between applications, but some are also using it as a hosting platform for single applications. This enables better decoupling between application components and makes for a more flexible application which is not bound to any specific middleware product. In GigaSpaces we refer to this as intra-application SOA.&lt;br /&gt;I think we managed to generate nice interest with regards to the GigaSpaces-Mule integration package, which essentially lets you scale out your Mule application in a very clean and non-intrusive way.&lt;br /&gt;There are 3 key value adds that GigaSpaces can provide to Mule users:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;High availability: making your Mule application highly available and fault tolerant, and maintaining in-memory and SEDA queues on top of the Space instead of just in memory. This allows your application to enjoy in memory performance and still maintain resilliency and HA. It means that after failover, your application can start working from the exact point that the failure took place and not loose any in pending in-memory messages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scalable transport: Use GigaSpaces messaging capabilities to obtain high throughput, low latency and extreme scalability for your messaging layer.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SLA driven grid based deployment: Use GigaSpaces service grid and &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/About+XAP#AboutXAP-SLADrivenContainer"&gt;SLA driven containers&lt;/a&gt; to enable declarative SLA, self healing and dynamic deployment capabilities for Mule applications.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Personally, the most useful part for me was the technical sessions by Mule developers and architects in which they showed the new features in Mule and other products they're working on like Galaxy, HQ and OSGi support. I especially found useful the sessions by Travis Carlson, Daniel Feist and &lt;span class="style14"&gt;Dan Diephouse &lt;/span&gt;- nice job on Galaxy and 2.0 guys :)&lt;br /&gt;There are a few similarities between our own grid infrastructure (specifically what we refer to as the Grid Service Manager or GSM for short) and the planned capabilities for Galaxy in the next Mule releases (hot deployment and netboot to name two). We intend to cooperate with MuleSource to make sure our offerings are as aligned as possible in that regards, although this is still a very early stage to be able to tell how this will evolve.&lt;br /&gt;Another interesting session was the enterprise infrastructure panel, in which various aspects of open source as a model for enterprise infrastructure were discussed.&lt;br /&gt;The commercial open source model still has to be proven as a sustainable business model (and not as just a successful exit strategy) but there are certainly some convincing arguments raised in the session in favor of this approach.&lt;br /&gt;For one, it is clear that at the end of the day, an organization seeking support and indemnification will invest money in the software (be it open or closed source) - I'm sure MuleSource guys would agree with me on that. But according to the panel, what makes open source more appealing in that regards is that the need is pushed from the bottom by developers and architects that just download the code and use it. So when approaching procurement to get budget for this, the fact that the open source libraries are already there and are used in the code makes a much better incentive for them vogons at procurement to approve the budget.&lt;br /&gt;&lt;br /&gt;That's it for now. If you want to get more details about our integration with Mule just drop me a line here and I'll get back to you with more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-5227270714734182939?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/5227270714734182939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=5227270714734182939' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/5227270714734182939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/5227270714734182939'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/04/impressions-from-mulecon-2008.html' title='Impressions from MuleCon 2008'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-3980443277659547385</id><published>2008-02-10T13:41:00.001-08:00</published><updated>2008-02-11T00:10:40.571-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSpaces.org'/><title type='text'>New OpenSpaces Demos and Examples Project</title><content type='html'>One of the goals of OpenSpaces.org is to promote best practices and recommended usage patterns among the GigaSpaces developer community.&lt;br /&gt;To that end, we have decided to dedicate some of our own resources to create a number of sample applications and blueprints that will help realize this goal.&lt;br /&gt;We have created a dedicated project under OpenSpaces.org named OpenSpaces &lt;a href="http://www.openspaces.org/display/DAE"&gt;Demos and Examples.&lt;/a&gt; This project will host these applications and provide a one stop shop for developers wishing to get some ideas on how to use GigaSpaces and OpenSpaces in various scenarios.&lt;br /&gt;We also encourage developers to donate their own ideas and sample applications to this project by joining it and becoming active committers.&lt;br /&gt;The first two applications we posted (actually one of them is already there and the other will be in the next few days) are demonstrating integration of GigaSpaces with &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html"&gt;Spring MVC&lt;/a&gt; based web applications. &lt;br /&gt;The first one is a simple &lt;a href="http://www.openspaces.org/display/DAE/Hello+World+Web+Documentation"&gt;HelloWorld web application&lt;/a&gt; and the second is a &lt;a href="http://www.openspaces.org/display/DAE/Stock+Demo+Documentation"&gt;more complex application&lt;/a&gt; that shows how to integrate a GigaSpaces based stock feed application with an AJAX based web client. The web client is based on the excellent open source &lt;a href="http://extjs.com/"&gt;ExtJS JavaScript library&lt;/a&gt;.&lt;br /&gt;You're encouraged to download it and give it a shot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-3980443277659547385?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/3980443277659547385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=3980443277659547385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3980443277659547385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/3980443277659547385'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/02/new-openspaces-demos-and-examples.html' title='New OpenSpaces Demos and Examples Project'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-4313904780470563400</id><published>2008-02-07T05:04:00.000-08:00</published><updated>2008-02-11T00:10:16.758-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='SVF'/><title type='text'>OpenSpaces SVF - Remoting on Steroids</title><content type='html'>When OpenSpaces was first released, one of its core features was &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Remoting+Components"&gt;Space Based Remoting&lt;/a&gt;.&lt;br /&gt;Based on the Space as a discovery, transport, load balancing and failover capabilties, this remoting mechanism provided a a drop in replacement for other remoting implementations, allowing for exposed services to be highly available and redundant and for remote client to get fault tolerance and load balancing out of the box without changing a single line of code.&lt;br /&gt;With 6.5, we have decided to change the name of this feature to the &lt;span style="font-style: italic;"&gt;Service Virtualization Framework &lt;/span&gt;(&lt;span style="font-style: italic;"&gt;SVF&lt;/span&gt;) as we feel it has become much more than just a remoting implementation, and better describes the overall value it can bring to applications, by virtualizing any service object across the GigaSpaces grid.&lt;br /&gt;In the next few paragraphs I'll try to explain how this framework works and what are the new improvements we have added to it in GigaSpaces 6.5.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;So how in fact does it work?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Underneath, the remoting mechanism relies on the space to get all the above.&lt;br /&gt;What happens is that once the client makes a remote call, the local client side proxy (created dynamically at application startup) packages the invocation into an invocation object, and writes it to the space.&lt;br /&gt;At the space side, you can choose whether you want to handle the remote call synchronously or asynchronously:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Handling the call synchronously means that the space will use the inbound communication thread  (which was used to receive the request from the network) for the processing of the request. This is similar to most other remoting implementations. This mechanism is built on top of &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Core+Component+-+Space#OpenSpacesCoreComponent-Space-SpaceFilters"&gt;space filters&lt;/a&gt;, such that a dedicated filter delegates the invocation to the service object and returns the result back to the client. The benefit of it is that it's usually faster than using a separate thread for processing the request since there are less steps involved.&lt;/li&gt;&lt;li&gt;Handling the call asynchronously means that you have a separate thread pool (in the form of an &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Events+Components"&gt;OpenSpaces event container&lt;/a&gt;) that consumes the invocation object out of the space, calls the service and then return the result back to space. The client proxy then picks the result from the space using a take operation and returns it back to the caller.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The benefit of that is that the model is more scalable and safer than the synchronous one, as the load at any moment depends mostly on the number of processing threads rather than the actual number of requesting clients. It also allows for true asynchronous operations by using JDK Futures and retrieving the result of the invocation asynchronously.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Why use the SVF instead of ordinary remoting mechanisms?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;For both implementations (sync and async), the fact that everything is done through the space means that the framework provides the following out of the box:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Automatic and transparent failover: using the space's failover capabilities, a remote call (i.e. the invocation object) is transparently routed to another node when the default node for the invocation becomes unavailable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Load balancing: using the space's load balancing capability, the remote call (i.e. the invocation object) can be routed to any one of the cluster members or even to all of them. Again, this is done in complete transparency to the calling code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Non intrusiveness: As with any other good remoting implementations, the client code is completely isolated from the underlying remoting mechanism. This is  actually a very powerful yet non intrusive manner of implementing &lt;a href="http://en.wikipedia.org/wiki/Space_based_architecture"&gt;SBA&lt;/a&gt;. Both the client and service code can be completely independent of any GigaSpaces interface, making them truly portable across any runtime platform.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Code samples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The primary way to enable SVF in your application in your Spring beans file.&lt;br /&gt;Let's take the example of the following business interface (assume a Data and DataResult classes):&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;package&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; org.openspaces.example.data.common;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;publi&lt;span style="font-family:monospace;"&gt;c interface&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor {&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;    /**&lt;br /&gt;* Process a given data object and return a DataResult.&lt;br /&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    DataResult processData(String title, Data data);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;It takes an instance of type Data as input and returns an instance of type DataResult.&lt;br /&gt;For simplicity Lets also assume the following implementation for the service:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;publi&lt;span style="font-family:monospace;"&gt;c class&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; DataProcessor &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;implements &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;IDataProcessor {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;    publi&lt;span style="font-family:monospace;"&gt;c &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;DataResult processData(String title, Data data) {&lt;br /&gt;   System.out.println("Processed: " + data);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;     return new &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;DataResult("Done processing: " + title);&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;In order to configure this on the space side we need to determine whether we want the service to be exposed as a synchronous service, asynchronous service or both.&lt;br /&gt;The configuration is part of a processing unit deployed to the GigaSpaces grid.&lt;br /&gt;Here's the Spring configuration inside the processing unit's pu.xml:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service-exporter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"remotingServiceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&gt;&lt;br /&gt;&lt;!--&lt;/span--&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service-exporter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;The above snippet exports the service such that it could be used as a remoting endpoint.&lt;br /&gt;Now we need to configure the actual remoting mechanism.&lt;br /&gt;Here's an example for a sync remoting configuration. Note that we simply take to the exported object and use it as space filter:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;url=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"/./space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:filter-provider&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"remotingServiceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:giga-space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;tx-manager=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"transactionManager"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;If we want to use async remoting we need to use either a polling or a notify container. Here's an example for a polling container configuration which uses two threads to process invocation requests:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"remotingContainer"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;concurrent-consumers=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"2"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:listener&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"remotingServiceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;On the client side, we should configure a proxy to be used by the client code.&lt;br /&gt;In 6.0, the way to this was to configure everything in the Spring beans xml file, as follows.&lt;br /&gt;For async proxy:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:async-proxy&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;                         &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;interface=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.data.common.IDataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;For sync proxy:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:sync-proxy&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;interface=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.data.common.IDataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;Now all we need to do is wire the proxy with the actual client code, as follows:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"myRemotingClient"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.MyRemotingClient"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;property&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;The client code would simply invoke the method on the interface:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;//injected via Spring &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor dataProcessor;&lt;/span&gt; &lt;span style="background-color: rgb(255, 255, 255);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;publi&lt;span style="font-family:monospace;"&gt;c void&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; doSomethingWithRemoteProxy() {&lt;br /&gt;  ...&lt;br /&gt;  String title = ...&lt;br /&gt;  Data data = ...&lt;br /&gt;  DataResult result = dataProcessor.processData("&lt;/span&gt;&lt;span style="font-family:mon;"&gt;title&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;", data);&lt;br /&gt;  ...&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;The call is completely unaware of how the space is deployed, how many instanced it has or what is the actual clustering topology.&lt;br /&gt;Behind the scenes, the space proxy will route the invocation object that the proxy generates with every request to the relevant node. For example, if you're dealing with a partitioned space, the request will by default be randomly routed to one of the partitions (this is based on the hashCode of the invocation object and can be overridden - see below). With a replicated topology, the request will go to the node to which the client is currently connected (which is determined by the load balancing policy for the cluster and can be round robin, weighted round robin, etc.).&lt;br /&gt;For both topologies, in case of failure of the node to which the request was sent, the request will be sent automatically to the backup node if such exists.&lt;br /&gt;In 6.5, the client side configuration will even be simpler - you can simply annotate a field of the remote interface type with a @SyncProxy or @AsyncProxy annotation and OpenSpaces will create the proxy for you and inject in to your client object. Here's an example:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(128, 128, 0); background-color: rgb(255, 255, 255);"&gt;@AsyncProxy(&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;gigaSpace=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;, timeout = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(255, 255, 255);"&gt;15000&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor dataProcessor;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;In the Spring beans file, the following line has to be included to make OpenSpaces infrastructure process all beans with this annotation:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:annotation-support&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;In the above example, OpenSpaces infrastructure will inject the client code with an Async remoting proxy, which uses a GigaSpace instance by the name of "gigaSpace" (as defined in the Spring beans configuration file) and use a call timeout of 15 seconds.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Advanced Features&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Routing the call in a partitioned space topology&lt;/span&gt;&lt;br /&gt;Many of GigaSpaces users use the partitioned topology, which is required in case you have more data on the grid than any single machine can contain. It is also very useful for cases where you want to distribute the processing load between a number of machines, each handling a different subset of the data.&lt;br /&gt;When an object is written into a partitioned space, the partition is determined by the hash code of the &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Partitioned+Space+Topology+-+6.0#PartitionedSpaceTopology-6.0-RoutingField"&gt;routing field&lt;/a&gt;, which is designated by the user. With remoting however, a method can have more than one parameter, or no parameters at all.&lt;br /&gt;By default, the routing is determined by the hash code of the entire remote invocation object.&lt;br /&gt;This behavior can be overridden using an implementation of the RemoteRoutingHandler interface:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;package&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; org.openspaces.remoting;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;interface&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; RemoteRoutingHandler&lt;t&gt; {&lt;br /&gt;&lt;/t&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    T computeRouting(SpaceRemotingInvocation remotingEntry);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt; As you can see, this interface contains one method, computeRouting, which is given the remote invocation entry and returns a value based on which the routing value will be computed (the space proxy will call its hashCode() method for that). Here a sample implementation:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;public class &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;DataRemoteRoutingHandler &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;impplements&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;RemoteRoutingHandler&lt;long&gt; {&lt;br /&gt;&lt;br /&gt;&lt;/long&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt; Long computeRouting(SpaceRemotingInvocation remotingEntry) {&lt;br /&gt;&lt;/long&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;    if&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt;(remotingEntry.getMethodName().equals("processData")) {&lt;br /&gt;      Data data = (Data) remotingEntry.getArguments()[1];&lt;br /&gt;      &lt;/long&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt; data.getType();&lt;br /&gt;  }&lt;br /&gt;&lt;/long&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt;&lt;/long&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;    return&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt;&lt;/long&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;long&gt; null;&lt;br /&gt;}&lt;/long&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;In the pu.xml file, we need the proxy to reference this object:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:async-proxy&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"dataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;interface=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.data.common.IDataProcessor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:routing-handler&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.example.data.feeder.support.DataRemoteRoutingHandler"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:routing-handler&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:async-proxy&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;With 6.5 you can do it in much simpler fashion: you can simply add the @Routing annotation to the signature of the service interface, and the routing will be based on it!&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;package&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;org.openspaces.example.data.common;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;public interface&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor {&lt;br /&gt;  DataResult processData(&lt;span style="font-weight: bold;"&gt;@Routing&lt;/span&gt; String title, Data data);&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Sending a request to more than one node -  ala Map/Reduce&lt;/span&gt;&lt;br /&gt;In many cases, you would want to use &lt;span style="font-weight: bold;"&gt;all &lt;/span&gt;the nodes in the network to do some processing, and then aggregate the result on the client side, ala Map/Reduce.&lt;br /&gt;In that case there are two things you should do: Define the remote proxy to broadcast the call to all partitions, and define a result aggregation policy to be executed on the client side once results from all nodes have returned.&lt;br /&gt;The broadcast is supported for sync proxies, and is enabled in the following way (using annotations based configuration):&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(128, 128, 0); background-color: rgb(255, 255, 255);"&gt;@SyncProxy(&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;broadcast = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;, remoteResultReducerType = MyResultReducer.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;class&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor dataProcessor;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;The above annotation configuration references the MyResultReducer class.&lt;br /&gt;This is an implementation of the RemoteResultReducer interface, which is responsible to get the results from all the nodes and aggregate them into one object which will be returned to the calling code. Here's this interface's definition:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;package&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; org.openspaces.remoting;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;interface&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; RemoteResultReducer&lt;t,&gt; {&lt;br /&gt;&lt;/t,&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    T reduce(SpaceRemotingResult&lt;y&gt;[] results, SpaceRemotingInvocation remotingInvocation) &lt;/y&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;throws&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; Exception;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;It's getting an array of SpaceRemotingResult instances which contains information on the invocation of a single node, such as the invocation result, whether or not an exception occurred, and where the invocation took place. It returns the final aggregated result, which is passed on to the calling code.&lt;br /&gt;This enables you to grid enable your service without affecting the calling code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Using futures and one one way calls&lt;br /&gt;&lt;/span&gt;Sometimes you don't want the calling code to block and wait for the invocation to take place. This can be true if you know the calculation will take a lot of time, or if the calling thread does not require the invocation result to continue. When using async proxies, you have two options depending on the signature of the invoked method:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If it doesn't have a return value, you can simply declare it as "one way", which means that the client side proxy is not going to wait for it's completion:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(128, 128, 0); background-color: rgb(255, 255, 255);"&gt;@AsyncProxy(&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;voidOneWay = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor dataProcessor;&lt;/span&gt;&lt;/pre&gt; In the above snippet, the proxy will not wait for any method that has no return value.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If it does have a return value, you can use a &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html"&gt;JDK Future&lt;/a&gt; to get the result at later time or using another thread. To do that, you should declare an interface that returns a Future object. OpenSpaces infrastructure will detect that automatically and not block the proxy on the call. So our previous IDataProcessor interface will now look like this: &lt;span style="font-weight: bold;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;&lt;span style="font-family:monospace;"&gt;public interface&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; IDataProcessor {&lt;br /&gt;  Future&lt;dataresult&gt;&lt;dataresult&gt; processData(String title, Data data);&lt;br /&gt;}&lt;/dataresult&gt;&lt;/dataresult&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;Note that you can still deploy the previous interface (without the Future) on the space side, as this is purely a client side related issue. So you can have client waiting synchronously to get the invocation result, and clients using a Future and retrieving the result asynchronously.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Remoting Aspects and MetaData&lt;br /&gt;&lt;/span&gt;New to 6.5 is the ability to apply cross cutting concerns, similar to the AOP aspects or servlet filters. You can apply your own logic on the client (bofore the call is made) and on the server (after the call has been intercepted and before it's delegated to the service).&lt;br /&gt;This is useful to apply system wide functionality such as logging and performance measurements. Another new feature in 6.5 is the ability to piggyback the remoting invocation and send custom metadata along with it. This could be very useful when implementing security for example.&lt;br /&gt;In fact, combined with the remoting aspects, it's very simple to implement a custom, non-intrusive security mechanism that would be completely transparent to the calling code.&lt;br /&gt;You can read about it more &lt;a href="http://www.gigaspaces.com/wiki/display/OLH/Open+Spaces+Remoting+Component+-+Async+Remoting#OpenSpacesRemotingComponent-AsyncRemoting-ExecutionAspects"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Summary&lt;br /&gt;&lt;/span&gt;In this post I showed the benefits and rich set of features that are part of the OpenSpaces Service Virtualization Framework. These are all documented in full in the GigaSpaces wiki.&lt;br /&gt;I encourage you to try out our new 6.5 early access version and test drive the new SVF features.&lt;br /&gt;You can download the EAP version &lt;a href="http://www.gigaspaces.com/wiki/display/RN/GigaSpaces+6.5+Early+Access"&gt;here&lt;/a&gt;. An initial version of the documentation for OpenSpaces SVF can be found &lt;a href="http://www.gigaspaces.com/wiki/display/OLH/Open+Spaces+Remoting+Components"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-4313904780470563400?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/4313904780470563400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=4313904780470563400' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4313904780470563400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/4313904780470563400'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/02/openspaces-svf-remoting-on-steroids.html' title='OpenSpaces SVF - Remoting on Steroids'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-6157781958620029403</id><published>2008-01-13T06:28:00.001-08:00</published><updated>2008-02-11T00:11:13.688-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSpaces'/><category scheme='http://www.blogger.com/atom/ns#' term='Scripting'/><title type='text'>OpenSpaces Dynamic Scripting Support</title><content type='html'>One of the things I intend to do under my new hat as developer community manager is regularly publish posts about new and cool product features. Since our &lt;a href="http://www.gigaspaces.com/wiki/display/RN/GigaSpaces+Early+Access+Program"&gt;Early Access Program&lt;/a&gt; is will go live soon, I can also write about planned features so that GigaSpaces users can experience them by downloading a beta version and trying them out.&lt;br /&gt;The main goal here is to make the community aware of the new product features and get feedback from developers even before the version is released.&lt;br /&gt;The first new feature I wanted to introduce is the new OpenSpaces Scripting Support.&lt;br /&gt;You're probably wondering what scripting has to do with distributed, ultra-scalable systems.&lt;br /&gt;After all, when one hears the words Groovy, JavaScript or Ruby the almost immediate association is web applications, web browsers and HTML.&lt;br /&gt;&lt;div class="BAB_CPDefinitionInTableStyle"&gt;With the emergence of the likes of &lt;a href="http://groovy.codehaus.org/"&gt;Groovy &lt;/a&gt;and &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, scripting is becoming more and more mainstream and used for building many types of applications. In addition, the realization that domain specific languages can be very elegant, powerful and useful in many cases also contributes to this important mind shift.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So how can a script be useful in a distributed space based application?&lt;/span&gt;&lt;br /&gt;For many of our customers, one of the most appealing features of GigaSpaces is the ability to perform calculations and business logic on the space nodes.&lt;br /&gt;This can be useful for a number of cases, such as performing aggregations on space data, validating data as it is written to space,  enriching this data, etc.&lt;br /&gt;Before version 6.0 was released, the only way to do that was to use Space filters and the &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Custom+Query+Pattern+-+6.0"&gt;custom query pattern.&lt;/a&gt; While very powerful, this was quite complex and cumbersome to use.&lt;br /&gt;In 6.0, we introduced &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Remoting+Components"&gt;Space Based Remoting&lt;/a&gt; as part of the OpenSpaces framework.&lt;br /&gt;This is a very powerful abstraction, enabling your application to transparently enjoy all the goodies the space can give, such as high availability, load balancing, sync/async execution and parallel processing via a Map/Reduce style API.&lt;br /&gt;However, as with any remoting implementation, you have to physically deploy the remoting endpoint on the server side (in our case you define it within your processing unit).&lt;br /&gt;For many applications, this wouldn't be a limitation, but for some there is a need to control what gets executed in the remote node in a more dynamic fashion - or better yet, let the client application decide what should be done on the server (space) side. This can be extremely useful for application that need to dynamically define the execution logic, such as algorithmic trading application that let the trader define the trading algorithm.&lt;br /&gt;And this is where OpenSpaces Scripting support fits in.&lt;br /&gt;The idea is that instead of deploying the endpoint on the server, every space has a built in generic script executor. The space client can then submit the script to be executed on any of the spaces, or even on all of them simultaneously using Map/Reduce style API. So clients can actually change the execution logic dynamically.&lt;br /&gt;You can think of it as a sophisticated form of a database driver - only instead of submitting SQL statements and being limited to the relational model, you can now submit an actual program to your grid, which can do most anything Java code can do!!&lt;br /&gt;The client can also control whether the script will be cached or not, and whether it will execute synchrounously or asynchronously.&lt;br /&gt;When caching is enabled, the scripts are cached in their compiled form on the space side to support faster execution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;And now for some code samples&lt;/span&gt;&lt;br /&gt;Setting up a scripting client is very simple.&lt;br /&gt;On the space side, if you're using our EDG edition and starting a data grid, it's already enabled automatically. If you're deploying your own processing unit, you need to include the following in your pu.xml file:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;url=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"/./mySpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:filter-provider&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"serviceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;&amp;lt;!-- A GigaSpace instance (that can be used within scripts) --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:giga-space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128); background-color: rgb(255, 255, 255); font-style: italic;"&gt;&amp;lt;!-- Theh scripting executor remoting support --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"scriptingExecutorImpl"&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"org.openspaces.remoting.scripting.DefaultScriptingExecutor"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service-exporter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"serviceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"scriptingExecutorImpl"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:service-exporter&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"remotingContainer"&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;giga-space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;concurrent-consumers=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"${scripting.asyncConcurrentConsumers}"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:listener&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;ref=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"serviceExporter"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-events:polling-container&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;That's it, now you processing unit is all set for script execution.&lt;br /&gt;As for the client side, things are even simpler.  In this post, I will only show how to do it from a Spring based client application, However this can also be done from your code using our configurers (I will cover it in a future post).&lt;br /&gt;One of the nicest things here, is the approach we took with regards to configuration via annotations. It's follows the spirit of what the guys at SpringSource did with 2.5, enabling you to configure dependency injection via annotations. Note that the client class implements Spring framework's InitializingBean interface which provides a convenient callback at application startup:&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;class&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; ScriptRunner &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;implements&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; InitializingBean&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 0); background-color: rgb(255, 255, 255);"&gt;@AsyncScriptingExecutor&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; ScriptingExecutor &lt;/span&gt;&lt;span style="color: rgb(102, 14, 122); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;asyncScriptingExecutor;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 128, 0); background-color: rgb(255, 255, 255);"&gt;@SyncScriptingExecutor&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;private&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; ScriptingExecutor &lt;/span&gt;&lt;span style="color: rgb(102, 14, 122); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;syncScriptingExecutor;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;void&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; afterPropertiesSet() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;throws&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; Exception&lt;br /&gt;{&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: rgb(102, 14, 122); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;asyncScriptingExecutor.&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;execute(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; ResourceLazyLoadingScript()&lt;br /&gt;           .cache(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .name(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"test1"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .type(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"groovy"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .script(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"classpath:/TestSpace.groovy"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .parameter(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"name"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"Uri"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;));&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: rgb(102, 14, 122); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;syncScriptingExecutor.&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;execute(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; StaticScript().cache(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .name(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"test"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .type(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"groovy"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .script(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"println name"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;           .parameter(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"name"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"Cohen"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;));&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;As you can see, all the client code has to define is a field of type ScriptingExecutor which is annotated either with @AsyncScriptingExecutor or @SyncScriptingExecutor (for asynchronous or synchronous script execution).&lt;br /&gt;The client Spring beans XML file would then look like this:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;url=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"jini://*/*/mySpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;lookup-groups=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"uri"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-core:giga-space&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"gigaSpace"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;space=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"space"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;os-remoting:annotation-support&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;bean&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;id=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"scriptRunner"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(239, 239, 239); font-weight: bold;"&gt;"ScriptRunner"&lt;/span&gt;&lt;span style="background-color: rgb(239, 239, 239);"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;All we had to do for the annotations to get picked up is introduce the &amp;lt;os-remoting:annotation-support/&amp;gt; tag, which directs OpenSpaces infrastructure to processes all the beans in the application context that actually contain the appropriate annotations.&lt;br /&gt;And finally, here's the Groovy script file referenced above:&lt;br /&gt;&lt;pre  style="line-height: 130%; background-color: rgb(255, 255, 255);font-family:monospace;"&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; (i &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;in&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(255, 255, 255);"&gt;0&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;..&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(255, 255, 255);"&gt;9999&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;)&lt;br /&gt;{&lt;br /&gt;gigaSpace.write(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; Message(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;"blabla"&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;))&lt;br /&gt;}&lt;br /&gt;println &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); background-color: rgb(255, 255, 255); font-weight: bold;"&gt;'Done writing 10000 objects to the space'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;A few more interesting things to note here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The execution unit is an object which implements the org.openspaces.remoting.scripting.Script interface. Here we show two such implementations of it - one that lazily loads a script file from a location in the classpath, and another one which simply takes in the script itself as an argument.&lt;/li&gt;&lt;li&gt;We define the script type, in this case Groovy. If the space does not contain the groovy libraries in its classpath this will fail.  As mentioned before, we support JavaScript, Groovy and JRuby out of the box. If you favor another scripting language you can easily add support for it as well.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The method chaning approach we took with regards to Script configuration (as we also with other configuration elements of GigaSpaces). We believe it's a very elegant way of configuring your application (and probably the closest one can get to a domain specific language in Java :)).&lt;/li&gt;&lt;li&gt;The script itself references a gigaSpace variable. Every script running inside the space has a number of contextual variables that are available to it automatically, such as the space itself and the Spring ApplicationContext in which it's defined.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;br /&gt;&lt;/span&gt;OpenSpaces Dynamic Scripting Support is a very powerful tool that adds a great deal of flexibility to grid applications. Let's recap the benefits of this new feature in short:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It provides you a mean to invoke dynamic scripts on any or all grid members, much the same way you would invoke a SQL statement or even a programon on a database.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It gives the combined power of Java alongside new and powerful scripting languages such as Groovy and JRuby.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It enables you to perform distributed aggregations  using a Map/Reduce style API.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:85%;color:navy;"   &gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt; &lt;/span&gt;&lt;/span&gt;I hope I managed to give you short glimpse of what this feature can do and how powerful it is.&lt;br /&gt;In one of my the next posts I'll go into this a bit deeper and discuss some more interesting capabilities of this feature such as distributed aggregations, interceptors and other aspects that come up in this context, such as performance, class loading and security.&lt;br /&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/5947766887998996490-6157781958620029403?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/6157781958620029403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=6157781958620029403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6157781958620029403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/6157781958620029403'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/01/openspaces-scripting-support.html' title='OpenSpaces Dynamic Scripting Support'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5947766887998996490.post-7805404801717441165</id><published>2008-01-12T14:12:00.000-08:00</published><updated>2008-02-11T00:11:29.065-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSpaces.org'/><title type='text'>OpenSpaces.org goes live!</title><content type='html'>This is my first blog under my new hat at &lt;a href="http://www.gigaspaces.com/"&gt;GigaSpaces Technologies &lt;/a&gt;- Developer Community Technical Manager.  I must say it's a bit of a mind shift than what I was used to, being much more focused on technology and community than on sales and customer related issues.&lt;br /&gt;In the past couple of weeks we've been extremely busy in setting up our new &lt;a href="http://www.openspaces.org/"&gt;OpenSpaces.org&lt;/a&gt; developer community web site, which is due to launch this week. We've also been busy in promoting our &lt;a href="http://www.openspaces.org/display/OS/OpenSpaces+Developer+Challenge"&gt;OpenSpaces Developer Contest&lt;/a&gt;, which gives you the chance to write a cool OpenSpaces plugin or application and win $10K for it - so if you think you're up for the challenge you welcome to give it a shot.&lt;br /&gt;The main idea here is to create a place for all GigaSpaces users to share ideas and code in the form of recommended blue prints, useful plugins and even full blown applications.&lt;br /&gt;&lt;br /&gt;This is my first time setting up such a community web site, and I must say it's been quite interesting so far.&lt;br /&gt;The technical challenges in making such a collaboration platform work seamlessly are not to be taken lightly. There are many moving parts we had to glue together (Wiki, Jira, Forums, SVN - Fisheye and more) and as we at GigaSpaces like to say, having many moving parts in any system is not very easy to deal with ;)&lt;br /&gt;Imagine setting these systems up for every single project, and making sure they all work together in terms of permissions, user management, etc. and making all of that work in less than a month... (p.s. This was a great team effort - thanks to all those involved).&lt;br /&gt;Apart from a number of minor issues, we have found that all the products we use integrated quite well - I assume that the fact that most of them come from the same vendor (Atlassian) has something to do with it (P.S. thank you Atlassian and Jive guys for making our lives easier :) )&lt;br /&gt;&lt;br /&gt;This is also the first chance I got to do some real hands on work with &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html#mvc-coc"&gt;Spring 2.5 MVC framework&lt;/a&gt; (for our signup application). I really liked the annotation based controller configuration, it really makes everything a lot simpler.&lt;br /&gt;We took a very similar approach with OpenSpaces in the upcoming GigaSpaces 6.5 version. Basically we will enable users to configure many aspects of their application (such as remoting, filters, etc.) without having write XML (well, maybe just one line). I'll write more about this in one of my next posts.&lt;br /&gt;&lt;br /&gt;The OpenSpaces.org website already contains some &lt;a href="http://www.openspaces.org/display/OS/Projects"&gt;interesting projects&lt;/a&gt; and there are many more to follow. It's really an indication of what you can do with this technology and how easy it is to use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what next after the launch?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Apart from the user projects, we also intend to use this platform to promote best practices by providing a number of blueprint applications relevant to many of our customers and prospects.&lt;br /&gt;We also intend to publish code samples for new and cool product features, thus enabling our users to interact with us and say what they think about the new features and what they would like to see in the product.&lt;br /&gt;So stay tuned, there's a lot more exciting stuff to come !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5947766887998996490-7805404801717441165?l=uri-cohen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uri-cohen.blogspot.com/feeds/7805404801717441165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5947766887998996490&amp;postID=7805404801717441165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7805404801717441165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5947766887998996490/posts/default/7805404801717441165'/><link rel='alternate' type='text/html' href='http://uri-cohen.blogspot.com/2008/01/this-is-my-first-blog-under-my-new-hat.html' title='OpenSpaces.org goes live!'/><author><name>Uri Cohen</name><uri>http://www.blogger.com/profile/00488617264258321106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
