Visualizing Data Paging for Flex with 2 million database records

In my previous post I shared an example showing data paging for flex. The most important subfeatures of our ‘managed data paging’ feature are:

  1. Loosely coupled interface – the feature will work without implementing a specific server-side interface and can be used with Java,  .NET and PHP
  2. Can be used with ANY Flex data component (applicable to both MX and Spark architectures)
  3. Memory management – our data provider will maintain only specific number of pages in memory and will re-fetch data on as needed basis

We put together another example visualizing how memory management work. The example works with a database table containing 2.6 million records. Any time a page of data is loaded or removed from memory, the visualization component reflects it by drawing or removing a line. You can see the example in action in the video below. The source code and the database script are available at the bottom of the post. Enjoy!

Source code and database:

WebORB for Java v5.0 is released (Clustering, Heroku, ExtJS, RabbitMQ, ZeroMQ)

I am very pleased to announce that we released the new major version of WebORB for Java. The new release adds a variety of very cool features and significantly improves the existing feature set with a number of fixes and improvements. The most notable features in 5.0 are:

  • Clustering. WebORB for Java instances can form dynamic clusters which appear as a single WebORB node to the clients. Clustering is available messaging, data management, RTMP and remoting subsystems of the products:
    • Messaging: for publish/subscribe messaging applications clustering enables message propagation through all nodes of the cluster. Clients can subscribe to any node and will receive messages published through any other node. (Doc)
    • Data Management: Clustered instances of WebORB support client synchronization for data management clients (Flex/AIR/JavaScript). Client applications using WebORB Data Management can create/update/delete database records and other instances of the application will receive synchronization updates regardless of the node they are connected to. (Doc)
    • RTMP: Remote Shared Objects are automatically synchronized across the WebORB cluster. (Doc)
    • Remoting: WebORB introduces support for cluster-wide singletons. A remoting objects enabled for cluster-wide synchronization will maintain its state between remoting invocations regardless of the node handling the invocations. (Doc)
  • Ant task for WebORB Data Management code generation.
  • Ant task for remoting code generation and method invocation.
  • Heroku Integration. WebORB can be deployed into Heroku where it provides remoting and messaging features. WebORB for Heroku is available with cloud-based pricing. (Doc)
  • Pub/Sub Message Filtering. WebORB subscribers can use SQL-like queries when subscribing to a destination to receive only messages satisfying the query. (Doc)
  • ZeroMQ Integration. WebORB messaging (publish/subscribe) destinations can be configured to publish/retrieve messages to/from ZeroMQ sockets. (Doc)
  • RabbitMQ Integration. WebORB publish/subscribe system can now be integrated with RabbitMQ messaging broker. WebORB relays messages published by WebORB clients to a RabbitMQ exchange or queue and likewise, messages retrieved from RabbitMQ are delivered to WebORB subscribers. (Doc)
  • Data Management Integration with Sencha’s ExtJS. WebORB Data Management now generates a sample project demonstrating integration with Sencha’s ExtJS.

A complete list of features and bug fixes is available on the WebORB for Java Release History page.


Configuring Eclipse to Run Tomcat with WebORB

This post documents a pre-requisite step for the JavaScript Integration Course, but it is also useful if you’re doing Java development with Eclipse and WebORB. The instructions in this post will help you configure your development environment so you can develop Java services with Eclipse and have them deployed into Tomcat. Once deployed, your Java services can be consumed (methods can be invoked) by any client supported by WebORB, that is JavaScript, iOS, Android, Flex/AIR, Flash and Silverlight.

To get started, make sure to download and install Eclipse IDE for Java EE Developers. Also, you will need an installation of WebORB for Java. When you download WebORB, you get an installer packaged as a JAR file. Make sure to run the installer and accept all the default settings in the installation. Finally, install the Tomcat server. This post assumes you have the latest version of Eclipse (Eclipse Juno v. 4.2), Tomcat 7.0 and WebORB version 5, however, the instructions are applicable to the older versions of the software as well.

Registering Tomcat as s Server

Locate the “Servers” tan in Eclipse and define a new server using the wizard:

In the “New Server Wizard”, expand the “Apache” node and select “Tomcat 7.0 Server” as shown below:

Click “Next >”. In the next step you need to specify the location of your Tomcat 7 installation. Click the Browse button and locate the root directory of the Tomcat installation:

Click “Finish” to complete the Tomcat configuration. The server should appear in the Servers tab as shown below:

Configuring a Web Project

