devexpress pdf viewer asp.net mvc : Changing pdf to jpg on software SDK dll windows .net azure web forms Enterprise-Development-with-Flex26-part723

Figure 5-8. Guaranteeing the order of the incoming messages
Figure 5-7. Server log of the test illustrated in Figure 5-6
When Message Order Matters s | | 237
Changing pdf to jpg on - 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
best pdf to jpg converter for; convert pdf image to jpg online
Changing pdf to jpg on - 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 multi page pdf to jpg; change pdf into jpg
SerializingChannel
The cornerstone of our design is the 
SerializingChannel
class. In addition to the array
of received message digests described earlier, the channel has to maintain the dictionary
of incoming messages for order restoration purposes:
private var incoming:Dictionary ;
Should a message arrive out of order, the 
receive()
method will store it along with
the 
...rest
arguments:
override public function receive(
msg:IMessage, ...rest:Array
) : void {
if (msg is ReliableServerMessage) {
 .  .
// If message is out of order:
incoming[msg.clientId + '|' + seqNo] = {
msg:msg, rest:rest
};
} else
super.receive( msg, rest);
}
To figure out whether a message has arrived in order, our channel maintains a
lastServedNumber
, which is distinct per each client:
public static var lastServedNumber:Dictionary  = new Dictionary();
If the sequence number of the message is one greater than 
lastServedNumber
, it means
that the message has arrived in order and can be sent through with 
super.receive()
:
if ( seqNo == lastServedNumber[msg.clientId] + 1) {
super.receive( msg, rest);
lastServedNumber[msg.clientId]++;
}
You also can use the moment when the message arrives to perform one more task:
identify stalled messages. The method 
findAdjacentBufferedMessages()
in Exam-
ple 5-18 attempts to yank out of the incoming collection all messages delayed by the
channel. Example 5-18 has the complete code of the 
SerializingRTMPChannel
.
Example 5-18. Custom SerializingRTMPChannel streamlines the order of the messages
package com.farata.messaging.channels {
import com.farata.messaging.messages.ReliableServerMessage;
import flash.utils.Dictionary;
import mx.logging.Log;
import mx.logging.ILogger;
import mx.messaging.channels.RTMPChannel;
import mx.messaging.messages.IMessage;
public function SerializingRTMPChannel(
id:String=null, uri:String=null
238 | | Chapter 5: Customizing the Messaging Layer of LCDS or BlazeDS
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
combine various scanned images to PDF, such as tiff, jpg, png, gif PDF together and save as new PDF, without changing the previous two PDF documents at
c# convert pdf to jpg; convert pdf file to jpg on
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
PDF. Supports tiff compression selection. Supports for changing image size. Also supports convert PDF files to jpg, jpeg images. C#
convert pdf pages to jpg online; convert pdf to high quality jpg
) {
super(id, uri);
incoming = new Dictionary();
}
override public function receive(
msg:IMessage, ...rest:Array
) : void {
if (msg is ReliableServerMessage) {
if (Log.isDebug()) logger.debug(msg.body as String);
var seqNo : Number = Number(msg.headers["seqNo"]);
received.push( msg.clientId + "|"+ seqNo);
if (lastServedNumber[msg.clientId]== null) {
lastServedNumber[msg.clientId]= -1;
}
if ( seqNo == lastServedNumber[msg.clientId] + 1) {
if (Log.isDebug()) logger.debug(
"Letting out incoming message " + seqNo
);
super.receive( msg, rest);
lastServedNumber[msg.clientId]++;
seqNo = findAdjacentBufferedMessages(
msg.clientId, seqNo
);
} else if ( seqNo > lastServedNumber[msg.clientId] ) {
if (Log.isDebug()) logger.debug(
"Buffering message " + seqNo + " as out of order"
);
incoming[msg.clientId + '|' + seqNo] = {
msg:msg, rest:rest
};
}
} else
super.receive( msg, rest);
}
private function findAdjacentBufferedMessages(
clientId:String, seqNo:Number): Number {
var more:Boolean;
// We just processed, say, the 3rd message. We may have buffered
// 5,4,6,7. Internal "for" loop will find 4, then external
// "while" loop will restart the search and pick 5,6,7.
do {
more = false;
for each(var envelope:Object in incoming){
var msg:IMessage = envelope.msg;
if (msg.clientId != clientId)
continue;
if (msg.headers["seqNo"] == seqNo + 1) {
seqNo++;
lastServedNumber[clientId]++;
if (Log.isDebug()) logger.debug(
When Message Order Matters s | | 239
VB.NET Image: PDF to Image Converter, Convert Batch PDF Pages to
used commonly in daily life (like tiff, jpg, png, bitmap format in VB programming code, like changing "tif" to users are also allowed to convert PDF to other
convert pdf picture to jpg; convert .pdf to .jpg online
C# Tiff Convert: How to Convert Raster Images (Jpeg/Png/Bmp/Gif)
Give You Sample Codes for Changing and Converting Jpeg, Png RasterEdge.XDoc.PDF.dll. String inputFilePath = @"C:\input.jpg"; String outputFilePath = @"C:\output
convert pdf into jpg online; pdf to jpeg
"Yanking message " + seqNo + " out of the buffer"
);
super.receive( msg, envelope.rest);
delete incoming[seqNo];
more = true;
}
}
} while (more);
return seqNo;
}
private var logger:ILogger = Log.getLogger("" +
"com.farata.messaging.channels.SerializingRTMPChannel"
);
public static var lastServedNumber:Dictionary  = new Dictionary();
public static var received:Array=[];
private  var incoming:Dictionary ;
}
}
To test the channel, register it in services-config.xml, as in Example 5-19.
Example 5-19. Registering SerializingRTMPChannel for the test
<channel-definition id="my-serializing-client-rtmp"
class="com.farata.messaging.channels.SerializingRTMPChannel">
<endpoint uri="rtmp://{server.name}:2041"
class="flex.messaging.endpoints.RTMPEndpoint"/>
<properties>
<idle-timeout-minutes>20</idle-timeout-minutes>
</properties>
</channel-definition>
Next, add the 
serverSequenceTest
destination (Example 5-20) to messaging-config.xml.
Example 5-20. Configuring serverSequenceTest messaging destination
<destination id="serverSequenceTest">
<adapter ref="qos"/>
<channels>
<channel ref="my-serializing-client-rtmp" />
</channels>
</destination>
That concludes the configuration work; time to proceed with the test itself. On
the server side, we’ve added the 
testSequenceFailure()
method to the class
ServerMessagingTest
. This method randomizes the order of messages prior to sending
them, as you can see in Example 5-21.
240 | | Chapter 5: Customizing the Messaging Layer of LCDS or BlazeDS
XDoc.HTML5 Viewer for .NET, All Mature Features Introductions
PowerPoint: PPT, PPTX, PPS, PPSX; PDF: Portable Document Raster Image Files: BMP, GIF, JPG, PNG, JBIG2PDF in or zoom out functions, and changing file rotation
convert pdf file to jpg file; .pdf to jpg converter online
Example 5-21. Sending test messages in random order
package com.farata.test;
import java.util.ArrayList;
import com.farata.messaging.messages.ReliableServerMessage;
import flex.messaging.MessageBroker;
public class ServerMessagingTest {
 .  .
ReliableServerMessage message;
ArrayList<ReliableServerMessage> messages = new
ArrayList<ReliableServerMessage>();
for (int i= 0; i < messageCount; i++) {
message.setClientId(clientId);
message.setDestination("serverSequenceTest");
message.setHeader("seqNo", "" + (i+start));
messages.add(message);
}
for (long i = 0; i < messageCount; i++) {
int randomPick = (int )Math.min(
Math.round(Math.random() * messages.size()),
messages.size()-1
);
message = messages.remove(randomPick);
send(message);
}
}
}
When you run the test application TestServerSequence.mxml, it will display the mes-
sages in perfect order, as shown in Figure 5-9. The code of the testing application is
identical to the one presented in Example 5-17 (TestServerDelivery), with the exception
that line 95 is pointing to the different destination:
consumer.destination = "serverSequenceTest";
Example 5-22 presents the client-side log of a particular test run. It starts with the
remote call, with the following 9 messages out of 10 received out of order. At last comes
the message #0; that releases the other nine, and they all get yanked out of the buffer
in the right order.
When Message Order Matters s | | 241
Figure 5-9. Running the TestServerSequence application
Example 5-22. Client-side log of the particular run of the TestServerSequence application
(mx.messaging.messages::RemotingMessage)#0
destination = "com.farata.test.ServerMessagingTest"
operation = "testSequenceFailure"
Buffering message 6 as out of order
Buffering message 3 as out of order
Buffering message 7 as out of order
Buffering message 2 as out of order
Buffering message 9 as out of order
Buffering message 4 as out of order
Buffering message 8 as out of order
Buffering message 5 as out of order
Buffering message 1 as out of order
Letting out incoming message 0
got message (com.farata.messaging.messages::ReliableServerMessage)#0
body = "Server message #0"
destination = "serverSequenceTest"
headers = (Object)#1
seqNo = "0"
Yanking message 1 out of the buffer
got message (com.farata.messaging.messages::ReliableServerMessage)#0
body = "Server message #1"
destination = "serverSequenceTest"
headers = (Object)#1
seqNo = "1"
.....
Yanking message 9 out of the buffer
got message(com.farata.messaging.messages::ReliableServerMessage)#0
242 | | Chapter 5: Customizing the Messaging Layer of LCDS or BlazeDS
body = "Server message #9"
destination = "serverSequenceTest"
headers = (Object)#1
seqNo = "9"
producer sending message 'FBDFFF8C-8AFD-370C-4768-1379C17883DF'
(com.farata.messaging.messages::ClientHeartbeatMessage)#0
body = (Object)#1
destination = "clientHeartbeat"
received = (Array)#4
[0] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|6"
[1] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|3"
[2] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|7"
[3] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|2"
[4] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|9"
[5] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|4"
[6] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|8"
[7] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|5"
[8] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|1"
[9] "318C1775-C11A-E976-FDCD-BB7EA56DAB84|0"
As you can see, all 10 messages were reported by the client heartbeat on the next tick.
The corresponding server-side log is presented in Example 5-23. Notice that the order
of the messages stored/registered by the 
QoS adapter
is precisely the same as the order
of messages received by our channel.
Example 5-23. Server-side log of this run of TestServerSequence application
[LCDS] Channel endpoint my-amf received request.
[LCDS] Channel endpoint my-amf received request.
[14:14:22,078] QoS adapter is sending through message 6
[14:14:22,093] QoS adapter is sending through message 3
[14:14:22,093] QoS adapter is sending through message 7
[14:14:22,093] QoS adapter is sending through message 2
[14:14:22,093] QoS adapter is sending through message 9
[14:14:22,093] QoS adapter is sending through message 4
[14:14:22,093] QoS adapter is sending through message 8
[14:14:22,093] QoS adapter is sending through message 5
[14:14:22,093] QoS adapter is sending through message 1
[14:14:22,093] QoS adapter is sending through message 0
[14:14:22,328] QoS adapter received delivery confirmations:
[4:14:22,328]    ...and removes
(CLIENTID|seqNo)318C1775-C11A-E976-FDCD-BB7EA56DAB84|6
[14:14:22,328] ...and removes
(CLIENTID|seqNo)318C1775-C11A-E976-FDCD-BB7EA56DAB84|3
[14:14:22,328] ...and removes
(CLIENTID|seqNo)318C1775-C11A-E976-FDCD-BB7EA56DAB84|7
[14:14:22,328] ...and removes
(CLIENTID|seqNo)318C1775-C11A-E976-FDCD-BB7EA56DAB84|2
[14:14:22,328] ...and removes
......
(CLIENTID|seqNo)318C1775-C11A-E976-FDCD-BB7EA56DAB84|0
When Message Order Matters s | | 243
This concludes our implementation of the guaranteed delivery of messages pushed from
the server. What about client messages?
Guaranteed Delivery of Client Messages
Consider the following scenario. A Wall Street trader clicks the Buy button. A Flex
message producer sends a message to the remote server over the Internet. You can’t
afford to lose even one such message, so the rest of this chapter is devoted to imple-
menting guaranteed delivery of messages initiated on the client in the Flash Player.
Because Flex provides an 
mx.messaging.events.MessageAckEvent
for every client mes-
sage, you do not have to worry about acknowledgment. You do still need to take care
of the content of the acknowledgment. As you would expect, we are going to enumerate
the messages with the 
seqNo
header by extending the standard 
endpoint
class to return
this information inside the 
MessageAckEvent
in the form of the 
lastProcessedNo
header.
This will be a responsibility of the custom 
AcknowledgingEndpoint
Java class.
To guarantee message delivery, we will memorize messages as unconfirmed prior to
sending them out. As soon as the server acknowledgment message comes, we will re-
move the message from the unconfirmed pool. In parallel, a timer “thread” will be in
charge of resending unconfirmed messages in configured intervals. These will be the
tasks of the custom ActionScript class 
ResendingChannel
. The corresponding design is
presented in Figure 5-10.
The top portion of Figure 5-10 represents the client side, and the bottom part is about
the server.
The ReliableClientMessage Class
The ActionScript class that knows how to send reliable messages and its Java counter-
part are presented in Examples 5-24 and 5-25. Every outgoing 
ReliableClientMessage
will have a unique sequential header, 
seqNo
.
Example 5-24. ReliableClientMessage.as
package com.farata.messaging.messages{
import mx.messaging.messages.AsyncMessage;
public class ReliableClientMessage extends AsyncMessage   {
static public var sequenceNo : int = 0;
public function ReliableClientMessage(
body:Object=null, headers:Object=null
) {
if (!headers) {
headers = [];
244 | | Chapter 5: Customizing the Messaging Layer of LCDS or BlazeDS
}
headers["seqNo"] = sequenceNo++;
super(body, headers);
}
}
}
Example 5-25. ReliableClientMessage.java
package com.farata.messaging.messages;
import flex.messaging.messages.AsyncMessage;
public class ReliableClientMessage extends AsyncMessage {
}
The only reason for creating a subclass of AsyncMessage.java is to have
a way to separate regular 
AsyncMessage
objects that don’t require special
processing from the reliable ones.
Figure 5-10. Design of the No Client Message Left Behind policy
The ReliableClientMessage Class s | | 245
Acknowledging the Endpoint
Now let’s switch to the server side and create a custom endpoint. We need it to beef
up the acknowledgment message sent from the server. When the client gets a message,
it needs to know the 
seqNo
of its last message that was successfully delivered to the
server. For now, it will be used only in the testing application. Later, when the order
of client messages will be guaranteed, we will use it to determine which ones to put
aside and which ones to forward for server processing. As shown in Example 5-26, the
proper overloading of the 
serviceMessage()
method does the job.
Example 5-26. AcknowledgingRTMPEndpoint.java
package com.farata.messaging.endpoints;
import org.apache.log4j.Logger;
import com.farata.messaging.messages.ReliableClientMessage;
import flex.messaging.endpoints.RTMPEndpoint;
import flex.messaging.messages.AcknowledgeMessage;
import flex.messaging.messages.Message;
public class AcknowledgingRTMPEndpoint extends RTMPEndpoint {
private final String LAST_SERVED_NUMBER="lastServedNumber";
private final String SEQUENCE_NUMBER="seqNo";
public Message serviceMessage(Message message) {
Message m = super.serviceMessage(message);
if (message instanceof ReliableClientMessage) {
int lastServedNumber = sequenceNumber;
String duplicate = (String)message.getHeader("duplicate");
if (logger.isDebugEnabled()) logger.debug(
"Received message "+ sequenceNumber +
((duplicate!=null)?" (duplicate)":"")
);
acknowledgeMessage.setClientId(message.getClientId());
acknowledgeMessage.setCorrelationId(message.getMessageId());
acknowledgeMessage.setHeader(
LAST_SERVED_NUMBER, (Integer)lastServedNumber
);
m = acknowledgeMessage;
}
return m;
}
static Logger logger;
static {
logger = Logger.getLogger(QoSRTMPEndpoint.class);
}
}
246 | | Chapter 5: Customizing the Messaging Layer of LCDS or BlazeDS
Documents you may be interested
Documents you may be interested