---
# System prepended metadata

title: 以 Websocket STOMP 與 rabbitmq 溝通

---

# 以 Websocket STOMP 與 rabbitmq 溝通

# 啟用 Web STOMP
> rabbitmq-plugins enable rabbitmq_web_stomp
> 

![](https://i.imgur.com/X25TUDS.png)

# 引入 js WebSocket 
> 把 [stomp-websocket](https://github.com/jmesnil/stomp-websocket/tree/master/lib) \lib\stomp.js
Add support for receiving fragmented STOMP frames. These can orginate…
> 
```javascript=
<!-- include the client library -->
<script src="stomp.js"></script>
```
![](https://i.imgur.com/p87VGvx.png)


# docker 記得把 端口 暴露
> port 15672

![](https://i.imgur.com/6nloqhM.png)


# Sample Code

```javascript=
var ws = new WebSocket('ws://127.0.0.1:15674/ws');
var client = Stomp.over(ws);

var on_connect = function() {
    console.log('connected');
};
var on_error =  function() {
    console.log('error');
};

```

發送消息:
```javascript=
client.send('/exchange/交換機名字/路由鍵', {}, "Hello");
```

訂閱交換機
```javascript=
client.subscribe('/exchange/交換機名字/路由鍵', function(frame){}, {});
```
可以對 交換機內容做封裝
這邊是針對 我自己額外寫的一個 sha 根據登陸名稱來 產生 sha256
因為 假設都是同一組 queue 這樣的話，這樣 當兩個 client 同時訂閱同一個 queue 的話 會變成 queue 裡面有兩個 client 好像是 ha模式?
意味者 執行 上方 發送訊息 則 假設 queue 有兩個 client,也就是 a和 b 那麼 第一次呼叫後 則會 a收到訊息 再來就是 b 這樣循環下去
[延伸閱讀 三种Exchange模式 ](https://blog.csdn.net/u013045437/article/details/71710067)
```javascript=
      var sha =sha256(loginName);
      client.subscribe('/exchange/amq.fanout/test', this.AmqpReturn, {
        'x-queue-name':sha,
        'durable': true
      });
```
擴展:
```javascript=
  AmqpReturn(frame) {
    
    var obj = JSON.parse(frame.body);
  
    console.log(obj.data);
  }
```

其他參數:
除了這裡用到的參數外，還支持下面的隊列參數：

durable (aliased as persistent)：持久化
auto-delete：自动删除
exclusive：独占
還額外支持 x- 參數控制死信、隊列和消息等：

x-dead-letter-exchange
x-dead-letter-routing-key
x-expires
x-message-ttl
x-max-length
x-max-length-bytes
x-overflow
x-max-priority
