运用同一个Registry,使用同一个Registry

像Player进度那样增添TableServer代表桌子进程

像Player进度那样扩展TableServer代表桌子进度

扩展TableSupervisor监控TableServer。使用同一个Registry,因而名字也改成LocalRegistry了。

扩充TableSupervisor监控TableServer。使用同一个Registry,由此名字也改成LocalRegistry了。

故而Registry的开行代码,以及原来PlayerServer的register_name要做多少修改。

之所以Registry的起步代码,以及原来PlayerServer的register_name要做多少修改。

自然你也得以利用2个例外的Registry,但可能就要扩大一个RegstrySupervisor 去start_child了,

自然你也可以动用2个分歧的Registry,但可能就要追加一个RegstrySupervisor 去start_child了,

又或者手动启动2个(尤其不提议)。

又或者手动启动2个(尤其不提议)。

新的game_server.ex

新的game_server.ex

图片 1图片 2

图片 3图片 4

defmodule GameServer do
  use Application
  def start(_type, _args) do
    children = [
      {Registry, keys: :unique, name: LocalRegistry},
      PlayerSupervisor,
      TableSupervisor
    ]
    Supervisor.start_link(children, strategy: :one_for_one)
  end
end
defmodule GameServer do
  use Application
  def start(_type, _args) do
    children = [
      {Registry, keys: :unique, name: LocalRegistry},
      PlayerSupervisor,
      TableSupervisor
    ]
    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

game_server.ex

game_server.ex

PlayerServer 的register_name 应该按table_server 那样修改,那样明晰,并且也不会争执。

PlayerServer 的register_name 应该按table_server 那样修改,那样明晰,并且也不会顶牛。

图片 5图片 6

图片 7图片 8

defmodule TableServer do
    use GenServer, restart: :temporary, start: {__MODULE__, :start_link, []}

    def start_link(table) do
        GenServer.start_link(__MODULE__, table, name: register_name(table))
      end

    def init(table) do
        {:ok, table}
    end

    def register_name(%{} = table), do: register_name(table |> SimpleTable.get_id)
    def register_name(id), do: {:via, Registry, {LocalRegistry, {Table, id}}}

    def exist?(table) do
        key = {Table, table |> SimpleTable.get_id}
        case Registry.lookup(LocalRegistry, key) do
            [{_pid, _}] -> true
            [] -> false
        end
    end

end
defmodule TableServer do
    use GenServer, restart: :temporary, start: {__MODULE__, :start_link, []}

    def start_link(table) do
        GenServer.start_link(__MODULE__, table, name: register_name(table))
      end

    def init(table) do
        {:ok, table}
    end

    def register_name(%{} = table), do: register_name(table |> SimpleTable.get_id)
    def register_name(id), do: {:via, Registry, {LocalRegistry, {Table, id}}}

    def exist?(table) do
        key = {Table, table |> SimpleTable.get_id}
        case Registry.lookup(LocalRegistry, key) do
            [{_pid, _}] -> true
            [] -> false
        end
    end

end

table_server.ex

table_server.ex

增产了exist? 判断函数,以后会有用吧。

新增了exist? 判断函数,将来会有用呢。

条件上当玩家创设了一个牌局后,没解散以前不允许再成立(当然你可以改,我只是简化了)

规范上当玩家创制了一个牌局后,没解散在此以前不允许再创设(当然你可以改,我只是简化了)

table_supervisor 测试

table_supervisor 测试

defmodule TableSupervisorTest do
    use ExUnit.Case
    doctest PlayerSupervisor

    setup do
        Application.stop(GameServer)
        Application.start(GameServer)
        %{}
    end

    test "测试TableSupervisor启动TableServer" do
        table1 = SimpleTable.init |> SimpleTable.set_id(1)
        table2 = SimpleTable.init |> SimpleTable.set_id(2)
        assert {:ok, _p1} = TableSupervisor.start_table(table1)
        assert {:ok, _p2} = TableSupervisor.start_table(table2)
        assert TableServer.exist?(table1)
        assert TableServer.exist?(table2)
    end
end
defmodule TableSupervisorTest do
    use ExUnit.Case
    doctest PlayerSupervisor

    setup do
        Application.stop(GameServer)
        Application.start(GameServer)
        %{}
    end

    test "测试TableSupervisor启动TableServer" do
        table1 = SimpleTable.init |> SimpleTable.set_id(1)
        table2 = SimpleTable.init |> SimpleTable.set_id(2)
        assert {:ok, _p1} = TableSupervisor.start_table(table1)
        assert {:ok, _p2} = TableSupervisor.start_table(table2)
        assert TableServer.exist?(table1)
        assert TableServer.exist?(table2)
    end
end

变动使用exist? 了

更改使用exist? 了

player_supervisor_test.exs 也照着修改。

player_supervisor_test.exs 也照着修改。

编译测试ok。

编译测试ok。

代码变迁参看git吧。

代码变迁参看git吧。

他日大家由玩家创制牌局,一步步进展吧。

他日我们由玩家成立牌局,一步步拓展吧。

XXXX,想了下
上句话不对,创建那么些跟玩法也未尝关系,先放着,直接起牌局玩才对。

XXXX,想了下
上句话不对,创造那一个跟玩法也尚无关系,先放着,直接起牌局玩才对。

XXXXX,上句看似也不对,本质上server进度只是转调用数据结构的操作,由此牌局玩法完全可以是数据结构的操作先。

XXXXX,上句看似也难堪,本质上server进度只是转调用数据结构的操作,由此牌局玩法完全可以是数据结构的操作先。

据此下回大家一向操作数据,举行牌局。

为此下回大家直接操作数据,进行牌局。

 

 

相关文章