связь между контейнерами в docker-compose
у меня возникла проблема в подключении к mqtt серверу из моего сервиса. Сервисы связаны так:
name: ikm
services:
mqtt:
image: eclipse-mosquitto:latest
container_name: mqtt
ports:
- "1883:1883"
expose:
- "1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
networks:
- IKM
hostname: mqtt
calculate_module:
build:
context: ./calculate_module
dockerfile: Dockerfile
container_name: calculate_module
depends_on:
- mqtt
ports:
- "8000:8000"
expose:
- "8000"
networks:
- IKM
hostname: calculate_module
networks:
IKM:
driver: bridge
так пытаюсь подключиться к мктт
async fn connect_mqtt() -> Result<(AsyncClient, EventLoop)> {
let mut mqttoptions = MqttOptions::new("ikm22848", "mqtt", 1883);
mqttoptions.set_max_packet_size(256 * 1024 * 1024, 256 * 1024 * 1024);
mqttoptions.set_keep_alive(Duration::from_secs(30));
mqttoptions.set_inflight(10);
let (mqtt_client, event_loop) = AsyncClient::new(mqttoptions, 10);
Ok((mqtt_client, event_loop))
}
в любом случае получаю ошибку (с внешними адрессами все нормально работает):
{
"result": "Ошибка отправки сообщения: Request(Publish(Topic = IKM, Qos = AtLeastOnce, Retain = false, Pkid = 0, Payload Size = 4))"
}
испольльзую
rumqttc = "0.24.0"
пробовал добавлять hostname в докер композ, убирать сеть, убирать порты.. ничего не помогло
Ответы (1 шт):
Автор решения: Exdet
→ Ссылка
дело не в докере было, а как rumqttc обрабатывает соединение (нужно ручками поллить).
pub async fn init() -> Result<Self> {
let (mqtt_client, mut event_loop) = Self::connect_mqtt().await?;
+ tokio::spawn(async move {
+ while let Ok(notification) = event_loop.poll().await {
+ println!("Received = {:?}", notification);
+ }
+ });
let result = mqtt_client
.publish(...)
....
без полинга отправлять сколько угодно можно - отправляться не будет