#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Start locator for New York (ny) cluster
start locator --name=locator-ny --port=10331 --locators=localhost[10331] --mcast-port=0 --log-level=config \
	--J=-Dgemfire.remote-locators=localhost[10332] --J=-Dgemfire.distributed-system-id=1 \
	--J=-Dgemfire.jmx-manager-start=true --J=-Dgemfire.jmx-manager-http-port=8081 \
	--J=-Dgemfire.jmx-manager-port=1091

start server --name=server-ny-1 --locators=localhost[10331] --mcast-port=0 --log-level=config \
	--enable-time-statistics=true --statistic-archive-file=cacheserver.gfs --server-port=0 \
	--classpath=../build/classes/java/main --J=-Dgemfire.statistic-sampling-enabled=true \
	--J=-Dgemfire.distributed-system-id=1 --J=-Dgemfire.conserve-sockets=false \
	--J=-Dgemfire.log-file=cacheserver.log

start server --name=server-ny-2 --locators=localhost[10331] --mcast-port=0 --log-level=config \
	--enable-time-statistics=true --statistic-archive-file=cacheserver.gfs --server-port=0 \
	--classpath=../build/classes/java/main --J=-Dgemfire.statistic-sampling-enabled=true \
	--J=-Dgemfire.distributed-system-id=1 --J=-Dgemfire.conserve-sockets=false \
	--J=-Dgemfire.log-file=cacheserver.log

# Create gateway receivers for all servers in the New York cluster
create gateway-receiver

# Create gateway senders for servers to send updates to the London site
create gateway-sender --id="ln" --parallel="true" --remote-distributed-system-id="2" 

list members

