Best way to determine insertion order of items in cache for FIFO?

I want to implement a FIFO queue. I plan on one producer placing unprocessed Orders into a cache. Then multiple consumers will each invoke an EntryProcessor which gets the oldest unprocessed order, sets it processed=true and returns it. What's the best way to determine the oldest object based on insertion order? Should I timestamp the objects with a trigger when they're added to the cache and then index by that value? Or is there a better way? maybe something coherence automatically saves when objects are inserted? Also, it's not critical that the processing order be precisely FIFO, close is good enough.
Also, since the consumer won't know the key value for the object it will receive, how could the consumer call something like this so it doesn't violate Constraints on Re-entrant Calls? http://wiki.tangosol.com/display/COH34UG/Constraints+on+Re-entrant+Calls
Thanks,
Andrew

Ok, I think I can see where you are coming from now...
By using a queue for each for each FIX session then you will be experiencing some latency as data is pushed around inside the cluster between the 'owning node' for the order and the location of the queue; but if this is acceptable then great. The number of hops within the cluster and hence the latency will depend on where and how you detect changes to your orders. The advantage of assiging specific orders to each queue is that this will not change should the cluster rebalance; however you should consider what happens if the node controlling a specific FIX session is lost - do you recover from FIX log? If so where is that log kept? Remember to consider what happens if your cluster splits, such that the node with the FIX session is still alive, but is separated from the rest of the cluster. In examining these failure cases you may decide that it is easier to use Coherence's in-built partitioning to assign orders to sessions father than an attribute of order object.
snidely_whiplash wrote:
Only changes to orders which result in a new order or replace needing to be sent cause an action by the FIX session. There are several different mechanisms you could use to detect changes to your orders and hence decide if they need to be enqueued:
1. Use a post trigger that is fired on order insert/update and performs the filtering of changes and if necessary adds the item to the FIX queue
2. Use a cache store that does the same as (1)
3. Use an entry processor to perform updates to the order object (as I believe you previously mentioned) and performs logic in (1)
4. Use a CQC on the order cache
5. A map listener on the order cache
The big difference between 1-3 and 4, 5 is that the CQC is i) a SPOF ii) not likely located in the same place as your order object or the queue (assuming that queue is in fact an object in another cache), iii) asynchronously fired hence introducing latency. Also note that the CQC will store your order objects locally whereas a map listener will not.
(1) and (3) will give you access to both old and new values should that be necessary for your filtering logic.
Note you must be careful not to make any re-entrant calls with any of 1-3. That means if you are adding something to a FIX queue object in another cache (say using an entry processor) then it should be on a different cache service.
snidely_whiplash wrote:
If I move to a CacheStore based setup instead of the CQC based one then any change to an order, including changes made when executions or rejects return on the FIX session will result in the store() method being called which means it will be called unnecessarily a lot. It would be nice if I could specify the CacheStore only store() certain types of changes, ie. those that would result in sending a FIX message. Anything like that possible?There is negligible overhead in Coherence calling your store() method; assuming that your code can decide if anything FIX-related needs to be done based only on the new value of the order object then this should be very fast indeed.
snidely_whiplash wrote:
What's a partitioned "token cache"?This is a technique I have used in the past for running services. You create a new partitioned cache into which you place 'tokens' representing a user-defined service that needs to be run. The insertion/deletion of a token in the backing map fires a backing map listener to start/stop a service +(not there are 2 causes of insert/delete in a backing map - i) a user ii) cluster repartitioning)+. In this case that service might be a fix session. If you need to designate a specific member on which a service needs to run then you could add the member id to the token object; however you must be careful that unless you write your own partitioning strategy the token will likely not live on the same cache member as the token indicates; in which case you would want a ful map listener or CQC to listen for tokens rather than a backing map listener
I hope that's useful rather than confusing!
Paul

