# Running

This tutorial demonstrates NATS Streaming using example [Go NATS Streaming clients](https://github.com/nats-io/stan.go.git).

## Prerequisites

* [Set up your Git environment](https://help.github.com/articles/set-up-git/).
* [Set up your Go environment](https://golang.org/doc/install).

## Setup

Download and install the [NATS Streaming Server](https://github.com/nats-io/nats-streaming-server/releases).

Clone the following repositories:

* NATS Streaming Server: `git clone https://github.com/nats-io/nats-streaming-server.git`
* NATS Streaming Client: `git clone https://github.com/nats-io/stan.go.git`

## Start the NATS Streaming Server

Two options:

Run the binary that you downloaded, for example: `$ ./nats-streaming-server`

Or, run from source:

```bash
cd $GOPATH/src/github.com/nats-io/nats-streaming-server
go run nats-streaming-server.go
```

You should see the following, indicating that the NATS Streaming Server is running:

```bash
go run nats-streaming-server.go
```

```
[59232] 2019/05/22 14:24:54.426344 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.14.2
[59232] 2019/05/22 14:24:54.426423 [INF] STREAM: ServerID: 3fpvAuXHo3C66Rkd4rmfFX
[59232] 2019/05/22 14:24:54.426440 [INF] STREAM: Go version: go1.11.10
[59232] 2019/05/22 14:24:54.426442 [INF] STREAM: Git commit: [not set]
[59232] 2019/05/22 14:24:54.426932 [INF] Starting nats-server version 1.4.1
[59232] 2019/05/22 14:24:54.426937 [INF] Git commit [not set]
[59232] 2019/05/22 14:24:54.427104 [INF] Listening for client connections on 0.0.0.0:4222
[59232] 2019/05/22 14:24:54.427108 [INF] Server is ready
[59232] 2019/05/22 14:24:54.457604 [INF] STREAM: Recovering the state...
[59232] 2019/05/22 14:24:54.457614 [INF] STREAM: No recovered state
[59232] 2019/05/22 14:24:54.711407 [INF] STREAM: Message store is MEMORY
[59232] 2019/05/22 14:24:54.711465 [INF] STREAM: ---------- Store Limits ----------
[59232] 2019/05/22 14:24:54.711471 [INF] STREAM: Channels:                  100 *
[59232] 2019/05/22 14:24:54.711474 [INF] STREAM: --------- Channels Limits --------
[59232] 2019/05/22 14:24:54.711478 [INF] STREAM:   Subscriptions:          1000 *
[59232] 2019/05/22 14:24:54.711481 [INF] STREAM:   Messages     :       1000000 *
[59232] 2019/05/22 14:24:54.711485 [INF] STREAM:   Bytes        :     976.56 MB *
[59232] 2019/05/22 14:24:54.711488 [INF] STREAM:   Age          :     unlimited *
[59232] 2019/05/22 14:24:54.711492 [INF] STREAM:   Inactivity   :     unlimited *
[59232] 2019/05/22 14:24:54.711495 [INF] STREAM: ----------------------------------
```

## Run the publisher client

Publish several messages. For each publication you should get a result.

```bash
cd $GOPATH/src/github.com/nats-io/stan.go/examples/stan-pub
go run main.go foo "msg one"
go run main.go foo "msg two"
go run main.go foo "msg three"
```

## Run the subscriber client

Use the `--all` flag to receive all published messages.

```bash
cd $GOPATH/src/github.com/nats-io/stan.go/examples/stan-sub
go run main.go --all -c test-cluster -id myID foo
```

```
Connected to nats://localhost:4222 clusterID: [test-cluster] clientID: [myID]
subscribing with DeliverAllAvailable
Listening on [foo], clientID=[myID], qgroup=[] durable=[]
[#1] Received on [foo]: 'sequence:1 subject:"foo" data:"msg one" timestamp:1465962202884478817 '
[#2] Received on [foo]: 'sequence:2 subject:"foo" data:"msg two" timestamp:1465962208545003897 '
[#3] Received on [foo]: 'sequence:3 subject:"foo" data:"msg three" timestamp:1465962215567601196
```

## Explore other subscription options

```bash
    --seq <seqno>                   Start at seqno
    --all                           Deliver all available messages
    --last                          Deliver starting with last published message
    --since <duration>              Deliver messages in last interval (e.g. 1s, 1hr, https://golang.org/pkg/time/#ParseDuration)
    --durable <name>                Durable subscriber name
    --unsubscribe                   Unsubscribe the durable on exit
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.natsclub.cn/cn/yi-chan/stan/changes/run.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
