Damon Cooper's BLOG
Viewing By Month : January 2020 / Main
January 18, 2020
Hardcopy Adobe ColdFusion 8 Doc Library Available

Several people have asked about the availability of Adobe ColdFusion 8 hardcopy documentation, and many people may not be aware that 1) the ColdFusion 8 doc set is absolutely top-notch excellent, and 2) the FULL library of all hardcopy ColdFusion 8 books is available for sale at Adobe cost ($50 US) at the Adobe online store here.

The full set again is just $50, which is unbelieveable, and you get absolutely everything you'll need to build ColdFusion 8 applications of all shapes and sizes, regardless of your experience history with ColdFusion. The docs have really undergone a quite revolution over the last 3.5 releases, starting with CFMX 6.0, then a full rework with CFMX 6.1, and another full rewrite with the CFMX 7 doc set, and now a major re-vamp and upgrade with the ColdFusion 8.0 release.

The full library is a 6 volume, 3,000+ page reference set, and is a must-have guide to installing, managing, and building Internet applications with ColdFusion 8 for every developer and administrator.

Randy Neilson, Hal Lichton, Anne Sandstrom, Linda Adler and the other ColdFusion doc team members did a truly AMAZING job with them this time, and you owe it to yourself to have the hardcopies available on your bookshelf while you're developing (if you're anything like me, you just can't replace good hardcopy books).

The full set includes:

- Installing and Using ColdFusion 8
- ColdFusion 8 CFML Quick Reference
- Getting Started Building ColdFusion 8 Applications
- Configuring and Administering ColdFusion 8
- ColdFusion 8 CFML Reference (Multi-Volume)

And the best books for learning and practicing (with working examples!) new features, IMO:

- ColdFusion 8 Developer’s Guide (Multi-Volume)

Enjoy, and please spread the word! These docs are excellent, and really should be (this time) everything you need for ColdFusion development using ColdFusion 8. I really wish we could have shipped these in every box, but it wasn't possible for a number of reasons (weight was a primary factor!!).

Damon


BlazeDS and LCDS: Channels, Channels Everywhere

BlazeDS, and the upcoming update to Adobe LiveCycle Data Services, add several additional channel/endpoint options to the mix of available channels currently available for communication between Flex RIA's and backend server technologies. With all the available channels and endpoints, (and more coming!) the question of how to decide which one (or which set) to use for a particular application becomes relavent.

Seth Hodgson, Engineer Extraordinaire on the LiveCycle Data Services team compiled the following helpful discussion and general guidelines that will probably make it into product documentation, etc for the next release, but I thought I'd share it now to help anyone who could use this now to navigate the available connectivity options.

So...thanks Seth!

Ok, on to the post....

Now, if you’re just doing remote procedure calls (RemoteObject or proxied HTTPService or WebService) or Data Management without auto-sync, than use the AMFChannel. Simple, performant call/response semantics over HTTP.

The HTTPChannel (probably should have been named the AMFXChannel) is exactly the same as the AMFChannel behaviorally, but serializes data in an XML format called AMFX. This channel only exists for customers who require all data sent over the wire to be non-binary for auditing purposes. There’s no other reason to use this channel over the AMFChannel for RPC-based apps.

So if your app is only making RPC calls to the server, the answer is simple. You can stop reading here and get back to developing your app using one of the two options above (most likely the AMFChannel).

Real time data push to web clients doesn't have as simple an answer as the RPC scenario unfortunately. There are a variety of trade-offs and pros and cons that need to be taken into consideration. Although the answer isn't as simple, it's still fairly prescriptive based on the needs of your app and the tables below should help you select the right channel(s) and get back to work. One thing to remember. If your application uses real time data push, but also does some RPC as well, you do not need to use separate channels. All of the channels below can send RPC invocations to the server just fine. Use a single ChannelSet (possibly containing just a single channel) for all of your RPC, messaging and data management components.

We'll start with recommendations in my order of preference for BlazeDS and follow that with recommendations for LCDS.

