To start building streaming solutions, you need to extend BlazeDS to utilize modern
JEE technologies. We’ll use asynchronous servlets offered by the Jetty server.
JEE stands for Java Enterprise Edition. It was formerly knows as J2EE.
The Networking Architecture of BlazeDS
BlazeDS provides a clean separation of the networking layer (a servlet container) from
the actual implementation of server-side services used by Flex clients. To recap what
you learned in Chapter 5, the elements that are communicating on the servlet container
level and delivering messages to and from services are called endpoints. If you open the
configuration file services-config.xml that comes with BlazeDS, you’ll find declarations
of several communication channels, for example:
<endpoint
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
By adding new or extending existing endpoints, you can add new or extend existing
protocols or even expose the low-level networking in the way required by your appli-
cation. Figure 6-4 depicts the business part of the application as a service that can be
accessed via an endpoint of the protocol being used (a BlazeDS implementation of AMF,
in our example). Both your application and BlazeDS live inside the servlet container.
Figure 6-4. Server-side layers
The Networking Architecture of BlazeDS S | | 277
Pdf to jpg - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
convert pdf to 300 dpi jpg; convert multi page pdf to jpg
Pdf to jpg - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
convert pdf to jpeg; change pdf to jpg file
The following sections demonstrate how Farata Systems extended BlazeDS to work
with Java nonblocking I/O (NIO) and continuations (suspend/resume mode) offered
by the Jetty API.
Setting Up a BlazeDS Sample Application on Jetty
In this exercise, you’ll need to use Jetty, as it’s the only open source implementation of
the asynchronous servlets based on the suspend/resume mode at the time of this
writing.
To set up a BlazeDS sample application with Jetty, follow these three steps:
1.Download and install Jetty from http://dist.codehaus.org/jetty/ according to its in-
stallation instructions. The steps assume that you’ll install it into the folder /jetty,
but you can use any other folder; just modify the configuration files accordingly.
2.Download the BlazeDS turnkey distribution file from http://opensource.adobe.com/
wiki/display/blazeds/Release+Builds. Unzip it to a /samples folder. Locate the file
samples.war there and unzip it into the /samples folder under jetty/webapps-plus/.
Start the sampledb database by executing the script provided with this turnkey
distro for your OS—for example, /samples/sampledb/startdb.sh.
3.Uncomment the following section in the file /jetty/etc/jetty-plus.xml to automati-
cally include all applications located in the folder webapps-plus:
<Call name="addLifeCycle">
<Arg>
<New class="org.mortbay.jetty.deployer.WebAppDeployer">
<Set name="contexts"><Ref id="Contexts"/></Set>
<Set name="webAppDir"><SystemProperty name="jetty.home" 
default="."/>/webapps-plus</Set>
<Set name="parentLoaderPriority">false</Set>
<Set name="extract">true</Set>
<Set name="allowDuplicates">false</Set>
<Set name="defaultsDescriptor"><SystemProperty name="jetty.home"
default="."/>/etc/webdefault.xml</Set>
<Set name="configurationClasses"><Ref id="plusConfig"/></Set>
</New>
</Arg>
</Call>
Now you can start Jetty by entering the following command at the prompt (in Win-
dows, replace the 
etc/
with another folder):
etc/jetty-plus.xml
Once the server starts, open http://localhost:8080/samples/ in your web browser and
make sure that both the Traders Desktop and the Chat sample applications that come
with BlazeDS work.
278 | | Chapter 6: Open Source Networking Solutions
Online Convert Jpeg to PDF file. Best free online export Jpg image
Download Free Trial. Convert a JPG to PDF. Web Security. All your JPG and PDF files will be permanently erased from our servers after one hour.
convert pdf to jpg converter; convert pdf image to jpg
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Download Free Trial. Convert a PDF File to JPG. Web Security. Your PDF and JPG files will be deleted from our servers an hour after the conversion.
advanced pdf to jpg converter; bulk pdf to jpg
Setting BlazeDS Messaging to Use the Jetty NIO API
Add the NIO messaging endpoint to the BlazeDS configuration:
1.Get the file http://myflex.org/books/entflex/nioblaze.jar and copy it into the appli-
cation’s folder, /jetty/webapps-plus/samples/WEB-INF/lib. This file is also available
with this book’s samples.
2.Open /jetty/webapps-plus/samples/WEB-INF/flex/services-config.xml and com-
ment out this section:
<!--channel-definition id="my-streaming-amf"
class="mx.messaging.channel.StreamingAMFChannel">
<endpoint
url="http://{server.name}:{server.port}/{context.root}/messagebroker/
streamingamf"
class="flex.messaging.endpoints.StreamingAmfEndpoint"/>
</channel-definition-->
3.Add the following section there instead (please note that we are replacing the
standard 
StreamingAmfEndpoint
with our own 
NioAmfEndpoint
):
<channel-definition id="my-streaming-amf"
class="mx.messaging.channel.StreamingAMFChannel">
<endpoint
url="http://{server.name}:{server.port}/{context.root}/messagebroker/
streamingamf"
class="com.farata.nioblaze.messaging.endpoints.NioAmfEndpoint"/>
</channel-definition>
4.Restart Jetty. You should be able to run the same Trader Desktop or Chat appli-
cation, only this time you can support far more concurrent users, and shortly you’ll
see why.
NIO Performance Test
Jetty itself is powerful enough to support 20,000 connected users. The benchmark tests
were performed on a standard Amazon EC2 virtual server, and you can find details
about these tests at the site http://cometdaily.com/2008/01/07/20000-reasons-that
-comet-scales/.
When infused with BlazeDS, however, can Jetty still support thousands of users? We
recently put this question to the test at Farata Systems.
The Theory
BlazeDS was offered as a free version of LCDS remoting that also promised scaled-down
support of a modest number of concurrent users for data push.
But enterprise IT shops wanted the best of both worlds: an inexpensive but scalable
solution. The great part about LCDS and BlazeDS is that their code base is extendable
and you can teach these old dogs new tricks. The problem is that their original code is
The Networking Architecture of BlazeDS S | | 279
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
String inputFilePath = @"C:\input.pdf"; String outputFilePath = @"C:\output.jpg"; // Convert PDF to jpg. C# sample code for PDF to jpg image conversion.
pdf to jpg converter; convert pdf document to jpg
C# Image Convert: How to Convert Tiff Image to Jpeg, Png, Bmp, &
RasterEdge.XDoc.PDF.dll. String inputFilePath = @"C:\input.tif"; String outputFilePath = @"C:\output.jpg"; // Convert tiff to jpg.
to jpeg; convert from pdf to jpg
targeting only conventional Java Servlet containers, and that the performance/scala-
bility of BlazeDS also depends on the number of concurrent connections supported by
the hosting server, such as Tomcat, JBoss, WebSphere, and so on.
Farata Systems architects started experiments in this area when the prerelease of Jetty
7 was announced.
BlazeDS runs in a servlet container, which maintains a thread pool. A thread is given
to a client request and is returned back to the reusable pool after the client has been
served. When the client uses a so-called long-running connection, the thread becomes
locked by that client until it finishes the request. So the number of the concurrent
subscribers in BlazeDS depends on the number of threads that a particular servlet con-
tainer can hold simultaneously.
Though the source code of BlazeDS has 10 as a default number of simultaneous con-
nections, it can be increased to several hundred, and the actual number depends on the
server’s threading configuration, CPU, and the size of its Java Virtual Machine (JVM)
heap memory. This number can also be affected by the number of messages processed
by the server in the unit of time as well as the size of the messages.
Nonblocking I/O combined with Jetty’s suspend/resume processing mode allows you
to write code that is not tied to available server threads. The servlet container sends a
request for execution and puts it in a suspended mode, releasing the thread for other
requests. When the result comes back, it resumes the processing of the request, effi-
ciently recycling a smaller number of threads. Because of that, the number of streaming
connections can be increased to thousands.
The first goal was to create a module for BlazeDS to support Jetty’s suspend/resume
mode with the messaging based on AMF streaming. Additional endpoints (components
responsible for binding actual application services with the servlet container) were cre-
ated based on the BlazeDS open source implementation.
Three small changes are required to add NIO endpoints to a standard BlazeDS (or LCDS
for that matter) application in the standard Jetty installation:
1.Add Farata’s nioblazeds.jar to Jetty’s lib folder.
2.Modify the services-config.xml file of BlazeDS to change the standard thread-based
endpoint for AMF streaming with Farata’s 
NioAmfEndpoint
, which supports Jetty’s
API.
3.Increase the parameter of Jetty’s number of open file handlers based on the number
of concurrent user requests that you are planning to process.
The Trader Desktop, a sample application that comes with BlazeDS, was successfully
deployed under BlazeDS/Jetty and tested without any changes in enhanced endpoints.
280 | | Chapter 6: Open Source Networking Solutions
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
similar software; Support a batch conversion of JPG to PDF with amazingly high speed; Get a compressed PDF file after conversion; Support
c# pdf to jpg; convert pdf file to jpg
JPG to JBIG2 Converter | Convert JPEG to JBIG2, Convert JBIG2 to
Image Converter Pro - JPEG to JBIG2 Converter. Convert JPEG (JPG) Images to, from JBIG2 Images on Windows.
conversion of pdf to jpg; convert pdf file into jpg format
The source code of this solution is available in the CVS repository of the
Clear Toolkit framework in the NIOBlaze package, available at http://
cleartoolkit.cvs.sourceforge.net/viewvc/cleartoolkit/.
The next step was to stress-test this application using one of the commercial testing
software suites that supports the AMF protocol. Farata engineers teamed up with a
company called Neotys, the creator of a robust stress-testing product called NeoLoad
that allows testers to emulate the workload of tens of thousands of users hitting a server
via both the HTTP and AMF protocols.
This test was recorded, and you can watch a short screencast that emulates 5,000 users
working with the Trader Desktop over a five-minute period. To view it, go to http://
myflex.org/demos/JettyBlazeDS/JettyBlazeDSloadTest.html. One screen is shown in
Figure 6-5.
The test starts with 200 users ramping up at the rate of 500 users per 10 seconds.
Figure 6-5. Configuring performance tests with NeoLoad
In this demo, the server-side feed sends the messages about the latest stock prices to
the Flex subscribers. After that, you’ll be monitoring this process using ds-console,
which is yet another sample application that comes with BlazeDS.
The Networking Architecture of BlazeDS S | | 281
JPG to GIF Converter | Convert JPEG to GIF, Convert GIF to JPG
Converter. Convert JPEG (JPG) Images to, from GIF Images on Windows. JPEG to GIF Converter can directly convert GIF files to JPG files.
convert multipage pdf to jpg; convert pdf page to jpg
JPG to DICOM Converter | Convert JPEG to DICOM, Convert DICOM to
Image Converter Pro - JPEG to DICOM Converter. Convert JPEG (JPG) Images to, from DICOM Images on Windows.
convert pdf pages to jpg online; convert multiple page pdf to jpg
First, the monitor will show just one client with a small number of messages, and the
number of maximum streaming clients is set to 65,535.
Next, NeoLoad creates a large number of users. This test uses five machines to emulate
the load. The push count is the number of messages sent by the server. The server runs
on an eight-CPU machine. Watch the number of allocated threads and the number of
users—the number of threads is several times lower than the number of users at any
given time. Please note that even when the number of users grows, the number of
threads doesn’t. These processes are not expensive from the perspective of either the
memory or the CPU utilization.
In this test, the system was purposely restricted by introducing throttling in the
Feed.java file. During this 5-minute test, the server pushed about 2.1 million messages.
Because during the first 3 minutes (180 seconds) of the test NeoLoad was ramping up
the number of users until it reached 5,000, you should count this time as half of this
amount, or 90 seconds. Adding another 2 minutes (after the first 3) brings the adjusted
test time to 210 seconds, or 10,000 messages per second. This means that each of 5,000
users received 2 messages per second, which matches the throttling parameter that was
set in Feed.java (400 ms of sleep time between messages broadcast).
Based on the server CPU and memory utilization this setup won’t have difficulties
supporting over 12,000 users, as long as external load generators are added and the
network bandwidth is increased.
One of the machines used in this test was an eight-core MacPro for the server, where
four of the cores were shared with the VM emulating one of the client’s machines. There
were also two 3 Ghz desktops, one MacBook Pro, and one 2 Ghz Dell laptop; that’s
the one that will work really hard trying to parse 300 messages per second.
Figure 6-6 depicts a snapshot of the NeoLoad window during our performance test.
Farata ran the same test with an Apache Tomcat server using traditional thread-based
I/O and standard BlazeDS long polling. Tomcat comes preconfigured with 250 threads.
After gradually increasing this number, the same test can run for about 800 users, but
pretty soon the system becomes unstable, running out of threads and giving out mem-
ory errors.
Tomcat also has experimental NIO implementation of the servlet container imple-
menting Comet techniques. Farata Systems has created an endpoint adapter to utilize
the NIO of Jetty with BlazeDS. But while holding high the promises of a more efficient
full-duplex protocol, the current Tomcat Comet implementation had some reliability
issues.
The screencast should be treated as a feasibility study and technical comment, and not
as a benchmark of any sort, as the implementation still has a lot of room for improve-
ment. More tests are required for a proper scalability benchmark.
282 | | Chapter 6: Open Source Networking Solutions
Based on these results, you may consider using open source BlazeDS in the most de-
manding enterprise Flex applications. If you are looking for a no-cost extensible solu-
tion that works in a standard web environment with corporate firewalls and requires
session management, properly tuned BlazeDS under a Jetty server becomes a good
scalable solution for your next RIA.
In the summer of 2009, Jetty started offering its own asynchronous im-
plementation of BlazeDS that utilizes Jetty 7 continuations. You can
read about it at a blog post titled, “Asynchronous BlazeDS Polling with
Jetty 7 Continuations.”
Both LCDS and BlazeDS can be treated as a very good transport solution between Flash
Player on the client side and Java application server on the server side. But the main
focus of RIA architects should remain the same—how to minimize the amount of cod-
ing of application programmers that need to communicate with the server, which will
be the subject of the next section.
Data Access Automation
Once the transport technology has been selected, you need to try to remove the com-
plexity of the data access and persistence layer. The Data Management Services that
Figure 6-6. Monitoring performance tests with NeoLoad
Data Access Automation n | 283
come with LCDS provide an excellent model for automation of this task. But you can
develop your own framework based on the open source products, and in the following
sections, you’ll learn how to re-create all the necessary components for a data persis-
tence framework.
To offer functionality similar to that of LCDS in our framework, we need to create the
following data management components:
• Data transfer objects
ChangeObject
Assembler
• A change-tracking collection
• A destination-aware collection
In the following sections, we’ll offer you Farata Systems’ version of such
components. If you like them, get their source code in the CVS reposi
tory at SourceForge and use them as you see fit. We also encourage you
to enhance them and make them available for others in the same code
repository.
Data Transfer Objects
Using data transfer objects (DTOs) is very important for architecting automated up-
dates and synchronization. In Flex/Java RIA, there are at least two parties that need to
have an “exchange currency”: ActionScript and Java. Each of these parties has their
own contracts on how to support the data persistence. Let’s concentrate on the
ActionScript part first.
In the Café Townsend sample, the data objects responsible for the exchange between
Java and ActionScript are EmployeDTO.java and EmployeeDTO.as (see a fragment of
EmployeeDTO.as in Example 6-2). The Java side sends instances of 
EmployeDTO
objects,
which are automatically re-created as their ActionScript peers on the frontend.
Example 6-2. Employee.DTO.as
/* Generated by Clear Data Builder (ActionScriptDTO_IManaged.xsl) */
package com.farata.datasource.dto
{
import flash.events.EventDispatcher;
import flash.utils.Dictionary;
import flash.utils.ByteArray;
import mx.events.PropertyChangeEvent;
import mx.core.IUID;
import mx.utils.UIDUtil;
[RemoteClass(alias="com.farata.datasource.dto.EmployeeDTO")]
[Bindable(event="propertyChange")]
284 | | Chapter 6: Open Source Networking Solutions
{
// Internals
public var _nulls:String;
// Properties
private var _EMP_ID : Number;
private var _MANAGER_ID : Number;
...
public function get EMP_ID() : Number{
return _EMP_ID;
}
public function set EMP_ID( value : Number ):void{
var oldValue:Object = this._EMP_ID;
if (oldValue !== value)   {
this._EMP_ID = value;
}
}
public function get MANAGER_ID() : Number{
return _MANAGER_ID;
}
public function set MANAGER_ID( value : Number ):void{
var oldValue:Object = this._MANAGER_ID;
if (oldValue !== value)   {
this._MANAGER_ID = value;
}
}
var properties:Dictionary = new Dictionary();   
properties["EMP_ID"] = _EMP_ID;
properties["MANAGER_ID"] = _MANAGER_ID;
return properties;
}
_EMP_ID = properties["EMP_ID"];
_MANAGER_ID = properties["MANAGER_ID"];
... 
}
private var _uid:String;
public function get uid():String
{
return _uid;
}
public function set uid(value:String):void
{
_uid = value;
}
Data Access Automation n | 285
public function EmployeeDTO() {
_uid = UIDUtil.createUID();
}
private function dispatchUpdateEvent(propertyName:String,
dispatchEvent(
);                      
}
public function clone(): EmployeeDTO {
x.properties = this.properties;
return x;
}
}
The class starts with a 
[RemoteClass]
metadata tag that instructs the compiler that
this class should be marshaled and re-created as its peer 
com.farata.data
source.dto.EmployeeDTO
on the server side.
This class is an event dispatcher and any changes to its members will result in the update
event, which allows you to perform easy tracking of its properties’ changes by dis-
patching appropriate events. This feature is also important for the UI updates if the
DTOs are bound to UI controls, such as a 
DataGrid
.
Note that all the properties in this class are getter/setter pairs: they can’t remain public
variables, because we want the 
dispatchUpdateEvent()
method to be called every time
the variable’s value is being changed.
In addition to the functional properties like 
EMP_ID
and 
EMP_FNAME
, the class also con-
tains a setter and getter for the 
uid
property; this qualifies the class as an implementer
of the IUID interface. Existence of a 
uid
property allows easy indexing and searching
of records on the client.
However, implementing 
uid
as a primary key on the server side is crucial in order to
ensure synchronization and uniqueness of updates. Usually 
uid
represents the primary
key from a database table. The other function often required by automatic persistence
algorithms is 
getChangedPropertyNames()
, in order to teach DTO to mark updated
properties (Example 6-3).
Example 6-3. EmployeeDTO.java
package com.farata.datasource.dto;
import java.io.Serializable;
import com.farata.remoting.ChangeSupport;
286 | | Chapter 6: Open Source Networking Solutions
Documents you may be interested
Documents you may be interested