summaryrefslogtreecommitdiff
path: root/java/demo/Ice/async/WorkQueue.java
blob: 036a1978b49c15902a1772c5e0054ca0d0e76769 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// **********************************************************************
//
// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

import Demo.*;

public class WorkQueue extends Thread
{
    class CallbackEntry
    {
        AMD_Hello_sayHello cb;
	int delay;
    }

    public synchronized void
    run()
    {
        while(!_done)
	{
	    if(_callbacks.size() == 0)
	    {
	        try
		{
	            wait();
		}
		catch(java.lang.InterruptedException ex)
		{
		}
	    }

	    if(_callbacks.size() != 0)
	    {
	        //
		// Get next work item.
		//
		CallbackEntry entry = (CallbackEntry)_callbacks.getFirst();

		//
		// Wait for the amount of time indicated in delay to
		// emulate a process that takes a significant period of
		// time to complete.
		//
	        try
		{
		    wait(entry.delay);
		}
		catch(java.lang.InterruptedException ex)
		{
		}

		if(!_done)
		{
		    //
		    // Print greeting and send response.
		    //
		    _callbacks.removeFirst();
		    System.err.println("Belated Hello World!");
		    entry.cb.ice_response();
		}
	    }
	}

	//
	// Throw exception for any outstanding requests.
	//
	java.util.Iterator p = _callbacks.iterator();
	while(p.hasNext())
	{
	    CallbackEntry entry = (CallbackEntry)p.next();
	    entry.cb.ice_exception(new RequestCanceledException());
	}
    }

    public synchronized void
    add(AMD_Hello_sayHello cb, int delay)
    {
        if(!_done)
	{
	    //
	    // Add the work item.
	    //
	    CallbackEntry entry = new CallbackEntry();
	    entry.cb = cb;
	    entry.delay = delay;

	    if(_callbacks.size() == 0)
	    {
	        notify();
	    }
	    _callbacks.add(entry);
	}
	else
	{
	    //
	    // Destroyed, throw exception.
	    //
	    cb.ice_exception(new RequestCanceledException());
	}
    }

    public synchronized void
    destroy()
    {
        _done = true;
	notify();
    }

    private java.util.LinkedList _callbacks = new java.util.LinkedList();
    private boolean _done = false;
}