Figure 6-8. Batching remote calls
The following code snippet illustrates how you can add two collections from the order-
processing example to one batch and send it for processing to the server:
var bs: com.farata.remoting.BatchService;
...
bs = new BatchService();
bs.addEventListener(FaultEvent.FAULT, onFault);
bs.registerCollection(orderItems,1); //1 - priority, child of "0"
...
var batch:Array = bs.batchRegisteredCollections();
bs.send(batch);
You can use the 
BatchService
not only with 
DataCollection
s, but also with regular Flex
collections. It allows you to batch the execution of any sequence of remote calls.
Users of the SQL-based branch of CDB benefit from automatic generation of the re-
quired Java functions. Otherwise, your Java DAO has to implement the interface
IBatchTransactionServiceSupport
.
If your transaction includes only a data collection, consider using 
DataCollec
tion.sync(true)
, which further reduces the amount of manually written code required
to perform transactional persistence of associated collections.
By now, you should have a good understanding of how to approach data automation
in Flex and BlazeDS, and the next section will show you how to use the headers of the
AMF messages that travel with your data in the protocol layer.
Using AMF Message Headers
The data access is automated, and the data gets transferred over the AMF protocol,
which, as you may remember, is built on top of HTTP. The next goal is to continue
minimizing the amount of coding that application programmers need to do in the
client/server communication. For this, we’ll try to modify the existing communications
layer by adding to it application-specific information.
Using AMF Message Headers s | | 307
Convert .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 gif or jpg; convert pdf picture to jpg
Convert .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
batch pdf to jpg online; convert pdf file to jpg format
Sometimes, certain information needs to be passed from the client without introducing
additional arguments to the application function calls. For example, if the user ID needs
to be passed to the server-side function 
getEmployee()
, you may avoid adding a pa-
rameter 
userId
to the function signature. Instead, it can be added to the AMF message
on the protocol level. Besides the user ID, you may need to pass some security restric-
tions, application tokens, or the client context—think of HTTP cookies. Although you
might need to add these parameters at certain execution points, you may not pass them
as part of the API.
Though the AMF payload is located in the bodies of the messages that are being sent,
you can still add headers to these messages. Here is a quick five-step process:
1.Define a class to store the data you want to be passed in the message headers—
sort of like your own cookies—for example, some operation context (Exam-
ple 6-18).
Example 6-18. OperationContext.as
package com.farata.rpc.remoting {
import flash.utils.Dictionary;
import mx.messaging.messages.IMessage;
public final class OperationContext extends Object
{
public function _onBeforeInvoke(msg:IMessage):void {
var fld:Object = null;
for(fld in globalHeaders)
msg.headers[fld] = globalHeaders[fld];
for(fld in headers)
msg.headers[fld] = headers[fld];
}
}
}
2.Extend the Flex 
Operation
class from the communication layer to append the pre-
vious headers on the Remote Method Invocation. Our 
Operation
class will instan-
tiate 
OperationContext
and will call its method 
_onBeforeInvoke()
every time its
invoke()
method is being called (Example 6-19).
Example 6-19. Customized Operation.as
package com.farata.rpc.remoting.mxml
{
import mx.core.mx_internal;
use namespace mx_internal;
import mx.rpc.remoting.mxml.Operation;
import mx.rpc.remoting.RemoteObject;
import mx.rpc.AsyncToken;
308 | | Chapter 6: Open Source Networking Solutions
Online Convert Jpeg to PDF file. Best free online export Jpg image
Online JPEG to PDF Converter. Download Free Trial. Convert a JPG to PDF. You can drag and drop your JPG file in the box, and then start
best pdf to jpg converter online; best pdf to jpg converter for
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Download Free Trial. Convert a PDF File to JPG. Easy converting! We try to make it as easy as possible to convert your PDF files to JPG.
change pdf to jpg image; convert pdf image to jpg image
import mx.messaging.messages.IMessage;
import com.farata.rpc.remoting.OperationContext;
public class Operation extends mx.rpc.remoting.mxml.Operation
{
public function Operation
(remoteObject : RemoteObject = null,
name : String = null) {
super(remoteObject, name);
}
public var context:OperationContext = new OperationContext();
mx_internal override function invoke(msg:IMessage,
token:AsyncToken=null):AsyncToken
{
context._onBeforeInvoke(msg);
return super.invoke(msg, token);
}
}
}
3.To complete the client-side extensions, extend Flex 
RemoteObject
and make sure
that it uses the extended 
Operation
instead of its original one (Example 6-20).
Example 6-20. Customized RemoteObject.as
package com.farata.rpc.remoting.mxml
{
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.AbstractOperation;
import mx.core.mx_internal;
use namespace mx_internal;
public function RemoteObject(destination:String=null):void {
super(destination);
}
var o:Object = _operations[name];
var op:AbstractOperation = o as AbstractOperation;
if (op == null)
{
op = new Operation(this, name); // extended Operation
_operations[name] = op;
op.asyncRequest = asyncRequest;
}
return op;
}
}
}
Using AMF Message Headers s | | 309
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
This demo code just converts first page to jpeg image. String inputFilePath = @"C:\input.pdf"; String outputFilePath = @"C:\output.jpg"; // Convert PDF to jpg.
convert multi page pdf to single jpg; convert pdf into jpg format
C# Image Convert: How to Convert Tiff Image to Jpeg, Png, Bmp, &
RasterEdge.XDoc.PDF.dll. This demo code will convert first page to jpeg image. C:\input.tif"; String outputFilePath = @"C:\output.jpg"; // Convert tiff to jpg.
convert pdf image to jpg online; convert pdf to jpg
4.To intercept the additional headers and make them available to the server-side Java
programs, create a placeholder for the headers on the Java side and keep the data
located in this placeholder in the Java 
ThreadLocal
object to avoid a mix-up between
different client requests (Example 6-21).
Example 6-21. MessageContext.java
package  com.farata.remoting;
import java.util.Hashtable;
public class MessageContext {
public static void setParams(Hashtable session)
{
sessions.set(session);
}
public static Hashtable getParams()
{
return (Hashtable)sessions.get();
}
private static ThreadLocal sessions = new ThreadLocal();
}
5.As shown in Example 6-22, modify the AMF endpoint to load the
MessageContext
object upon servicing the client’s requests (don’t forget to specify
this endpoint on the AMF channel in the services-config.xml configuration file).
Example 6-22. CustomAMFEndpoint.java
package com.farata.remoting;
import java.util.Hashtable;
import flex.messaging.endpoints.*;
import flex.messaging.MessageBroker;
import flex.messaging.config.ChannelSettings;
import flex.messaging.messages.Message;
public class CustomAMFEndpoint extends AMFEndpoint {
public CustomAMFEndpoint()  {
super();
}
public CustomAMFEndpoint( boolean enableManagement)   {
super( enableManagement);
}
public Message serviceMessage(Message message)    {
Hashtable ht = new Hashtable();
ht.put("context", message.getHeaders());
MessageContext.setParams(ht);
return super.serviceMessage(message);
}
}
310 | | Chapter 6: Open Source Networking Solutions
C# Create PDF from images Library to convert Jpeg, png images to
Batch convert PDF documents from multiple image formats, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET Graphics, and REImage.
change file from pdf to jpg; change pdf to jpg on
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Resize converted image files in VB.NET. Convert PDF to Jpg, Png, Bmp, Gif, Tiff and Bitmap in ASP.NET. Embed PDF to image converter in viewer.
changing pdf to jpg file; convert pdf file to jpg on
Once the system part is done, you can set the properties on the 
OperationContext
object in your application code, just like this:
OperationContext.globalHeaders["name"] = "john".
On the Java side, you can retrieve headers sent from the client by retrieving the
corresponding parameter(s) from the 
MessageContext
object:
public String helloUser() {
Hashtable ht = MessageContext.getParams();
String userId = (String)context.get("name");
return "Hello, " + userId;
}
Data Push in Data Access
To give you an example of BlazeDS at work, we’re going to revisit the Café Townsend
application and bring it even closer to reality. It’s great that the Café owner’s wife can
populate (and update) employee data from a database, but in the real world of enter-
prise applications, more than one user often must work with the same data.
Say that users A and B have populated the employees’ data, and user B decides to update
a record in the database. Will user A be notified about this change, or will she keep
working with stale data?
You want multiple users to be able to update the table 
Employee
simultaneously and to
promote the data changes to other users instantaneously. Such data synchronization is
available with LCDS Data Management Services, and with adjustments, you can ach-
ieve similar functionality using the open source implementation of AMF as well.
To start, examine the 
Assembler
class that will be working closely with 
EmployeeDAO
. As
you can see in Example 6-23, the Java code takes all the changes submitted by any user
and broadcasts them to all clients subscribed to the destination 
com.farata.data
source.Employee.getEmployees
.
Example 6-23. Server-side push with the Assembler class
package com.farata.datasource;
import java.util.*;
import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;
public final class EmployeeAssembler{
return new EmployeeDAO().getEmployees();
}
public final List getEmployees_sync(List items)        {
List result = new EmployeeDAO().getEmployees_sync(items);
Data Push in Data Access s | | 311
C# TIFF: C#.NET Code to Convert JPEG Images to TIFF
Use C# Code to Convert Jpeg to Tiff. string[] imagePaths = { @"C:\demo1.jpg", @"C:\demo2.jpg", @"C:\demo3.jpg" }; // Construct List<REImage> object.
.net pdf to jpg; batch pdf to jpg converter online
VB.NET PDF - Convert PDF with VB.NET WPF PDF Viewer
4. To Image. Convert PDF to image formats, such as PNG, JPG, BMP and GIF. Copyright © <2000-2015> by <RasterEdge.com>. All Rights Reserved.
change pdf into jpg; .net convert pdf to jpg
MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
AsyncMessage msg = new AsyncMessage();
msg.setDestination("com.farata.datasource.Employee.getEmployees");
msg.setClientId(UUIDUtils.createUUID(true));
msg.setMessageId(UUIDUtils.createUUID(true));
msg.setTimestamp(System.currentTimeMillis());
msg.setBody(result);
msgBroker.routeMessageToService(msg, null);
return result;
}
public  List /*DepartmentDTO[]*/  getDepartments() throws Exception{
return new EmployeeDAO().getDepartments();
}
}
Next, you need to receive these messages on the client and apply the changes. As you
can see in Example 6-24, the Flex client receives the changes via subscription and ap-
plies them (the subscription name is a destination name).
Example 6-24. Receiving pushed data on the client
private var _subscription : Consumer ;
private var _subscriptionName : String ;
public function set feed( subscriptionName : String ) : void {
_subscription = new  Consumer();
_subscription.destination = subscriptionName;
_subscription.addEventListener("message", messageHandler );
_subscription.subscribe();
_subscriptionName = subscriptionName;
}
public function get feed() : String {
return _subscriptionName;
}
protected function messageHandler(ev:MessageEvent):void
{
if ( ev.message.body is ChangeObject)
processChange(ev.message.body as ChangeObject) ;
if ( ev.message.body is ArrayCollection)
for (var i:int = 0; i<ev.message.body.length; i++)
processChange(ev.message.body[i] as ChangeObject) ;
}
protected function processChange( co : ChangeObject) : void {
switch ( co.state) {
case ChangeObject.CREATE:
addItem(co.newVersion);
break;
case ChangeObject.DELETE:
312 | | Chapter 6: Open Source Networking Solutions
var uid:String = co.previousVersion.uid;
for ( var j :int = 0; j < length; j++ ) {
if(getItemAt(j).uid == uid) {
removeItemAt(j);
break;
}
}
break;
case ChangeObject.UPDATE:
uid = co.newVersion.uid;
for ( j  = 0; j < length; j++ ) {
if(getItemAt(j).uid == uid ) {
var item: EventDispatcher=getItemAt(j) as EventDispatcher;
item["properties"] = co.newVersion["properties"];
// notify the UI of the change
item.dispatchEvent(
break;
}
}
break;
}
}
Example 6-24 is a simplified code snippet of updating the client content based on the
data pushed from the server. It assumes that the function 
getItemAt()
works with the
data collection that needs to be updated. It does not deal with conflicts or application
of concurrent changes, because this part is application-specific and has to be enforced
based on the best strategy to avoid conflicts rather than forcing the user to deal with
them—either via record locking or multistage update.
The code of Example 6-24 depends upon the 
uid
value of the DTO. You
need to make sure that a unique, consistent ID is being used by every
user. The simplest way to do it is by mapping 
uid
to the database primary
key on the server side.
You can also use a data push to implement the background retrieval of the large data
sets. All you need to do is to push the retrieval results as 
ChangeObjects
with the
CREATED
flag on.
A Server As a Command Center
Strange as it sounds, a clock is another excellent example of streaming. Using a stream-
ing AMF channel to deliver the server time, you can create a clock that updates its
display every second. As a bonus, the clock application demonstrates another useful
concept: the reverse remote procedure call (RPC).
A Server As a Command Center r | 313
Reverse RPC
remote procedure call is when a client invokes a function on the server-side object.
For example, you can create an instance of the 
RemoteObject
that points at a destination
(a Java class) configured in the server-side BlazeDS. Then this Flex client calls a method
on this destination.
The example clock application instructs a server to control the client when it wants,
the way it wants. This is a reverse RPC: the server calls a client. Traditional server-side
destinations are usually preconfigured in XML files, such as remoting-config.xml; how-
ever, you don’t have this luxury on the client. Instead, during runtime you need to pass
the name of the client destination, the method to call, and an array of parameters, if
any. Here, the AMF protocol becomes quite handy once again. Remember, it offers an
easy way to serialize a Java object on the server and deserialize it as an ActionScript
object on the client.
If you understand the concept of DTO being an exchange currency between Java and
ActionScript, the rest of this section won’t be difficult. Just think outside the box and
create a DTO that will carry not some application-specific data (e.g.,the current server
time), but the metadata—the name of the destination, a method to call on the client,
and its parameters.
Example 6-25 shows the server-side Java DTO that wraps up the data and metadata.
Example 6-25. RemoteCall.java
package com.farata.remoting ;
import java.util.*;
public class RemoteCall {
public String destinationName; // destination configured on the server
public String methodName;      // method to call on the client
public List   parameters;      // method arguments
public RemoteCall(String d, String m, List p) {
destinationName = d;
methodName = m;
parameters = p;
}
}
When instances of 
RemoteCall
objects arrive at the client, they are represented as the
ActionScript instances in Example 6-26.
Example 6-26. RemoteCall.as
package  com.farata.remoting {
import mx.collections.ArrayCollection;
[RemoteClass(alias="com.farata.remoting.RemoteCall")]
public class RemoteCall {
public var destinationName:String;
314 | | Chapter 6: Open Source Networking Solutions
public var methodName:String;
public var parameters:ArrayCollection;
public function RemoteCall(destinationName:String=null,
methodName:String=null,
parameters:ArrayCollection=null) {
this.destinationName = destinationName;
this.methodName = methodName;
this.parameters = parameters;
}
}
}
BlazeDS, with the help of AMF, automatically turns any instance of RemoteCall.java
into an instance of RemoteCall.as. The big idea is to have the server push this 
Remote
Call
to the client, which should obediently call the requested method (the 
method
Name
property of the 
RemoteCall
instance) on the specified object with the provided
parameters.
Add the following destination in the message-config.xml file where BlazeDS is deployed:
<destination id="ControlCenter">
<channels>
<channel ref="my-streaming-amf"/>
</channels>
</destination>
Please note that this destination is configured to use the streaming AMF channel.
BlazeDS includes a class, 
MessageBroker
, that knows how to push messages to
destinations.
At this point, you know that the server will have to create instances of 
RemoteCall
objects
and send them to the destination called 
ControlCenter
. To do this, simply write another
Java class called 
ControlCenter.java
, as shown in Example 6-27. Note once again that
this code sends not just the data to the client, but also the information about the RPC.
Example 6-27. ControlCenter.java
package com.farata.remoting;
import java.util.*;
import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;
public class ControlCenter {
private static ControlCenterThread thread;
//start a new thread to send RemoteCall instances
public void start() {
if (thread == null) {
thread = new ControlCenterThread();
thread.start();
}
A Server As a Command Center r | 315
}
public void stop() {
if (thread != null){
thread.running = false;
thread = null;
}
}
public static class ControlCenterThread extends Thread {
public boolean running = true;
public void run() {
String clientID = UUIDUtils.createUUID();
while (running) {
// create a message object set the destination and
// assign unique client and message IDs
AsyncMessage msg = new AsyncMessage();
msg.setDestination("ControlCenter");
msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());
// Create an array of parameters to be used as
// arguments for the setTime() function call
ArrayList params = new ArrayList();
// Add current system time
params.add( new Date()); //
msg.setBody(new RemoteCall("clock", "setTime", params));
msgBroker.routeMessageToService(msg, null);
try {
// pause the loop for one second
Thread.sleep(1000);
} catch (InterruptedException e) {      }
}
}
}
}
The 
CallCenter
program creates and starts a separate thread named 
CallCenterTh
read
that every second creates a new instance of the 
RemoteCall
, puts it into the message
body of 
AsyncMessage
, and using the 
MessageBroker
publishes it to the destination called
ControlCenter
.
The Flex client shown in the following example creates a consumer object and sub-
scribes it to the destination 
ControlCenter
.
316 | | Chapter 6: Open Source Networking Solutions
Documents you may be interested
Documents you may be interested