Similar Messages

  • What is the best way to query planned orders or work orders for make items and identify the buy component that is short for supply and vice versa?

    What is the best way to query planned orders or work orders for make items and identify the buy component that is short for supply and vice versa?

    What is the best way to query planned orders or work orders for make items and identify the buy component that is short for supply and vice versa?

  • What's the best way to save an 8.5 x 11 image for use as a page background in a PDF?

    What's the best way to save an 8.5 x 11 image for use as a page background in a PDF? My goal is to have a relatively small final .pdf file size that includes numerous pages with full 8.5 x 11 images as backgrounds in the document. If I save at 8.5 x 11 and 72dpi (example), the image is not 8.5 x 11, and the quality is not good enough. I need help with size, dpi, and file format to save as before I place it in InDesign and then save as a .pdf.
    Thanks,
    Jim

    Do exactly what I said then.  Create the InDesign document of the required dimension, and chose whether it will be high quality print, or Interactive PDF.  It really doesn't mater what format you bring the image into that document.  It can be JPG, PNG, but I usually use native Photoshop PSD.  The image does have to be of high enough resolution, but it can be many times bigger than iis required for the final export.  (InDesign does not import the image, but rather references it on your hard drive.)
    When you have placed your text and finished your page, then export it to PDF, but go through the tabs chosing suitable settings.  If the image needs to be downsized, InDesign will do that at this stage while building the PDF.
    If you can tell us how this presentation will be made (Projector, overhead projector, printed page etc. or just emailed to the end users) we can help you more with the final output settings. 

  • Best way to determine if JMS server is alive in a cluster

    Can anyone give me an idea on the best way to find out if a JMS server
              in a cluster
              has failed so I can signal migration to another server in the cluster.
              Thanks Larry
              PS weblogic 7.0 sp1
              

    Hallo Larry,
              you can go via JMX and retrieve the according RuntimeMBeans in order to
              check the health state of the
              JMSServer resp. the server hosting the JMSServer. If they are not available
              or failed you can trigger the
              migration. At least that's the way I'm doing it...
              try
              JMSServerMBean jmsServer = null;
              ServerMBean candidateServer = null;
              MigratableTargetMBean migratableTarget = null;
              * Retrieve all JMSServer defined for the current domain
              Set jmsServerSet = home.getMBeansByType("JMSServer", domainName);
              Object[] jmsServers = jmsServerSet.toArray();
              * Just the first one is picked assuming there is only one defined
              * within the active FHO domain
              if(jmsServers != null && jmsServers.length > 0)
              jmsServer = (JMSServerMBean) jmsServers[0];
              if(s_logger.isDebugEnabled())
              s_logger.debug("JMSServer: " + jmsServer.getName());
              * A JMSServer can only be associated with a single target,
              * thus pick again the first from the list.
              TargetMBean[] targets = jmsServer.getTargets();
              if(targets != null && targets.length > 0)
              boolean hostingServerRunning = false;
              boolean candidateServerRunning = false;
              * Check whether the JMSServer is really associated with
              * a migratable target. Otherwise the migration must be canceled
              * since it cannot be performed!
              if(targets[0] instanceof MigratableTargetMBean)
              migratableTarget = (MigratableTargetMBean) targets[0];
              * Retrieve all available candidates and select a running instance
              * if any. First check for constrained candidate servers, than for
              * all candidate servers
              ServerMBean[] candidates =
              migratableTarget.getConstrainedCandidateServers();
              if(candidates == null || candidates.length == 0)
              candidates = migratableTarget.getAllCandidateServers();
              if(candidates != null && candidates.length > 0)
              ServerMBean hostingServer = migratableTarget.getHostingServer();
              boolean gotHostingServer = false;
              boolean gotCandidateServer = false;
              boolean runningInstance = false;
              * Loop over all candidates as long as hosting server and candidate
              * server are visited and there running state has been determined
              for(int i=0; i< candidates.length; i++)
              ServerRuntimeMBean serverRuntime = null;
              * Retrieve the current state from the according runtime MBean
              * if available
              try
              serverRuntime = (ServerRuntimeMBean) home.getMBean(new
              WebLogicObjectName(candidates.getName(), "ServerRuntime", domainName,
              candidates[i].getName()));
              runningInstance =
              serverRuntime.getState().equalsIgnoreCase(ServerRuntimeMBean.RUNNING);
              catch(InstanceNotFoundException inf)
              * When a server instance is not available, an InstanceNotFoundException will
              be raised
              * by WLS, which can be ignored
              if(hostingServer != null && hostingServer.equals(candidates[i]))
              hostingServerRunning = runningInstance;
              gotHostingServer = true;
              else
              * A running candidate server will be prefered, thus only if no running
              * instance can be detected, another instance is selected
              if(!gotCandidateServer)
              candidateServerRunning = runningInstance;
              candidateServer = candidates[i];
              gotCandidateServer = runningInstance;
              if(gotCandidateServer && gotHostingServer)
              break;
              if(s_logger.isDebugEnabled())
              s_logger.debug("Migratable Target: " + migratableTarget.getName());
              s_logger.debug("Candidate Server: " + candidateServer.getName());
              else
              throw new Exception("JMSServer not deployed on a migratable target!");
              * Retrieve the migration service coordinator for the active domain assuming
              * there exists only one and invoke the migration later on
              MigratableServiceCoordinatorRuntimeMBean coordinator = null;
              Set coordinatorSet =
              home.getMBeansByType("MigratableServiceCoordinatorRuntime", domainName);
              Object[] coordinators = coordinatorSet.toArray();
              if(coordinators.length > 0)
              coordinator = (MigratableServiceCoordinatorRuntimeMBean) coordinators[0];
              if(enforceMigrationOnInstancesDown)
              coordinator.migrate(migratableTarget, candidateServer, hostingServerRunning,
              candidateServerRunning);
              else
              coordinator.migrate(migratableTarget, candidateServer);
              s_logger.info("Migration of JMSServer from node "
              + migratableTarget.getName()
              + " to node "
              + candidateServer.getName()
              + " has been started");
              else
              throw new Exception("MigrationServiceCoordinator cannot be retrieved");
              catch(Exception e)
              s_logger.error("Could not migrate JMSServer", e);
              Regards,
              CK
              "Larry Presswood" <[email protected]> schrieb im Newsbeitrag
              news:[email protected]...
              > Can anyone give me an idea on the best way to find out if a JMS server
              > in a cluster
              > has failed so I can signal migration to another server in the cluster.
              >
              > Thanks Larry
              >
              > PS weblogic 7.0 sp1
              >

  • Best way to determine if document is truly unsaved

    Is there a preferred method for determining whether a file is truly unsaved? I'm distinguishing between files that have have been saved and then had some changes made to them (but have a valid name and filePath) and files that have just been created during this session and have not been saved anywhere (other than a temp directory). The only thing I can think of is checking whether an error is thrown by the filePath property; is this really the best way?
    (I have looked into both the saved and modified properties, but neither provide this information I am looking for. In theory I could check the name property to see if it starts with "Untitled" but there's nothing stopping a user from actually calling a file that so I'd rather not.)
    Quick background: I have a script that lets a user browse to some files and get information about them. Files should be closed after processing, unless of course they were open to begin with. So, I do a check of each file against the documents open when the script starts running and set a flag. Just want to make sure that there isn't a better solution than catching the error.
    Brief code:
        var openDocs = app.documents.everyItem().getElements();
        for (var i = 0; i < funcDocs.length; i++)
            var funcDoc = funcDocs[i];
            var fileInUse = false;
            if (funcDoc instanceof File)
                if (openDocs.length == 0) {fileInUse = false;}
                else
                    for (var f = 0; f < openDocs.length; f++)
                        try{
                             openDocs[f].filePath;
                        }catch(e){continue;}
                        if (openDocs[f].name == funcDoc.name && openDocs[f].filePath == funcDoc.path)
                            fileInUse = true;
                            break;
                var openDoc = app.open(funcDoc, false, 1147563124);
            else
                var openDoc = funcDoc;
                fileInUse = true;
           //Do something...
            if (fileInUse == false) {openDoc.close();}
    I guess I'm looking for a bit of a sanity check that I'm not missing some more straightforward method here. Thanks in advance!

    Help>About
    Hold down CTRL or CMD and it gives a complete document history.

  • Best way to determine optimal font size given some text in a rectangle

    Hi Folks,
    I have a preview panel in which I am showing some text for the current selected date using a date format.
    I want to increase the size of the applied font so that it scales nicely when the panel in which it is drawn is resized.
    I want to know the best way in terms of performance to achieve the target. I did some reading about AffineTransform and determining by checking ina loop which is the correct size, but it does not feel like a good way.
    I would appreciate some tips.
    Cheers.
    Ravi

    import java.awt.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    import javax.swing.*;
    public class ScaledText extends JPanel {
        String text = "Sample String";
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
            Font font = g2.getFont().deriveFont(16f);
            g2.setFont(font);
            FontRenderContext frc = g2.getFontRenderContext();
            int w = getWidth();
            int h = getHeight();
            float[][] data = {
                { h/8f, w/3f, h/12f }, { h/3f, w/4f, h/8f }, { h*3/4f, w/2f, h/16f }
            for(int j = 0; j < data.length; j++) {
                float y = data[j][0];
                float width = data[j][1];
                float height = data[j][2];
                float x = (w - width)/2f;
                Rectangle2D.Float r = new Rectangle2D.Float(x, y, width, height);
                g2.setPaint(Color.red);
                g2.draw(r);
                float sw = (float)font.getStringBounds(text, frc).getWidth();
                LineMetrics lm = font.getLineMetrics(text, frc);
                float sh = lm.getAscent() + lm.getDescent();
                float xScale = r.width/sw;
                float yScale = r.height/sh;
                float scale = Math.min(xScale, yScale);
                float sx = r.x + (r.width - scale*sw)/2;
                float sy = r.y + (r.height + scale*sh)/2 - scale*lm.getDescent();
                AffineTransform at = AffineTransform.getTranslateInstance(sx, sy);
                at.scale(scale, scale);
                g2.setFont(font.deriveFont(at));
                g2.setPaint(Color.blue);
                g2.drawString(text, 0, 0);
        public static void main(String[] args) {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.getContentPane().add(new ScaledText());
            f.setSize(400,400);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
    }

  • Best way to laminate prints ordered from iPhoto?

    Is there a way within iPhoto to order a print to be laminated? If, not, what is best service and process to have this done, if not at Kinko's?

    I do not believe you can order them laminated. Kinkos (aka FedEx Office) might be your best bet.
    But this is just the heat-sealed plastic lamination.
    This discussion intimates that there might be better options for photos:
    http://photography-on-the.net/forum/showthread.php?t=139487

  • Pricing: Best way to determine an partial condition amount

    Hi,
    In our scenario MWST (VAT) is calculated from multiple values/conditions (price and postage&package costs).
    What is the best way to extract the VAT value for only one of these conditions? I can only think of extracting this value via ABAP within a routine however this value isn't rounded? Is there a more easy way via customizing/conditions to extract this value?
    We need this value to calculate/sum the net-value for postage and package costs.
    Kind regards,
    Tim

    What is the best way to extract the VAT value for
        only one of these conditions?
    If the requirement will not vary from billing to billing, then you can accordingly assign the From-To step number in your pricing procedure. 
    thanks
    G. Lakshmipathi

  • What is the proper and best way to destroy a java.util.List or Array for GC

    Hi,
    If I have a java.util.List of objects lets say:
    List<File> files = new ArrayList();The List contains 1000 file objects. When my class finishes, is it enough to do
    files = null;to make GC able to release it from memory?
    Cause it seems like I can't do the following:
    for(int i = 0; i < extracted_files.size(); i++){
                extracted_files.get(i) = null;
    }Or should I use this one:
    files.clear()What is the proper and best way to do this in order to avoid memory leaks? How about normal Arrays like File[]?
    Edited by: TolvanTolvanTolvan on 2009-sep-10 16:58

    TolvanTolvanTolvan wrote:
    Thanks for the info!
    But what if the List is a class variable running in a Web Service for like months without terminating?You mean if the List variable is a member variable of a long-lived object? Then presumably the list needs to live as long as the object does. In the unlikely scenario that the object needs to live on but its list member variable does not, then yes, setting the member to null will be needed to make the list eligible for GC. But I highly doubt this is your situation, and if it is, you probably have a design flaw.
    And if the list is referenced only by a local variable, then, as I already said, when the method ends, the variable goes out of scope, and the List is eligible for GC.
    Now, a slightly different situation is when the List needs to live a long time, and at some point during its life, you're done using some object that it refers to. In that situation, simply remove the element from the list (or set the element to null if it's an array rather than a list), and then if it's not referenced anywhere else, it can be GCed.
    How about Arrays like File[]? Do I need to iterate through the array and null all the objects or is it enough to just null the Array?YOU. DON'T. NEED. TO. HELP. GC. You don't need to set the elements to null, and you most likely don't even need to set the array variable to null.
    Also note that only references can be null, not objects.

  • What is the best way to create a SSRS 2005 Line Chart Report for a 12 month period?

    I'm looking for advice on how to create a SQL Server 2005 query and line chart report for SSRS 2005.
    I need to display the peak number of patients assigned to a medical practice each month for a 12 month period based on the end-user selecting a
    single month and year.
    I've previously created a report that displays all patients assigned to the practice for any single month but I’m looking for advice on how to
    how to produce a resultset that shows the peak number of patients each month for a 12 month period. I thought about creating a query that returns the peak count for each month (based on my previously created report which displays all patients assigned to the
    practice for any single month) and then use a UNION statement to join all 12 months but I'm sure that isn't the most efficient way to do this. The other challenge with this approach (twelve resultsets combined via a UNION) is that the end-user needs to be
    able to select any month and year for the parameter and the report needs to display the 12 month period based on the month selected (the month selected would be the last month of the 12 month period).
    For the report I’ve previously created that displays all patients assigned to the practice for any single month, the WHERE statement filters the
    resultset on two fields:
    Start Date - The date the patient was assigned to the practice. This field is never null or blank.
    End Date - The date the patient left the practice. This field can be null or blank as active patients assigned to the practice do not have an End Date. When the patient
    leaves the practice, the date the patient left is populated in this field.
    Using these two fields I can return all patients assigned to the practice during Nov 2012 by looking for patients that meet the following criteria:
    start date prior to 11/30/2012 (using the last day of the month selected ensures patients added mid-month would be included)
    AND
    end date is null or blank (indicates the patient is active) OR the end date is between 11/1/2012 -11/30/2012 (returns patients that leave during the month
    selected)
    Regarding the query I need to create for the report that displays the peak count each month for 12 months, I'm looking for advice on
    how to count patients for each month the patient is assigned to the practice if the patient has been assigned for several months (which applies to most patients). Examples are:
    John Doe has a start date of 6/01/2012 and an End Date of 10/07/2012
    Sally Doe has a start date of 8/4/2012 and no End Date (the patient is still active)
    Jimmy Doe has a  start of 7/3/2012 and an End Date of 9/2/2012
    Given these examples how would I include John Doe in the peak monthly count each month for May - October, Sally Doe in the peak monthly count for
    August - December and Jimmy Doe in the peak monthly count for July – Sept if the end-user running the report selected December 2012 as the parameter?
    Given the example above and the fact I'm creating a line chart I think the best way to create this report would be a resultset that looks like
    this:
    Patient Name              
    Months Assigned
    John Doe
    June 2012
    John Doe                     
    July012
    John Doe                     
    Aug 2012
    John Doe                     
    Sept 2012
    John Doe
    Oct 2012
    Sally Doe                     
    Aug 2012
    Sally Doe                     
    Sept 2012
    Sally Doe
    Oct 2012
    Sally Doe                     
    Nov 2012
    Sally Doe
    Dec 2012
    Jimmy Doe                  
    July 2012
    Jimmy Doe
    Aug 2012
    Jimmy Doe
    Sept 2012
    From the resultset above I could create another resultset that would count\group on month and year to return the peak count for each month:
    June 2012 - 1
    July 2012 – 2
    Aug 2012 - 3
    Sept 2012 - 3
    Oct 2012 - 2
    Nov 2012 - 1
    Dec 2012 - 1
    The resultset that displays the peak count for each month would be used to create the line chart (month would be the X axis and the count would
    be the y axis).
    Does this sound like the best approach?
    If so, any advice on how to create the resultset that lists each patient and each month they were assigned to the practice would be greatly appreciated.
    I do not have permissions to create SPs or Functions within the database but I can create temp tables.
    I know how to create the peak monthly count query (derived from the query that lists each patient and month assigned) as well as the line chart.
    Any advice or help is greatly appreciated.

    Thanks for the replies. I reviewed them shortly after they were submitted but I'm also working on other projects at the same time (hence the delayed reply).
    Building a time table and doing a cross join to my original resultset gave me the desired resultset of the months assigned between dates. What I can't figure out now is how to filter months I don't want. 
    Doing a cross  join between my original resultset that had two dates:
    08/27/2010
    10/24/2011
    and a calendar table that has 24 rows (each month for a two year period)
    my new resultset looks like this:
    I need to filter the rows in yellow as the months assigned for stage 3 that started on 8/27/2010 should stop when the patient was assigned to stage 4 on 10/24/2011.
    You'll notice that Jan - Sept 2011 isn't listed for Stage 4 assigned on 10/24/2011 as I included a filter in the WHERE clause that states
    the Months Assigned value must be greater than or equal to the date assigned value.
    Any advice would be appreciated.

  • I want to find the best way to send my pictures from Aperture to CVS for processing.  How do I do that?  Also, there doesn't seem to be a good app to go from Iphone to CVS either.  Please help

    How do I easly send my pictures from Aperture to CVS for actual printing?  I always have trouble finding my photos in the Aperture library when I need to load them into the CVS web interface.  I can't even tell which photos they are without seeing them.
    Also, what's the best way to do it from my Iphone.  Doesn't seem to be a good app for that.

    Export the adjusted version from Aperture to the Desktop. Download the exported version to CVS.
    You shouldn;t be looking in the Aperture library (if by looking you mean using the Finder on the library). Use Apertures tools to do this. Besides the only thing you could get out of the library would be the  original file that you imported into Aperture not the version with your adjustments.

  • What is the best way to plug my iPhone 5 into a mixer for live music performances?

    I'm thinking of performing live with my iPhone 5 or maybe an iPad that I haven't bought yet. What is the best way to get the sound for the device to a mixer or PA? I'm wondering if anyone has any experience with wireless options. I'm wondering if it is stable enough for live performance. There doesn't seem to be any audio interface options yet.

    there is always the 3.5mm minijack out connector sure it's analogue but a cable with male minijack in 1 and and 2 rca in the other would work with most mixers and or pa's

  • What is the best way to make video and audio the same lengths for posting on Web?

    YouTube recommends doing this to avoid sync problems. Maybe it will also make my videos run more smoothly. I'm talking here about random pauses I see in my movies on YouTube, not the uniform stuttering problem which I pretty much solved by redoing the movie at 30 fps instead of 24 fps. (Original is 18 fps Super 8 movie film.)
    Anyway, there is no sound during my titles. The soundtrack starts about 17 seconds in, and ends when the ending titles begin. So what's the best way to add silent audio? The best I can figure is to take some existing sound, put it in where the titles are, and turn the volume down to zero. Seems real workaround-ish, so to speak, to me. It seems to work. I even cranked it up on headphones to make sure there was no residual noice. But I'm curious if there's a better way? No biggie if not.
    Thanks.         

    I should have included the following:
    1.) Why can't I make a silent project in GarageBand? I have to instead find a project with a long enough song, make an "iLife preview" of it (see (2) below), copy it from the iMovie Music and Sound Effects browser to the end of the movie, and then open the audio panel and turn the volume to zero. And all this so that video websites don't get confused by a soundtrack that starts in mid-movie.
    2.) Why do I have to "render" them by the following process: Double-click a song in the iMovie Music and Sound Effects browser. You get a dialog box saying "The project "The Great Race" cannot be used because it was not prepared with an iLife preview. Would you like to open "The Great Race" in GB so you can save it with an iLife preview?" What I don't understand is why this new thing was introduced and why I have to do it via iMovie.

  • Sales order line item delete error for MTO sales order

    Dear Experts
    iam facing below error for MTO sales order line item deletion
    "For reasons of cost management, item 000040 cannot
    be deleted"
    Please help
    Regards,
    KEdar

    It looks you try to delete the sales order line item and you get this error message.
    Try to put reason for rejection for the line item and save the order. This is equal to deleting the line item.
    You can also refer the OSS note 14097 - Order item cannot be deleted/overwritten for further information.
    Regards,

  • What's the best way to connect latest iphone to 2010 Mini CooperS  for hands free

    What is the best way to connect the latest iphone to a 2010 mini Cooper S for hands free operation?

    Patrick Hindman wrote:
    Does anyone have any suggestions of what kind of hardware I should purchase to do this? Basically, I want a jam-up iTunes server that serves everything to each device (sorry, should have worded it this way sooner! . Maybe a MacMini server would do it? Or possibly just a Mac Mini or would Time Capsule do something like this?
    i use an old G4 Mac Mini running 10.5 Leopard, and it's on 24/7
    it runs in headless mode (ie no monitor) and i remotely administer it using remote desktop (or logmein if i'm out the house).
    i have a 1TB WD Mybook hanging off it connected via Firewire and that stores all my itunes content.

Maybe you are looking for