/interpreter/tags/at_build150307/src/edu/vub/at/actors/net/cmd/VMCommand.java

http://ambienttalk.googlecode.com/ · Java · 126 lines · 47 code · 12 blank · 67 comment · 0 complexity · 972842b0ec83f579c459fa6fc162c80b MD5 · raw file

  1. /**
  2. * AmbientTalk/2 Project
  3. * VMCommand.java created on 22-feb-2007 at 13:03:56
  4. * (c) Programming Technology Lab, 2006 - 2007
  5. * Authors: Tom Van Cutsem & Stijn Mostinckx
  6. *
  7. * Permission is hereby granted, free of charge, to any person
  8. * obtaining a copy of this software and associated documentation
  9. * files (the "Software"), to deal in the Software without
  10. * restriction, including without limitation the rights to use,
  11. * copy, modify, merge, publish, distribute, sublicense, and/or
  12. * sell copies of the Software, and to permit persons to whom the
  13. * Software is furnished to do so, subject to the following
  14. * conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be
  17. * included in all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  20. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  21. * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  22. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  23. * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  24. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  25. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  26. * OTHER DEALINGS IN THE SOFTWARE.
  27. */
  28. package edu.vub.at.actors.net.cmd;
  29. import edu.vub.at.actors.natives.ELVirtualMachine;
  30. import edu.vub.at.actors.net.Logging;
  31. import java.io.Serializable;
  32. import java.util.Vector;
  33. import org.jgroups.Address;
  34. import org.jgroups.Message;
  35. import org.jgroups.SuspectedException;
  36. import org.jgroups.TimeoutException;
  37. import org.jgroups.blocks.GroupRequest;
  38. import org.jgroups.blocks.MessageDispatcher;
  39. /**
  40. * VM Command objects are the message objects that AT/2 virtual machines send to one another.
  41. * They are control objects sent by one VM and received by another. The receiving VM
  42. * executes the VM Command object's uponReceiptBy method, which allows the command object to
  43. * encapsulate the reception code itself.
  44. *
  45. * By convention, all VM Command classes are prefixed with CMD.
  46. *
  47. * @author tvcutsem
  48. */
  49. public abstract class VMCommand implements Serializable {
  50. private final String description_;
  51. /** the default transmission timeout for JGroups synchronous message communication */
  52. public static final int _TRANSMISSION_TIMEOUT_ = 10000; // in milliseconds
  53. /**
  54. * @param descr for debugging purposes
  55. */
  56. public VMCommand(String descr) {
  57. description_ = descr;
  58. }
  59. public String toString() {
  60. return "VMCommand:"+description_;
  61. }
  62. /**
  63. * To be overridden by subclasses to specify the behaviour to execute upon reception
  64. * and execution of the command object at the recipient VM.
  65. *
  66. * This code is still executed in a JGroups thread!
  67. *
  68. * @param remoteHost the host at which the command arrived and is executed
  69. * @param wrapper the JGroups message wrapper that was used to transport this command object
  70. */
  71. public abstract Object uponReceiptBy(ELVirtualMachine remoteHost, Message wrapper) throws Exception;
  72. /**
  73. * Sends this VM Command object asynchronously to the recipient VM.
  74. */
  75. protected void sendAsyncUnicast(MessageDispatcher dispatcher, Address recipientVM) throws TimeoutException, SuspectedException {
  76. Logging.VirtualMachine_LOG.info("sending async unicast cmd: " + description_);
  77. // JGROUPS:castMessage(java.util.Vector dests, Message msg, int mode, long timeout)
  78. Vector recipients = new Vector(1);
  79. recipients.add(recipientVM);
  80. dispatcher.castMessage(
  81. recipients, // send to particular member
  82. // JGROUPS:Message.new(destination, source, Serializable)
  83. new Message(recipientVM, null, this),
  84. GroupRequest.GET_NONE, // asynchronous call, non-blocking
  85. 0); // timeout is irrelevant
  86. }
  87. /**
  88. * Sends this VM Command object asynchronously to all connected VMs.
  89. */
  90. protected void sendAsyncMulticast(MessageDispatcher dispatcher) throws TimeoutException, SuspectedException {
  91. Logging.VirtualMachine_LOG.info("sending async multicast cmd: " + description_);
  92. // JGROUPS:castMessage(java.util.Vector dests, Message msg, int mode, long timeout)
  93. dispatcher.castMessage(
  94. null, // send to all members
  95. // JGROUPS:Message.new(destination, source, Serializable)
  96. new Message(null, null, this),
  97. GroupRequest.GET_NONE, // asynchronous call, non-blocking
  98. 0); // timeout is irrelevant
  99. }
  100. /**
  101. * Sends this VM Command object synchronously to the recipient VM. The recipient's
  102. * address must be given, null is not allowed (i.e. broadcasting synchronously is not allowed)
  103. */
  104. protected Object sendSynchronousUnicast(MessageDispatcher dispatcher, Address recipientVM) throws TimeoutException, SuspectedException {
  105. Logging.VirtualMachine_LOG.info("sending sync unicast cmd: " + description_);
  106. // send a discovery query message to the remote VM
  107. // JGROUPS:MessageDispatcher.sendMessage(destination, message, mode, timeout)
  108. return dispatcher.sendMessage(
  109. // JGROUPS:Message.new(destination, source, Serializable)
  110. new Message(recipientVM, null, this),
  111. GroupRequest.GET_FIRST,
  112. _TRANSMISSION_TIMEOUT_);
  113. }
  114. }