Websockets和Redis pubsub

时间:2016-11-21 01:29:09

标签: haskell

有谁知道在哪里可以找到使用带有Redis pub-sub的wai-websocket向客户端发送实时通知的示例?

我已阅读wai-websocketshedis的hacakge文档,但我仍不清楚如何将两者结合起来以达到预期效果。

1 个答案:

答案 0 :(得分:2)

如果有人想知道这篇文章,我最近实施了一个基本的hediswebsockets应用。一个简单的实现将在一个线程中运行一个hedis订阅者,在另一个线程中运行websocket并通过TChan进行通信。

一些示例代码

main = do
  chan <- atomically $ newTChan
  a <- forkIO (subscribeProc chan)
  b <- forkIO (webSock chan)
  -- wait for a and b

-- Hedis subscriber
subscribeProc :: TChan B.ByteString -> IO ()
subscribeProc chan = do
  conn <- connect defaultConnectInfo
  pubSubCtrl <- newPubSubController [("redis-channel", chanHandler chan)] []
  forever $
    pubSubForever conn pubSubCtrl onInitialComplete
    `catch` (\(e :: SomeException) -> do
                Prelude.putStrLn $ "Got error: " ++ show e
                threadDelay $ 60*1000)


chanHandler :: TChan B.ByteString -> B.ByteString -> IO ()
chanHandler chan msg =
  atomically $ writeTChan chan (msg)

onInitialComplete :: IO ()
onInitialComplete = putStrLn
  "Redis acknowledged that mychannel is now subscribed"


-- websocket
webSock :: TChan B.ByteString -> IO ()
webSock chan = do
  WS.runServer appHost appPort $ handleConnection chan

handleConnection :: TChan B.ByteString -> WS.PendingConnection -> IO ()
handleConnection chan pending = do
  connection <- WS.acceptRequest pending
  loop chan connection
  where
    loop chan connection = do
      msg <- atomically $ readTChan chan
      putStrLn $ "got data " ++ show msg
      WS.sendTextData connection msg
      loop chan connection