How to send multiple asynchronous requests to different web services?

后端 未结 6 1332
梦谈多话
梦谈多话 2021-02-01 07:27

I need to send multiple requests to many different web services and receive the results. The problem is that, if I send the requests one by one it takes so long as I need to sen

6条回答
  •  情歌与酒
    2021-02-01 08:01

    So just for fun I am providing two working examples. The first one shows the old school way of doing this before java 1.5. The second shows a much cleaner way using tools available within java 1.5:

    import java.util.ArrayList;
    
    public class ThreadingExample
    {
        private ArrayList  myThreads;
    
        public static class MyRunnable implements Runnable
        {
            private String data;
    
            public String getData()
            {
                return data;
            }
    
            public void setData(String data)
            {
                this.data = data;
            }
    
            @Override
            public void run()
            {
            }
        }
    
        public static class MyThread extends Thread
        {
            private MyRunnable myRunnable;
    
            MyThread(MyRunnable runnable)
            {
                super(runnable);
                setMyRunnable(runnable);
            }
    
            /**
             * @return the myRunnable
             */
            public MyRunnable getMyRunnable()
            {
                return myRunnable;
            }
    
            /**
             * @param myRunnable the myRunnable to set
             */
            public void setMyRunnable(MyRunnable myRunnable)
            {
                this.myRunnable = myRunnable;
            }
        }
    
        public ThreadingExample()
        {
            myThreads = new ArrayList  ();
        }
    
        public ArrayList  retrieveMyData ()
        {
            ArrayList  allmyData = new ArrayList  ();
    
            if (isComplete() == false)
            {
                // Sadly we aren't done
                return (null);
            }
    
            for (MyThread myThread : myThreads)
            {
                allmyData.add(myThread.getMyRunnable().getData());
            }
    
            return (allmyData);
        }
    
        private boolean isComplete()
        {
            boolean complete = true;
    
            // wait for all of them to finish
            for (MyThread x : myThreads)
            {
                if (x.isAlive())
                {
                    complete = false;
                    break;
                }
            }
            return (complete);
        }
    
        public void kickOffQueries()
        {
            myThreads.clear();
    
            MyThread a = new MyThread(new MyRunnable()
            {
                @Override
                public void run()
                {
                    // This is where you make the call to external services
                    // giving the results to setData("");
                    setData("Data from list A");
                }
            });
            myThreads.add(a);
    
            MyThread b = new MyThread (new MyRunnable()
            {
                @Override
                public void run()
                {
                    // This is where you make the call to external services
                    // giving the results to setData("");
                    setData("Data from list B");
                }
            });
            myThreads.add(b);
    
            for (MyThread x : myThreads)
            {
                x.start();
            }
    
            boolean done = false;
    
            while (done == false)
            {
                if (isComplete())
                {
                    done = true;
                }
                else
                {
                    // Sleep for 10 milliseconds
                    try
                    {
                        Thread.sleep(10);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    
    
        public static void main(String [] args)
        {
            ThreadingExample example = new ThreadingExample();
            example.kickOffQueries();
    
            ArrayList  data = example.retrieveMyData();
            if (data != null)
            {
                for (String s : data)
                {
                    System.out.println (s);
                }
            }
        }
    }
    

    This is the much simpler working version:

    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class ThreadingExample
    {
    
        public static void main(String [] args)
        {
            ExecutorService service = Executors.newCachedThreadPool();
            Set > callables = new HashSet > ();
    
            callables.add(new Callable()
            {
                @Override
                public String call() throws Exception
                {
                    return "This is where I make the call to web service A, and put its results here";
                }
            });
    
            callables.add(new Callable()
            {
                @Override
                public String call() throws Exception
                {
                    return "This is where I make the call to web service B, and put its results here";
                }
            });
    
            callables.add(new Callable()
            {
                @Override
                public String call() throws Exception
                {
                    return "This is where I make the call to web service C, and put its results here";
                }
            });
    
            try
            {
                List> futures = service.invokeAll(callables);
                for (Future future : futures)
                {
                    System.out.println (future.get());
                }
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            catch (ExecutionException e)
            {
                e.printStackTrace();
            }
        }
    }
    

提交回复
热议问题