Comments (7)
This should not happen. To preserve the session or not depends on the CleanSession setting of the client. Make sure the reconnected client has the same clientID as before, and also keep CleanSession setting to be false.
I run the following code with the latest version(master branch):
func main() {
s := gmqtt.DefaultServer()
// listener
ln, err := net.Listen("tcp", ":1883")
if err != nil {
log.Fatalln(err.Error())
return
}
s.AddTCPListenner(ln)
ws := &gmqtt.WsServer{
Server: &http.Server{Addr: ":8080"},
}
s.AddWebSocketServer(ws)
// plugin
s.AddPlugins(management.New(":9090", nil))
log.Println("started...")
s.Run()
signalCh := make(chan os.Signal, 1)
go func() {
for {
<-time.After(2 * time.Second)
s.Publish("topic1", []byte("payload"), 0, false)
}
}()
signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
<-signalCh
s.Stop(context.Background())
log.Println("stopped")
}
and use the following MQTT client tool to test your problem.
https://www.eclipse.org/paho/components/tool/
In my test case, the client will receive the message when it reconnects.
from gmqtt.
By the way, there is no client in gmqtt server. The Publish
method is not a client, it just sends the Publish Packet into a channel and then checks whether there is any matched subscription and delivery the message to matched clients. If any matched client is disconnected and the CleanSession setting is false(which means that the session will be preserved by gmqtt), the message will be delivered when the client reconnect with the same clientID and CleanSession = false setting .
from gmqtt.
Solved this problem with Client Side CleanSession
set to false. When the clients connects and if the sessions is preserved then I got the message. Thx.
I have few more questions..
Is there anyway to persists all the client sessions ? How do I approach to ReSchedule Message Queue if I restart the gmqtt server ?
I am thinking about an use case in notifications.
What should be the best approach for that ? Can you guide or share a little bit documentation on implementing my own sessions.go
with any key value store like redis
instead of container/list
package ?
from gmqtt.
According to MQTT protocol, the CleanSession
flag is on the client side, so the only way to preserve all sessions is to set the CleanSession
flag for all clients.
But you can call Subscribe
method in onConnected
hook method to resume the subscription for the client. Notice that resuming subscription is not the same as resuming a session, because in MQTT protocol, the session is more than subscriptions.
What do you mean ReSchedule Message Queue when restart the gmqtt server?
Gmqtt does not support k/v store for session, it needs a FIFO
queue to get better performance.
from gmqtt.
Also i am using a plugin approach to re schedule the message from db with the publish method if the gmqtt server gets restarts. I am using the build in publish method for that.
If you want to publish message when a client connected, using Publish
method in onConnected
hook should work.
from gmqtt.
Closed. Feel free to reopen it if you have any further questions.
from gmqtt.
No further questions. I have figured out a way to solve my problem using hooks. Thx for the suggestions.
from gmqtt.
Related Issues (20)
- Any benchmark test data? HOT 2
- 有没有推荐的golang版本的mqtt客户端和gmqtt一起工作?或者gmqtt有没有计划处一个自己的client库? HOT 1
- Memory leak using OnBasicAuthWrapper Hook HOT 7
- websocket packet size over 1024 causing read hang HOT 1
- grpc publish retain 标志不起作用
- 1000客户端压测报错/gmqtt/persistence/queue/mem/mem.go:185 +0x118 HOT 1
- 三节点的集群,客户端发送消费二进制数据,节点挂掉了 HOT 2
- 可能存在内存泄漏 HOT 2
- panic: persistence factory: memory not found? HOT 1
- Modify topic before publishing
- 关于mqtts的问题 HOT 2
- Alternatives or sucessor of this project
- Old Docker Image
- 有时候存在消息未送达的情况
- 哪里空了啊
- 插件hook函数加载时间点优先于日志
- 测试无法保留会话,总会CleanSession,请问这块有做没有?是否是bug HOT 1
- 如何有重复id登录,是否有选项舍弃之前的id,而不是新的id自动拒绝? HOT 5
- ERROR server/client.go:273 connection lost {"client_id": "", "remote_addr": "113.89.11.200:21300", "error": "operation error: Code = 81, reasonString: "} HOT 1
- mqtt5协议的客户端无法获取clientId?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gmqtt.