> From: Alex Rufon <[EMAIL PROTECTED]>

> 
> **J Usage
> For this project, we used J to primarily calculate the following:
> 1. Raw Material Consumption – computes how many items of each material is 
> needed 
> to make one garment of a certain style, size and color. 
> 2. Raw Material Requirement – based on the raw material consumption, J 
> computes 
> for the actual number of number of materials that are needed to be ordered 
> from 
> the supplier based on the number of actual garments ordered by the customer.
> J was a life saver because of its inherent capability to do matrix 
> calculations. 
> Original computations made in AS400 and VB was taking some time to complete 
> because each material needed has to be looped through one by one. The number 
> of 
> materials not only includes the fabric but everything from thread, buttons, 
> tags 
> to adhesive tapes, plastic bags and packing cartons. The challenge here is 
> how 
> to make the computation run faster because of the iterative process of coming 
> up 
> with the raw material consumption which leads to changes in the raw material 
> requirement. The operator would run the calculation a number of times a day 
> because of availability materials or changes in the consumption and 
> allowances 
> or replacement of the materials itself.  With the competitiveness in the 
> world 
> market, a factory has to send out their orders to suppliers within 24 hours 
> from 
> receiving the confirmed orders from the customers. Missing the 24 hours limit 
> normally means that the material is already out stock from suppliers and 
> delays 
> ensues.
> 
> ** Some Design Constraints
> The initial design of this system had J running on the server as a Windows 
> Service. This lead to J using up 100% of only 1 CPU of the 4 CPU application 
> server. With concurrent users increasing, the Windows Service started queuing 
> up 
> requests that the web server started timing-out the requests … even though 
> they 
> were still running and would complete successfully.  Since the web server 
> already gave-up, the client was notified that an error occurred and the users 
> reaction was to submit the same operation again and further slowing things 
> down. 
> It was a vicious circle.
> 
> What I did was abandoned the server side concept entirely and moved the 
> processing on the client side. It is now running in this configuration, where 
> the client system downloads all the data that it needs and computes it and J 
> creates SQL statements that would insert, delete and/or update the database 
> records.
> 
> When I first decided to change my execution design strategy, I had an idea 
> that 
> they may be some performance problems but I was thinking that I’ll just burn 
> the 
> bridge when I get there. So after more than half a year after implementation 
> I 
> encountered my first performance problem. You see, client machines on the 
> factory were not really that powerful. A typical setup would be with the 
> following specs:
> Windows XP Professional
> 1.0GHz CPU
> 20GB HD
> 384 MB RAM
> 
> Normal J usage peaks at 70MB RAM but last month, there were some RMR 
> calculation 
> that the user says doesn’t finish. So I investigated and found out that 
> because 
> of the number of materials involved in the order, J usage was peaking at 
> 130MB 
> RAM. I then timed it and it took more than an hour to finish with J using up 
> the 
> CPU. So now, some users would kill the J process from the Task Manager and 
> would 
> complain that the system is “Hanged”. :D
> 
> For now, I’m trying to put in a progress dialog box into the mix (Oleg’s 
> Progress Dialog to be precise) as an immediate solution but I am looking into 
> an 
> “easy” solution of running the code on the server. What I’m looking for are J 
> libraries that would make it relatively easy to implement execution of J 
> scripts 
> on the server side (web server or application server behind the web server). 
> Right now I’m looking at JHP but I’m still doing the leg work since I really 
> need to complete the QA documentation requirements.

As I can see the focus was on synchronous processing either at the server or
at the client. However, what we see here is an example of a long-running 
processes--
anything that exceeds finite amount of user attention for an atomic operation.
Here's a design pattern for asynchronous scalable distributed process 
management.

Asynchronous means that process is broken into life-cycle operations steps
and corresponding operations: initiate, suspend, resume, abort, get status etc; 
statuses: waiting, running, suspended, success, error. The GUI needs to be 
decoupled
from process execution and only interact indirectly with quick atomic status
query and change operations.

User session (client application) needs to be decoupled from server, which would
allow to login/logout any time, continue to observe server operations 
running independently.

Server process management is done with a queue that maintains these statuses
and mediates communication between the client request handler, worker processes
manager, and worker processes. Queue item also contains parameters.

Scalability is made easy with such queue model as the managers and handlers 
can be deployed across many commodity machines while processing the same queue.

Scheduling allows to uses this process management framework for off-line
batch execution. Configurable load-balancing and throttling ensures even 
spread of tasks over available hardware.

To implement (parts of) this, an existing framework could be used, such as 
WWF in .NET, BPEL in Java, to some extent Quatz scheduler in Java. 
But you want to make sure all aspects above are satisfied. 
So it may be better and simpler to implement your own solution using a 
database and combination of standard framework components: ASP.NET, 
command-line executables, COM+ or J2EE apps etc.



----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to