View Javadoc

1   /*
2    * Copyright (c) 1998-2002 The Jgroup Team.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU Lesser General Public License version 2 as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Lesser General Public License for more details.
12   *
13   * You should have received a copy of the GNU Lesser General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16   *
17   */
18  
19  package jgroup.test.hello;
20  
21  import java.rmi.RemoteException;
22  
23  import jgroup.core.GroupManager;
24  import jgroup.core.MemberId;
25  import jgroup.core.MembershipListener;
26  import jgroup.core.View;
27  import jgroup.core.protocols.Multicast;
28  import jgroup.util.Network;
29  
30  /**
31   *  Simple Hello server aimed at demonstrating the capabilities of both
32   *  internal and external invocations.  This server is modified to be used
33   *  with the automatic join and bind of the PGMS and RegistryLayer, and to
34   *  test things like the LeaseLayer and NotifyLayer.
35   *
36   *  @author Alberto Montresor
37   *  @author Hein Meling
38   *  @since Jgroup 1.0
39   */
40  public class NotifyServer
41    implements Hello, InternalHello, MembershipListener
42  {
43  
44    ////////////////////////////////////////////////////////////////////////////////////////////
45    // Fields
46    ////////////////////////////////////////////////////////////////////////////////////////////
47  
48    /** Stores the answer for replying to external invocations */
49    private Answer answer;
50  
51    /** The group manager reference */
52    private GroupManager gm = null;
53  
54    /** Reference to the internal hello group proxy (for group internal invocations) */
55    private InternalHello internalHello;
56  
57  
58    ////////////////////////////////////////////////////////////////////////////////////////////
59    // Main method (initialize the NotifyServer object)
60    ////////////////////////////////////////////////////////////////////////////////////////////
61  
62    public static void main(String argv[])
63      throws Exception
64    {
65      NotifyServer obj = new NotifyServer();
66      /*
67       * Note that, at this point we do not exit since the dependable
68       * registry reference holds a strong reference to this
69       * <code>NotifyServer</code> object, and thus prevents it from being
70       * garbage collected.  This again prevents the server from exiting
71       * at this point.  So, to stop the server from running we must
72       * either, use CTRL-C or unbind the helloserver reference in the
73       * dependable registry.
74       */
75    }
76  
77  
78    ////////////////////////////////////////////////////////////////////////////////////////////
79    // Constructor for the NotifyServer
80    ////////////////////////////////////////////////////////////////////////////////////////////
81  
82    public NotifyServer()
83      throws Exception
84    {
85      System.out.println("Server starting...");
86      /* Prepare the answer for replying to external invocations. */
87      answer = new Answer("Hello from " + Network.getLocalHostName());
88  
89      /* Obtain the group manager */
90      gm = GroupManager.getGroupManager(this);
91      System.out.println("Server obtained group manager");
92    }
93  
94  
95    ////////////////////////////////////////////////////////////////////////////////////////////
96    // Methods from the Hello interface (External Group Method Invocation)
97    ////////////////////////////////////////////////////////////////////////////////////////////
98  
99    public Answer sayHello()
100     throws RemoteException
101   {
102     System.out.println("sayHello: returning " + answer);
103     return answer;
104   }
105 
106   @Multicast public double doCompute() throws RemoteException
107   {
108     return 0;
109   }
110 
111 
112   ////////////////////////////////////////////////////////////////////////////////////////////
113   // Methods from the InternalHello interface (Internal Group Method Invocation)
114   ////////////////////////////////////////////////////////////////////////////////////////////
115 
116   public Object time()
117     throws RemoteException
118   {
119     long tmp = System.currentTimeMillis();
120     System.out.println("Generating time: " + tmp);
121     return new Long(tmp);
122   }
123 
124 
125   ////////////////////////////////////////////////////////////////////////////////////////////
126   // Methods from MembershipListener
127   ////////////////////////////////////////////////////////////////////////////////////////////
128 
129   public void viewChange(View view)
130   {
131     if (internalHello == null) {
132       /* Obtain the reference for this groups group manager */
133       gm = GroupManager.getGroupManager(view.getGid());
134       /* Obtain proxy for the internal hello service required by the NotifyServer */
135       internalHello = (InternalHello) gm.getService(InternalHello.class);
136     }
137 
138     System.out.println("View id: " + view.getVid());
139     MemberId[] members = view.getMembers();
140     for (int i = 0; i < members.length; i++)
141       System.out.println("Member[" + i + "]: " + members[i]);
142 
143     try {
144       /*
145        * The time() method is defined in the InternalHello interface and
146        * is marked as a group internal method.  By definition, all group
147        * internal methods will return an array of values instead of a
148        * single value as with standard remote (or external group) method
149        * calls.
150        */
151       Object[] objs = (Object[]) internalHello.time();
152       for (int i = 0; i < objs.length; i++)
153         System.out.println("Time: " + objs[i]);
154       answer.setTime(objs);
155     } catch (Exception e) {
156       e.printStackTrace();
157     }
158   }
159 
160   public void prepareChange()
161   {
162   }
163 
164   public void hasLeft()
165   {
166   }
167 
168 } // END NotifyServer