Я переместил mqtt-hs в LTS-5.13 и скомпилировал только штраф с стекю. Затем я создал следующего абонента, чтобы прослушивать иерархию тем. Это абонентский кодbasic mqtt with haskell
{-# LANGUAGE OverloadedStrings #-}
module Main(main) where
import Control.Concurrent (threadWaitRead)
import System.Posix.Types
import Network.MQTT
import Network.MQTT.Logger
main :: IO()
main = do
conn <- connect defaultConfig { cLogger = warnings stdLogger, cHost = "192.168.0.1" }
qos <- subscribe conn Confirm "/something" callback
putStrLn "control-c to finish"
threadWaitRead $ Fd 1
callback topic payload = putStrLn $ "A message was published to " ++ show topiC++ ": " ++ show payload
Когда я отправить что-нибудь на тему (с помощью простого Haskell издателя тоже), я получаю это в консоли этой программы:
control-c to finish
[Error] {handle: <socket: 3>}: recvLoop: end of file
[Error] recvLoop: No reconnect, terminating.
, но никакого другого выхода ,
Оба издателя и подписчика подключаются к брокеру (Mosquitto). Кажется, что абонент Ok, выше это происходит только при получении сообщения от издателя. Вышеупомянутое сообщение также возникает, когда я останавливаю брокера.
Любые идеи?
Обновление
Я клонировал самый последний MQTT-HS (0.3.0) и ввел это изменение
--- a/Network/MQTT.hs
+++ b/Network/MQTT.hs
@@ -448,9 +448,10 @@ recvLoop :: MQTT -> IO()
recvLoop m = loopWithReconnect m "recvLoop" $ \mqtt -> do
h <- readMVar (handle mqtt)
eof <- hIsEOF h
- if eof
- then ioError $ mkIOError eofErrorType "" (Just h) Nothing
- else getMessage mqtt >>= dispatchMessage mqtt
+ getMessage mqtt >>= dispatchMessage mqtt
+ -- if eof
+ -- then ioError $ mkIOError eofErrorType "" (Just h) Nothing
+ -- else getMessage mqtt >>= dispatchMessage mqtt
`catch`
\e -> logWarning mqtt $ "recvLoop: Caught " ++ show (e :: MQTTException)
т.е., я отключил проверку EOF. Теперь сообщение печатается на консоль, но абонент входит в цикл, бросая [Warning] recvLoop: Caught EOF
как можно быстрее.
Это mosquito ошибка или ошибка в mqtt-hs?
Update 2
Я могу подтвердить, что работает с ActiveMQ без хака. Сказав это, лучше, если mqtt-hs может восстановиться после закрытия соединения брокера с абонентом.
Да, добавление 'cReconnPeriod = Just 1' исправляет это! Мне нужно прочитать о «TChan», но простой подход выше работает с исправленным. Tnx. – carlosayam