private static void Main(string[] args)
{
var commonConfig = ConfigurationFactory.ParseString(@"
akka {
actor {
provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster""
serializers {
wire = ""Akka.Serialization.WireSerializer, Akka.Serialization.Wire""
}
serialization-bindings {
""System.Object"" = wire
}
}
remote {
helios.tcp {
hostname = ""127.0.0.1""
}
}
cluster {
seed-nodes = [""akka.tcp://[email protected]:3001""]
auto-down-unreachable-after = 30s
}
}");
var producerPort = 3000;
var consumerPort = 4000;
var standAlone = args.Length > 0 && args[0] == "standalone";
if (standAlone)
{
CreateClusterNode(commonConfig, ++producerPort, "producer", "consumer");
}
else
{
CreateClusterNode(commonConfig, ++producerPort, "producer");
CreateClusterNode(commonConfig, ++consumerPort, "consumer");
CreateClusterNode(commonConfig, ++consumerPort, "consumer");
}
// wait for stop signal
Action printUsage = () =>
{
Console.WriteLine("Press command:");
Console.WriteLine("[usage]");
Console.WriteLine(" c [role] create node (p: producer, c: consumer)");
Console.WriteLine(" k [role] kill node (p: producer, c: consumer)");
Console.WriteLine(" q quit");
};
printUsage();
while (true)
{
var line = Console.ReadLine().ToLower();
if (line == "q")
{
break;
}
else if (line.StartsWith("c "))
{
var name = line.Substring(2).Trim();
switch (name)
{
case "p":
CreateClusterNode(commonConfig, ++producerPort, "producer");
break;
case "c":
CreateClusterNode(commonConfig, ++consumerPort, "consumer");
break;
default:
Console.WriteLine("Unknown: " + name);
break;
}
}
else if (line.StartsWith("k "))
{
var name = line.Substring(2).Trim();
switch (name)
{
case "p":
KillOneClusterNode("producer");
break;
case "c":
KillOneClusterNode("consumer");
break;
default:
Console.WriteLine("Unknown: " + name);
break;
}
}
else
{
printUsage();
}
}
// shutdown
_clusterNodes.Reverse();
foreach (var cluster in _clusterNodes)
{
cluster.Context.System.Terminate();
}
}