BlazeDS
1. AMFChannel/Endpoint configured for Long Polling (no fallback needed)

The channel issues polls to the server in the same fashion as our traditional polling, but if no data is available to return immediately the server “parks” the poll request until data arrives for the client or the configured server wait interval elapses.

The client can be configured to issue its next poll immediately following a poll response making this channel configuration feel very “real-time”.
A reasonable server wait time would be 1 minute. This eliminates the majority of busy polling from clients without being so long that you’re keeping server sessions alive indefinitely or running the risk of a network component between the client and server timing out the connection.

Pros Cons

Valid HTTP request/response pattern over standard ports that nothing in the network path will have trouble with.

When many messages are being “pushed” to the client this configuration has the overhead of a poll roundtrip for every pushed message (or small batch of messages that queue between polls). Most applications are not pushing data so frequently for this to be a problem.

The Servlet API uses blocking IO so you must define a upper bound for the number of long poll requests parked on the server at any single instant. If your number of clients exceeds this limit, the excess clients will devolve to simple polling on the default 3 second interval with no server wait. Say your app server request handler thread pool has a size of 500. You could set the upper bound for waited polls to 250 or 300 or 400 depending on the relative amount of non-poll requests you expect to service concurrently.


2. StreamingAMFChannel/Endpoint (in a ChannelSet followed by the polling AMFChannel below for fallback)

Because HTTP connections are not duplex, this channel sends a request to “open” a HTTP connection between the server and client, over which the server will write an infinite response of pushed messages. This channel uses a separate transient connection from the browser’s connection pool for each send it issues to the server. The streaming connection is used purely for messages pushed from the server down to the client. Each message is pushed as an HTTP response chunk (HTTP 1.1 Transfer-Encoding: chunked) .

Pros Cons

No polling overhead associated with pushing messages to the client.

Uses standard HTTP ports so firewalls don’t interfere and all requests/responses are HTTP so packet inspecting proxies won’t drop the packets.

Holding on to the “open” request on the server and writing an infinite response is not “nice” HTTP behavior. HTTP proxies that buffer responses before forwarding them can effectively swallow the stream. Assign the channel’s ‘connect-timeout-seconds’ property a value of 2 or 3 to detect this and trigger fallback to the next channel in your ChannelSet.

No support for HTTP 1.0 clients (not that this matters; does anyone still use a 1.0 client?). If the client is 1.0, the open request is faulted and the client falls back to the next channel in its ChannelSet.

The Servlet API uses blocking IO so like long polling above, you need to set a configured upper bound on the number of streaming connections you’ll allow. Clients that exceed this limit will not be able to open a streaming connection and will fallback to the next channel in their ChannelSet.


3. AMFChannel/Endpoint with simple polling enabled (no Long Polling) and piggybacking enabled (no fallback needed)

Same as our traditional, simple polling support but with piggybacking enabled when the client sends a message to the server between its regularly scheduled poll requests the channel piggybacks a poll request along with the message being sent, and the server piggybacks any pending messages for the client along with the response.

Pros Cons

Valid HTTP request/response pattern over standard ports that nothing in the network path will have trouble with.

User experience is more “real-time” than with just simple polling on an interval.

Doesn’t have thread resource constraints like long polling and streaming due to the Servlet API’s blocking IO.

Less “real-time” than long polling or streaming; requires client interaction with the server to receive pushed data faster than the channel's configured polling interval.



LiveCycle Data Services
1. RTMPChannel/Endpoint (in a ChannelSet with fallback to NIO AMFChannel configured to Long Poll)

The RTMPChannel creates a single duplex socket connection to the server and gives the server the best notification of the player being shut down. If the direct connect attempt fails the Player will attempt a CONNECT tunnel through an HTTP proxy if one is defined by the browser (resulting in a direct, tunneled duplex socket connection to the server). Worst case, it falls back to adaptive HTTP requests that "tunnel" RTMP data back and forth between client and server, or it fails to connect entirely.