The next step is to configure an Eclipse project. The project will contain the code for the services which will be deployed into Tomcat/WebORB. From the Eclipse’s main menu select File > New > Dynamic Web Project. Assign the name to the project (these instructions assume the project name is PhonebookService. Also make sure the target runtime is “Apache Tomcat v7.0″ (the server runtime was configured in the previous step). Finally, make sure “Default Configuration for Apache Tomcat v.7.0″ is selected in the drop down box in the Configuration section:

Click “Next >”. There are no changes in the next step, so click “Next >” again. Click the “Generate web.xml deployment descriptor” checkbox:

Click “Finish” to finalize project creation.

Adding WebORB to the Project

To streamline the development WebORB should be added to the project and become a part of the web application. Adding WebORB to the project consists of three to four simple steps:

  1. Register WebORB servlet.
  2. Add configuration files.
  3. Add WebORB jar file.
  4. Add WebORB Console (optional, but highly recommended).

Register WebORB servlet

Locate and expand the WebContent folder in the project’s structure in Project Explorer. The folder should have the web.xml file which is a deployment descriptor for the web application. Right-click the file and select Open With > Text Editor. Eclipse opens the file for editing. Make sure to modify the file to look as shown below:

&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;UTF-8&amp;amp;quot;?&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;web-app xmlns:xsi=&amp;amp;quot;;amp;quot; xmlns=&amp;amp;quot;;amp;quot; xmlns:web=&amp;amp;quot;;amp;quot; xsi:schemaLocation=&amp;amp;quot;;amp;quot; id=&amp;amp;quot;WebApp_ID&amp;amp;quot; version=&amp;amp;quot;3.0&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;display-name&amp;amp;gt;PhonebookService&amp;amp;lt;/display-name&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;listener&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;listener-class&amp;amp;gt;weborb.ORBServletContextListener&amp;amp;lt;/listener-class&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/listener&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;servlet&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-name&amp;amp;gt;weborb&amp;amp;lt;/servlet-name&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-class&amp;amp;gt;weborb.ORBServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;load-on-startup&amp;amp;gt;1&amp;amp;lt;/load-on-startup&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/servlet&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;servlet&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-name&amp;amp;gt;download&amp;amp;lt;/servlet-name&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-class&amp;amp;gt;weborb.DownloadServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;load-on-startup&amp;amp;gt;1&amp;amp;lt;/load-on-startup&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/servlet&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;servlet-mapping&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-name&amp;amp;gt;weborb&amp;amp;lt;/servlet-name&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;url-pattern&amp;amp;gt;*.wo&amp;amp;lt;/url-pattern&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/servlet-mapping&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;servlet-mapping&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;servlet-name&amp;amp;gt;download&amp;amp;lt;/servlet-name&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;url-pattern&amp;amp;gt;/codegen.wo&amp;amp;lt;/url-pattern&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/servlet-mapping&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;welcome-file-list&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;weborbconsole.html&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;index.html&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;index.htm&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;index.jsp&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;default.html&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;default.htm&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;welcome-file&amp;amp;gt;default.jsp&amp;amp;lt;/welcome-file&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/welcome-file-list&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;/web-app&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />

Add Configuration Files

Right-click the WEB-INF folder under WebContent in the project structure and select New > Folder. Type “flex” for the folder name and click Finish. Eclipse creates a new folder under WEB-INF. Right click the new flex folder and select the Import menu option. In the Import window that appear select File System under General. Click “Next >” to continue. Click Browse and navigate to the WebORB installation directory. From there navigate further to webapp/WEB-INF/flex and click “Open”. Select all the files as shown below and click “Finish”.

The next step is adding the main WebORB configuration files. The files will eventually reside in the WEB-INF/classes directory of the deployed web application, but since eclipse rewrites that directory every time when it runs Tomcat, the files must be placed into the “src” folder.

Locate and expand the “Java Resources” node in the root of the project structure. Right click the “src” node and select the “Import” menu item. Select “File System” under “General” and click “Next >”. Click “Browse” and navigate to the WebORB’s installation directory. From there navigate further to webapp/WEB-INF/classes and click “Open”. Select weborb-config.xml and weborb-acl.xml as shown below and click “Finish”:

Add WebORB Jar file

In the minimal deployment WebORB requires only one jar file – weborb.jar. Additional jar files should be added by following the same steps depending on the functionality used by the services and/or WebORB. The example reviewed in this post connects to a MySQL database, therefore two jar files will be added – weborb.jar and the mysql database driver library.

Locate and right-click the lib node under WebContent\WEB-INF node in the project structure. Select the “Import” menu item. Select “File System” under “General” and click “Next >”. Click “Browse” and navigate to the WebORB’s installation directory. From there navigate further to webapp/WEB-INF/lib. Click “Open” and select “mysql-connector-java-5.1.13-bin.jar” and “weborb.jar” as shown below. Click “Finish” to import the files.

Add WebORB Console (optional, but recommended)

Right-click the WebContent node in the project structure. Select New > Folder and create a folder “console”. Right click the newly created “console” folder and select the “Import” menu item. Select “File System” under “General” and click “Next >”. Click “Browse” and navigate to the WebORB’s installation directory. From there navigate further to the “webapp/console” directory. Select all the files as shown below and click “Finish”.

Finally import “weborbconsole.html” from [WEBORB INSTALL DIR]/webapp/ into the WebContent node in the project structure (the import steps are the same as described earlier).

Once all the configuration, JAR and console files are added, the project structure should look as shown below:

Adding Web Application to Tomcat

At this point the project contains the minimally required configuration for WebORB. In order to deploy the project into the Tomcat server configured at the beginning of this post, locate and right-click “Tomcat v7.0 Server at localhost” in the Servers tab. Select the “Add and Remove” menu option:

In the “Add and Remove” window select “PhonebookService” in the “Available” column and click “Add >” to move it to the “Confgured” column as shown below. Click “Finish” to continue.

Adding Java Service

To add a Java service to the project locate and right-click the “src” node under “Java Resources”. Select the New > Package menu item and enter for the package name. The next step is add to a class to the package. This post uses the Java Backend Service provided in the JavaScript Integration Course post. Right-click the node and select the New > Class menu item. Enter Phonebook for the class name and click “Finish” to finalize class creation. Replace the contents of the created class with the  code from the Java Backend Service post.

Running Tomcat and WebORB

Click the “Start the server” button (green circle with a white triangle) in the “Servers” tab. Eclipse launches an instance of Tomcat and deploys the PhonebookService web application into it. You should see the logging output from WebORB as well in the “Console” tab. Once Tomcat starts, open a browser and enter http://localhost:8080/PhonebookService/weborb.wo to open the WebORB Management Console. Once the console starts up, select the Services tab in the WebORB Management Console, expand the WEB-INF/classes node and navigate to the Phonebook service (you will need to expand the “com”, “tmc” and “blog” nodes as well). The Phonebook node represents the class with the same name and contains the methods of the class. Expand the Phonebook node and click the “createListing” method. Enter values for the “name” and “phonenumber” arguments and click “Invoke”. The console invokes the method via WebORB and the service creates a record in the database (see the service’s code for details). Now you can click the “getListings” node and click Invoke. The console invokes the method and displays the results of the method invocation.

The subsequent post will review other development/deployment options, for instance, developing with IntelliJ IDEA and deploying into the standalone version of WebORB. After that, the series will continue with the development of the JavaScript client for the Phonebook service.

JavaScript Integration Course - Java Backend Service

This post continues the Java Integration Course. See the introduction post for an overview as well as instructions for setting up the database. In this post we add a very simple Java backend service which will be used by the JavaScript client in the subsequent development steps. Take a look at the Java code below:

&lt;br /&gt;<br />
package;&lt;/p&gt;<br />
&lt;p&gt;import java.sql.*;&lt;/p&gt;<br />
&lt;p&gt;public class Phonebook&lt;br /&gt;<br />
{&lt;br /&gt;<br />
  /*&lt;br /&gt;<br />
  The connectionURL consists of 3 to 4 parts, depending on if you have&lt;br /&gt;<br />
  permissions set up for your mySQL database.&lt;/p&gt;<br />
&lt;p&gt;  Part 1: &amp;quot;jdbc:mysql://localhost&amp;quot; refers to the url of your mySQL server.&lt;br /&gt;<br />
  Part 2: &amp;quot;3306&amp;quot; refers to the port that mySQL server is running on.&lt;br /&gt;<br />
          3306 is the default port for mySQL.&lt;br /&gt;<br />
  Part 3: &amp;quot;phonebook&amp;quot; this is the name of the database that we will be&lt;br /&gt;<br />
          interacting with.&lt;br /&gt;<br />
  Part 4: &amp;quot;?username=blah&amp;amp;password=blah&amp;quot; - Optional.&lt;br /&gt;<br />
          This query string is used for passing the username and password&lt;br /&gt;<br />
  */&lt;br /&gt;<br />
  private String connectionURL = &amp;quot;jdbc:mysql://localhost:3306/phonebook?user=phonebookuser&amp;amp;password=password&amp;quot;;&lt;br /&gt;<br />
  private Connection conn;&lt;br /&gt;<br />
  private Statement statement;&lt;/p&gt;<br />
&lt;p&gt;  public Phonebook()&lt;br /&gt;<br />
  {&lt;br /&gt;<br />
    try&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      Class.forName( &amp;quot;com.mysql.jdbc.Driver&amp;quot; ).newInstance();&lt;br /&gt;<br />
      this.conn = DriverManager.getConnection( connectionURL );&lt;br /&gt;<br />
      this.statement = conn.createStatement();&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
    catch( Exception ex )&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      ex.printStackTrace();&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
  }&lt;/p&gt;<br />
&lt;p&gt;  public ResultSet getListings() throws SQLException&lt;br /&gt;<br />
  {&lt;br /&gt;<br />
    try&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      String sql = &amp;quot;SELECT id, name, phonenumber FROM listing&amp;quot;;&lt;br /&gt;<br />
      ResultSet listings = statement.executeQuery( sql );&lt;/p&gt;<br />
&lt;p&gt;      return listings;&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
    catch( SQLException ex )&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      // handle any errors&lt;br /&gt;<br />
      System.out.println( &amp;quot;SQLException: &amp;quot; + ex.getMessage() );&lt;br /&gt;<br />
      System.out.println( &amp;quot;SQLState: &amp;quot; + ex.getSQLState() );&lt;br /&gt;<br />
      System.out.println( &amp;quot;VendorError: &amp;quot; + ex.getErrorCode() );&lt;/p&gt;<br />
&lt;p&gt;      throw ex;&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
  }&lt;/p&gt;<br />
&lt;p&gt;  public void createListing( String name, String phonenumber ) throws Exception&lt;br /&gt;<br />
  {&lt;br /&gt;<br />
    try&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      String sql = &amp;quot;insert into listing set name = ?, phonenumber = ?&amp;quot;;&lt;br /&gt;<br />
      PreparedStatement statement = conn.prepareStatement( sql );&lt;br /&gt;<br />
      statement.setString( 1, name &lt;a href='' title='buy cialis'&gt;buy cialis&lt;/a&gt; );&lt;br /&gt;<br />
      statement.setString( 2, phonenumber );&lt;br /&gt;<br />
      statement.execute();&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
    catch( SQLException exception )&lt;br /&gt;<br />
    {&lt;br /&gt;<br />
      exception.printStackTrace();&lt;br /&gt;<br />
      throw exception;&lt;br /&gt;<br />
    }&lt;br /&gt;<br />
  }&lt;br /&gt;<br />
}&lt;br /&gt;<br />

At this point the service can do the following:

  1. Connecting to the database – a connection is created in the class constructor.
  2. Retrieving all the records from the listing table (the getListings method).
  3. Creating a new record in the listing table.

The code assumes you created the user with the “phonebookuser” name and assigned “password” as the user’s password.

Over the course of the subsequent posts in this series, the code will get enhanced and expanded with additional functionality, but at this point, we will keep it as simple as possible until we get some basic integration in place. The next post will focus on configuring IDEA and Eclipse to compile and deploy the service into WebORB as well as validating that the service works.

JavaScript Client-Server Integration Crash Course

WebORB is very well known for its integration capabilities for Flex and Flash clients, but is is an equally powerful integration server for the JavaScript clients as well (both mobile and desktop). In the next series of posts I’d like to demonstrate how easy it is to build a JavaScript application and integrate it with the backend service using WebORB as the integration server. The application I am going to build and document via a series of blog posts is rather simple, but it is representative of a lot of use-cases developers run into when building enterprise or consumer apps. The application will demonstrate basic remote procedure calls (RPC) between JavaScript and Java/.NET, asynchronous calls, retrieving data from a database, updating/deleting/creating database records. Later on I will show how to build the same application using WebORB’s data management framework. Finally, I will delve into publish/subscribe messaging for the JavaScript clients and show how to use JavaScript WebSockets with the WebORB’s messaging APIs.

To start you will need to install the MySQL database server and execute the following script which creates a database used by the application:

&lt;br /&gt;<br />
-- MySQL Administrator dump 1.4&lt;br /&gt;<br />
--&lt;br /&gt;<br />
-- ------------------------------------------------------&lt;br /&gt;<br />
-- Server version	5.1.38&lt;/p&gt;<br />
&lt;p&gt;/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;<br />
/*!40101 SET NAMES utf8 */;&lt;/p&gt;<br />
&lt;p&gt;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;&lt;br /&gt;<br />
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;&lt;/p&gt;<br />
&lt;p&gt;--&lt;br /&gt;<br />
-- Create schema phonebook&lt;br /&gt;<br />
--&lt;/p&gt;<br />
&lt;p&gt;CREATE DATABASE IF NOT EXISTS phonebook;&lt;br /&gt;<br />
USE phonebook;&lt;/p&gt;<br />
&lt;p&gt;--&lt;br /&gt;<br />
-- Definition of table `phonebook`.`Listing`&lt;br /&gt;<br />
--&lt;/p&gt;<br />
&lt;p&gt;DROP TABLE IF EXISTS `phonebook`.`Listing`;&lt;br /&gt;<br />
CREATE TABLE  `phonebook`.`Listing` (&lt;br /&gt;<br />
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;<br />
  `name` varchar(100) DEFAULT NULL,&lt;br /&gt;<br />
  `phonenumber` varchar(15) DEFAULT NULL,&lt;br /&gt;<br />
  PRIMARY KEY (`id`)&lt;br /&gt;<br />

You can also download the script from:

Once the database is created, it is important to create a database user with the username “phonebookuser” and the password set to “password”. Grant all the privileges to the “phonebook” schema to the “phonebookuser” user.

Once the database is setup, you will need to configure your development environment:

  1. Download and install WebORB
  2. Install an IDE. For Java developers we recommend IntelliJ IDEA (The Community Edition is free), but you can also use the Eclipse  IDE. For .NET developers, Visual Studio is your best option.

The next post will explore the server-side code. You will compile and deploy the backend service and try invoking the methods with the WebORB management console.

WebORB for .NET 5.0 is Released (Clustering, EC2 Support, Sencha integration)

We’re happy to announce immediate availability of WebORB for .NET version 5.0. The release includes some very cool features and a bunch of bug fixes and improvements. Among the new features you will find the following:

  • Clustering – WebORB for .NET can automatically form a network cluster which can be defined using a flexible IP/hostname notation. For instance a cluster can be defined using the following expression: 192.168.1.*. Any computer with WebORB on the specified subnet will join the cluster of other WebORB instances running on the same subnet. Once a cluster is formed it can provide the following capabilities:
    • Clustered Publish/Subscribe Messaging – Any supported messaging client can publish a message into any clustered WebORB instance. WebORB cluster automatically propagates the message throughout all nodes which in turn deliver the message to the subscribers connected to them. This completely eliminates a single point of failure and linearly increases scalability of a messaging solution. See clustered pub/sub messaging documentation for additional details.
    • Clustered Data Management – WebORB Data Management (WDM) is a system combining powerful code generation for client and server sides as well as a runtime engine handling data retrieval, record creation, update or deletion. When a record is created, updated or delete, WDM issues a client-synchronization event for all clients which have (or would have) the record in their possession.  The clustering support enables delivery of the client-synchronization events throughout the cluster. The WDM clients can be connected to any clustered-node and they are guaranteed to receive the synchronization events even if they originate elsewhere in the cluster. See clustered data management documentation for additional details.
    • Clustered Remote Shared Objects – Remote Shared Object (RSO) is a functionality available for the RTMP clients (originally Flash and Flex, but now provided to Java and .NET clients with the WebORB’s API). An RSO is a collection of key/value pairs. Multiple clients can be connected to the same RSO – they can create, delete or update any of the key/value pairs. When it happens, all other clients connected to the same RSO receive a change notification. With the clustering support, the RSO clients can establish connections with any clustered node. RSO updates and change notifications take place regardless of the node where the change has originated. See clustered Remote Shared Objects documentation for additional details.
    • Clustered Singleton Remoting Services – WebORB exposed plain .NET objects as remoting services – any client (JavaScript, iOS, Android, Flex, Flash or Silverlight) can call remote, server-side methods, pass in arguments and receive method invocation result. With 5.0 WebORB introduces a new remote service type. Any .NET class can turn itself into a clustered singleton simply by adding a class attribute. WebORB recognizes the attribute and creates a clustered singleton object. Multiple clients can change the state of the object by invoking the methods through different nodes in the cluster. WebORB guarantees that the same instance is modified regardless of the node handling such invocation. See clustered remoting services documentation for additional details.
  • Amazon EC2 Support. WebORB for .NET can now be hosted on Windows EC2 instances. The product supports the entire feature set in the EC2 environment. The primary difference is the cloud-based pricing, which is based on the pay-per-use model. See WebORB for .NET for Amazon documentation for additional details.
  • Sencha ExtJS Support. WebORB Data Management can now generate client-side JavaScript code specifically for the ExtJS framework. The generated code includes the API for retrieving relational data and rendering it in Sencha’s datagrid. It also includes the APIs for record creation, update and deletion.
  • Advanced Publish/Subscribe Message Filtering – All supported client-side messaging APIs now include the support for message topics and selectors. See WebORB selectors and subtopics documentation for additional details.

A complete list of changes is available in the Release History.

Some Procedures of Nuru Therapeutic Massage in Shanghai

In Shanghai, when you enjoy a Nuru Massage, you can uncover essentially the most pleasurable at last when you are moist, so you should also prepare to use a warm, steamy shower or bath for your partner. Just take your time, and tease every other with erotic foreplay. If you finish, don’t dry your bodies off, but think about the Nuru Gel from the water and pour some in to the bowl beside the area precisely wherever you’ve determined on to complete the sensual massage in Shanghai.

Best Elements: You may check out spreading vinyl sheets above your bed or even the place wherever you would prefer to do the therapeutic massage in acquiring the perfect slippery sensation. You should not do the massage on something with a delicate finish.

To start this kind of massage:
1. You should prepare 1 or 2 bowls, warm water, four Towels Pillows, best region temperature, scented bath oil at first.
2. Put the two bowls and a place-temperature warm water beside you through the Shanghai therapeutic massage.
3. then, generating the experience much more sensual, check out scenting the water with a tiny oil, and use desirable bowls, so as to enjoyment all of the senses.
4. You may also would like to use a towel for every of you in effortless achieve. Again, try out to choose towels that are pleasing for you to produce the therapeutic massage with a lot of extra pleasant. you should not choose a towel that will capsule off on your skin.
5. Place an extra towel throughout the place wherever you’ll lay your heads.
6. Finally, you can dunk your container of Nuru Gel during the bowl with warm water. Allow the Nuru Gel to continue to be submerged suitable up until it has attained a at ease warmth.
7. Dim the lights, light some candles. Some individuals can get pleasure from throwing colored scarves in excess of the leading rated of their lampshades. It will lend a sultry, colorful glow for your acquainted space which will give you the more sensual and mysterious feeling.

Let your partner relax in the comfy place with their head to the towel. Ordinarily folks favor to rest with their manage pointing to 1 aspect or even the other, and their arms relaxed at their sides. Sleek the warm blend of Nuru Gel and water above their physique in tiny handfuls, making it possible for it to run all more than their physique and yours as effectively. There are many sauna club in Shanghai can provide the Nuru therapeutic massage such as the following.

1. Hot sea sauna center
Hot sea sauna center is located in Shanghai’s most prosperous area, 1200 square meters’ shining space, fashionable bar which can accommodate more than 1000 people, with more than 100 parking Spaces. The golden is the main color of this club which make the clients feel mysterious and seductive. with its increasingly popular consumer trend, this club has become a indispensable part of the urban nightlife. — “the sensual city, sexy bar” is the core concept, this club is designed by the high-profile top designers. Luxurious interior space by plush couch sofa design and Austrian crystal droplight of adornment to build out, also they will provide VIP rooms.
2. Urban Style Aromatherapy Sauna Center
This sauna club is different from any other bathing center, while enjoy the sauna, there you can see people’s square, centre for the performing arts, modern metropolis, such as high precision. Of course, you don’t have to worry about the window glass perspective to spring leaks, This club can provide you a special massage which is called Aromatherapy massage that can help you improve body cell metabolism and also can nourish the skin, the perfect service here is also well-known.

WebORB Data Services Plugin for Flash Builder

If you develop with Flash Builder and use WebORB, read on, you will greatly enjoy this new functionality. The functionality is not entirely new, we had the plugin for quite some time. The main problem most users have encountered with the plugin was the installation process. We have fully reimplemented the plugin and added better integration support in the product itself.

The plugin now can be installed using Eclipse’s standard plugin installation process. To get started, make sure to download and install the latest nightly build of the product (or version 4.5 once it becomes available). To install the plugin:

  1. From the main menu select Help and then ‘Install New Software’
  2. Enter the following address for the plugin’s “update site” and press Enter:
  3. Select the checkbox next  to “WebORB plugins for Flash Builder”. The window in Eclipse/Flash Builder should look as shown in the image below:
  4. Click through the installation wizard to complete the installation.
  5. Click OK if you get a security warning saying the software is unsigned.
  6. Once the installation is complete Flash Builder/Eclipse will offer a choice of applying the changes or restarting the application. Make sure to choose the restart option.

For the instructions on how to use the plugin, see WebORB documentation:

WebORB Nightly Builds available

We have updated our product build system to deliver nightly product builds to you. When you login to our download center

and select WebORB for .NET or WebORB for Java, you will see a list of the nightly builds available for download. The nightly builds deliver all the latest updates and bug fixes we’re adding while working toward the next product release. Please keep in mind that the nightly builds are not certified by our QA as “production ready” code, however, the code delivered through the nightly builds does pass our minimally required set of tests.

We need your feedback
When you download and try a nightly build, please report any problems you encounter through our discussion forum (.NET forum, Java forum) or the bug tracking system.

Dynamic Messaging Destinations for Flex and other clients

Messaging destinations is the central concept in publish/subscribe messaging supported by WebORB. The feature is available for Flex, AIR, Javascript, native Java/Android, and .NET clients. A program can be in the role of producer or consumer (or both). Producers publish messages into a destination and consumers subscribe to receive published messages. Typically messaging destinations are registered in a configuration file (WEB-INF/flex/messaging-config.xml), however, WebORB also supports destinations created at run-time – thus called dynamic messaging destinations. The dynamic nature of the destinations can add a lot of flexibility to applications relying on publish/subscribe messaging. For instance, one can easily create a short-lived messaging destination for quick message exchange or some private messaging. The example below demonstrates Java code registering a dynamic destination using the WebORB for Java API:

package demo.messaging.destination;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.ORBConstants;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.config.FlexMessagingServiceConfig;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.config.ORBConfig;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.config.ORBServerConfig;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.messaging.v3.MessagingDestination;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.messaging.v3.MessagingServiceHandler;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
import weborb.v3types.core.DataServices;&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;import java.util.Hashtable;&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;public class DestinationFactory&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
{&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  public &lt;div style=&quot;display: none&quot;&gt;&lt;a href='' title='cialis online without prescription'&gt;cialis online without prescription&lt;/a&gt;&lt;/div&gt; String createMessagingDestination( String name ) throws Exception&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // create destination object. This is as basic as it gets, constructor with the destination name&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    MessagingDestination destination = new MessagingDestination( name );&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // setup the most basic properties - the name of the class handling&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // subscriptions and publications and a class where the messages are stored&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // until they are retrieved by the consumers.&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    Hashtable properties = new Hashtable();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    properties.put( ORBConstants.MESSAGE_STORAGE_POLICY, &amp;amp;quot;weborb.messaging.v3.MemoryStoragePolicy&amp;amp;quot; );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    properties.put( ORBConstants.MESSAGE_SERVICE_HANDLER, &amp;amp;quot;weborb.messaging.v3.MessagingServiceHandler&amp;amp;quot; );&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // register properties&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    destination.setProperties( properties );&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // initialize handler from the properties&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    destination.setConfigServiceHandler();&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // register the destination&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    DataServices dataServices = ORBConfig.getORBConfig().getDataServices();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    dataServices.getDestinationManager().addDestination( name, destination );&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // REGISTERING DESTINATION SO IT IS VISIBLE IN THE MANAGEMENT CONSOLE&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // The following two lines are needed if you would like the destination&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // to appear in the management console, therefore the code below is optional&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    // set the channel name, so the console knows how to connect to the destination&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    // in the &amp;amp;quot;Test Drive&amp;amp;quot; mode.&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    destination.setChannelName( &amp;amp;quot;my-polling-amf&amp;amp;quot; );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    FlexMessagingServiceConfig serviceConfig = ORBServerConfig.getFlexMessagingServiceConfig();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    serviceConfig.addFlexMessagingDestination( FlexMessagingDestination.getDestinationScope( destination ) );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    return name;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
}&amp;lt;br /&amp;gt;&lt;br /&gt;<br />

To further demonstrate how dynamic destinations can be used with the Flex client, see the following Flex application code. The application’s workflow consists of the following steps:

  1. User enters a name for a dynamic destination to create and pressed the Create Destination button.
  2. Flex client invokes the createMessagingDestination Java method shown above.
  3. When the remote method invocation returns a result, the Flex client constructs a Producer and a Consumer objects. The consumer is subscribed to the newly created destination.
  4. When the user enters text and clicks the Send Message button, the Flex client uses the Producer object to publish the message into the destination.
  5. The consumer object receives the message from the destination and displays it in the text area.

&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;utf-8&amp;amp;quot;?&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;s:Application xmlns:fx=&amp;amp;quot;;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
			   xmlns:s=&amp;amp;quot;library://;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
			   xmlns:mx=&amp;amp;quot;library://;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
			   width=&amp;amp;quot;100%&amp;amp;quot; height=&amp;amp;quot;100%&amp;amp;quot; creationComplete=&amp;amp;quot;init()&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;s:layout&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:FormLayout/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/s:layout&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;s:states&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:State name=&amp;amp;quot;InitialState&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:State name=&amp;amp;quot;DestinationCreated&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/s:states&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;fx:Declarations&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;!-- Place non-visual elements (e.g., services, value objects) here --&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/fx:Declarations&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;fx:Script&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;![CDATA[&amp;lt;br /&amp;gt;&lt;br /&gt;</p>
<p>  import mx.controls.Alert;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.messaging.ChannelSet;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.messaging.Consumer;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.messaging.Producer;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.messaging.channels.AMFChannel;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.messaging.messages.AsyncMessage;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import mx.rpc.remoting.RemoteObject;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  import weborb.messaging.WeborbMessagingChannel;&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private var remoteService:RemoteObject;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  private var consumer:Consumer;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  private var producer:Producer;&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  public function init():void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    remoteService = new RemoteObject( &amp;amp;quot;GenericDestination&amp;amp;quot; );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    remoteService.source = &amp;amp;quot;demo.messaging.destination.DestinationFactory&amp;amp;quot;;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    remoteService.createMessagingDestination.addEventListener( ResultEvent.RESULT, destinationCreated );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    remoteService.createMessagingDestination.addEventListener( FaultEvent.FAULT, gotError );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private function destinationCreated( evt:ResultEvent ):void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    currentState = &amp;amp;quot;DestinationCreated&amp;amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    consumer = new Consumer();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    consumer.destination = evt.result as String;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    //var channel:AMFChannel = new AMFChannel( &amp;amp;quot;custom-amf-channel&amp;amp;quot;, &amp;amp;quot;weborb.wo&amp;amp;quot; );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    var channel:WeborbMessagingChannel = new WeborbMessagingChannel( &amp;amp;quot;custom-rtmp-channel&amp;amp;quot;, &amp;amp;quot;rtmp://localhost/root&amp;amp;quot; );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    var channelSet:ChannelSet = new ChannelSet();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    channelSet.addChannel( channel );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    consumer.channelSet = channelSet;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    consumer.addEventListener( MessageEvent.MESSAGE, gotMessage );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    consumer.subscribe();&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;    producer = new Producer();&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    producer.destination = evt.result as String;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    producer.channelSet = channelSet;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private function gotError( evt:FaultEvent ):void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br /> &amp;amp;quot;Server reported an error: &amp;amp;quot; + evt.fault.faultDetail );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private function createDestination():void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    remoteService.createMessagingDestination( destinationName.text );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private function sendMessage():void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    var asyncMessage:AsyncMessage = new AsyncMessage( messageText.text );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    producer.send( asyncMessage );&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;/p&amp;gt;&lt;br /&gt;<br />
&amp;lt;p&amp;gt;  private function gotMessage( evt:MessageEvent ):void&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  {&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    log.text = evt.message.body.toString() + &amp;amp;quot;\n&amp;amp;quot; + log.text;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  }&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
]]&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;/fx:Script&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;s:HGroup width=&amp;amp;quot;100%&amp;amp;quot; paddingBottom=&amp;amp;quot;2&amp;amp;quot; paddingTop=&amp;amp;quot;2&amp;amp;quot; verticalAlign=&amp;amp;quot;middle&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:Label width=&amp;amp;quot;150&amp;amp;quot; text=&amp;amp;quot;Destination Name:&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:TextInput id=&amp;amp;quot;destinationName&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:Button label=&amp;amp;quot;Create Destination&amp;amp;quot; click=&amp;amp;quot;createDestination()&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/s:HGroup&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;s:HGroup width=&amp;amp;quot;100%&amp;amp;quot; paddingBottom=&amp;amp;quot;2&amp;amp;quot; paddingTop=&amp;amp;quot;2&amp;amp;quot; verticalAlign=&amp;amp;quot;middle&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:Label width=&amp;amp;quot;150&amp;amp;quot; text=&amp;amp;quot;Message:&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:TextInput id=&amp;amp;quot;messageText&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:Button label=&amp;amp;quot;Send&amp;amp;quot; click=&amp;amp;quot;sendMessage()&amp;amp;quot; enabled=&amp;amp;quot;false&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
      enabled.DestinationCreated=&amp;amp;quot;true&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/s:HGroup&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;s:HGroup width=&amp;amp;quot;100%&amp;amp;quot; height=&amp;amp;quot;200&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
    &amp;amp;lt;s:TextArea id=&amp;amp;quot;log&amp;amp;quot; width=&amp;amp;quot;413&amp;amp;quot; height=&amp;amp;quot;100%&amp;amp;quot;/&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
  &amp;amp;lt;/s:HGroup&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;lt;/s:Application&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />

Since the client code references the weborb.messaging.WeborbMessagingChannel class (needed only if the client-server publish/subscribe communication should be done via RTMP), the application must reference weborb.swc in the Flash Build Path of the project. The library is available at:

WebORB for Java – [WEBOBR INSTALL DIR]/webapp/weborbassets/wdm

WebORB for .NET – [WEBOBR INSTALL DIR]/weborbassets/wdm

Complete Flex project with the code shown above can be downloaded from:

Compiled Java code can be downloaded from (the file should be deployed into WEB-INF/lib):

For more information about the Dynamic Destination API, see the corresponding section in the WebORB Documentation.