Pros Cons

Single, stateful duplex socket that gives clean, immediate notification when a client is closed. The HTTP-based channels/endpoints generally don't receive notification of a client going away until the HTTP session on the server times out; that's not great for a call-center application where you need to know whether reps are online or not.

The player internal fallback to HTTP CONNECT trick to traverse an HTTP proxy if one is configured in the browser gives the same pro as above, and is a technique that just isn't possible from ActionScript or Javascript.

RTMP generally uses a non-standard port so it is often blocked by client firewalls. Network components that do stateful packet inspection may also drop RTMP packets, killing the connection. Fallback to HTTP CONNECT through a proxy or adaptive HTTP tunnel requests is difficult in our deployment scenario within a Java servlet container which generally already has the standard HTTP ports bound; requiring non-trivial networking configuration to route these requests to the RTMPEndpoint.


2. NIO AMFChannel/Endpoint configured for Long Polling (no fallback needed)

Behaviorally the same as the servlet-based AMFChannel/Endpoint but uses an NIO server and minimal HTTP stack to support scaling up to thousands of connections.

Pros Cons

The same pros as mentioned above, along with much better scalability and no configured upper bound on the number of parked poll requests.

Because the servlet pipeline is not being used, this endpoint requires more network configuration to route requests to it on a standard HTTP port if you need to concurrently service HTTP servlet requests. However, it can share the same port as any other LCDS NIO AMF/HTTP endpoint for the app.


3. NIO StreamingAMFChannel/Endpoint (in a ChannelSet followed by the polling AMFChannel below for fallback)

Behaviorally the same as the servlet-based StreamingAMFChannel/Endpoint but uses an NIO server and minimal HTTP stack to support scaling up to thousands of connections.

Pros Cons

The same pros as mentioned above, along with much better scalability and no configured upper bound on the number of streaming connections.

Because the servlet pipeline is not being used, this endpoint requires more network configuration to route requests to it on a standard HTTP port if you need to concurrently service HTTP servlet requests. However, it can share the same port as any other LCDS NIO AMF/HTTP endpoint for the app.


4. NIO AMFChannel/Endpoint with simple polling enabled (no Long Polling) and piggybacking enabled (no fallback needed)

Same as the description above.

Pros Cons

Same as the pros above, and it shares the same FlexSession as other LCDS NIO AMF/HTTP endpoints

Same cons as above and because the servlet pipeline is not being used, this endpoint requires more network configuration to route requests to it on a standard HTTP port if you need to concurrently service HTTP servlet requests. However, it can share the same port as any other LCDS NIO AMF/HTTP endpoint for the app.


The NIO AMF/HTTP endpoints use the same client-side Channel classes as their servlet-based endpoint counterparts. They just scale better than the servlet based endpoints. If the web app is not servicing general servlet requests, you can configure the servlet container to bind non-standard HTTP/S ports leaving 80 and 443 free to be used by your LC DS NIO endpoints. Because LC DS is a super-set of BlazeDS, you still have access to the servlet-based endpoints if you want to use them instead.

Reasons to use the servlet-based endpoints would could be because you need to include 3rd party servlet filter processing of requests/responses or need to access data structures in the application server's HttpSession (the NIO HTTP endpoints are not part of the servlet pipeline, so while they provide a FlexSession in the same manner that RTMP connections do, these session instances are disjoint from the J2EE HttpSession.

Hope that helps!

January 14, 2020
Adobe ColdFusion...What Next?

We'd like your feedback!

First, though, I'll note that Adobe ColdFusion 8 continues it's UNBELIEVABLE adoption curve without sign of letting up, and we now have the all-OS 64-bit platform support firmly in Beta now for 8.0.1, code-named "Gemini".

coldfusion8appicon.jpg
So it's time once again to turn our sights to the horizon and get your input on what the ColdFusion team should focus on next, and we'd love your input:

Adobe ColdFusion Features Survey
http://www.surveymonkey.com/s.aspx?sm=yLcENFTqjkIn6gqoFpRiUQ_3d_3d

Adobe ColdFusion Platform and Vendor Support Survey:
http://www.surveymonkey.com/s.aspx?sm=_2fJgulePMz_2f1GM6FGV6uMUQ_3d_3d

Thanks in advance!

Damon


LiveCycle Data Services Perspective

A good blog entry on the Coding Cowboys Blog about Adobe LiveCycle Data Services titled, "Flex (Now LiveCycle) Data Services: A Beginner's Perspective". Check it out here:

http://weblog.cahlan.com/2020/01/flex-now-livecycle-data-services.html

Damon

January 7, 2020
Adobe ColdFusion IDE Survey

The Adobe ColdFusion team would like to understand more about how you develop CFML code, what tools you currently use, what features you look for, use and would like in a IDE.

The survey is very short and to-the-point and can be found here:

http://www.surveymonkey.com/s.aspx?sm=321RrO9_2fWaP_2bdYMnmF9CuQ_3d_3d

Please do take a minute or two to fill it out if your shop uses ColdFusion at all.

Thanks in advance!

Damon

January 5, 2020
2020 Election: Undecided? Select-A-Candidate

Not one to venture far into politics (I'm Canadian, proud of it, and can do everything in this country but vote, which is normally ok by me), you do have to be hiding under a pretty big rock not to be inundated with the 2020 US Presidential Election coverage in the media and online. And I'm sure it'll only get worse as the year progresses :)

So I thought...if I could vote, who would be my candidate? After all, I have firmly held beliefs that both mainstream parties claim as near and dear to them. I suppose that puts me firmly in the "undecided" or "independent" camps, I don't know.

So I was trolling around with my morning coffee this morning trying to figure out which candidate from which party most closely maps to the issues I think are important, and came across this handy "candidate selector" tool where you plug in in what you're for and against, and it pops back your closest match for a 2020 Presidential Candidate.

Now, I make no claim as to this tool's accuracy, etc, but thought it was a good idea. Anyway, check it out (caveat emptor, etc):

http://www.dehp.net/candidate/

EDIT: Two more I found interesting and you might find useful:

1) http://minnesota.publicradio.org/projects/ongoing/select_a_candidate/poll.php?race_id=13
2) http://www.selectsmart.com/president/2020.html

Damon

January 4, 2020
The Economist on ColdFusion 8

We received an email from Stewart Robinson at Economist.com and The Economist is now running on Adobe ColdFusion 8.

He writes,

"I thought I'd let you know that Economist.com has finished it's port to ColdFusion 8 across the whole live cluster and we have seen a reduction in page generation time of around 20% which is amazing and totally unexpected...the whole thing is ridiculously stable. I am amazed. Feel free to use this mail in any form you like."

Check it out here at http://www.economist.com

If you haven't upgraded to Adobe ColdFusion 8 yet, you're missing out on the instant boost of performance, scalability and stability ColdFusion 8 offers over all previous versions.

Just the process of upgrading will give your site and Web Applications a serious shot of adrenalin, not to mention making you look like a hero to your customers!

Damon

January 3, 2020
Gosling on Flash

I have a lot of respect for Sun's James Gosling, fellow Canadian that he is, and inventor of Java, but his comments here about Adobe Flash seem off center to me: http://reddevnews.com/qandas/article.aspx?editorialsid=121

In particular, "If you look at something like Flash, when you get to the much more advanced stuff -- richer interfaces, more complex network protocols, more complex APIs -- it really falls short."

John Dowdell, fellow Adobian, captures my sentiments exactly in his blog here: http://weblogs.macromedia.com/jd/archives/2020/01/gosling_on_flas.cfm

Damon

January 2, 2020
They'll Never Catch Me....

NY Times Article: F.B.I. Brings a Fresh Set of Eyes to a Plane Hijacking Mystery.

Damon (aka "D. No-B. Cooper")