2017-10-15 11 views
0

몇 가지 작업을 수행 할 수있는 컴퓨터가 여러 대 있습니다. 작업을 시작하기 위해 예를 들어 컴퓨터 ID "12345"라는 대기열에 메시지를 보내려고합니다.AMQP/RabbitMQ로 전용 큐로 메시지 보내기

다른 사람이 이러한 메시지를 사용하지 못하게하려면 큐가 독점적이어야합니다.

그러나 내 컨트롤러에서 큐를 소비하는 시스템에서 독점적으로 선언 된 경우 큐를 주장 할 수 없습니다. 그러나, 나는 주장하지 않고 그 이름을 지정하여 대기열로 보낼 수는 있지만 나쁜 습관이라고 생각하십니까?

기계는 다음과 같이 명령을 수신하는 : 나는 큐에 보낼 때

ch.assertQueue(machineID, {exclusive: true, durable: false}, function (err, q) { 
    if (err) console.log(err) 
    console.log("opened queue") 
    ch.consume(q.queue, function (message) { 
     console.log(message.content.toString()) 
    }) 
}) 

, 그것은 클라이언트에서이 라인에 의한 독점 문제로 실패합니다

ch.assertQueue(machineID, {}) 

그러나 위의 줄에 주석을 달면 메시지를 보냅니다.

ch.sendToQueue(machineID, new Buffer(id.toString())) 

이 문제를 해결하는 가장 효과적인 방법은 무엇입니까?

+0

오류 메시지를 게시 하시겠습니까? –

+0

405) RESOURCE_LOCKED - 잠긴 대기열에 대한 독점적 액세스를 얻을 수 없음 –

+0

독점 대기열은 하나 이상의 사용자를 가질 수 없음을 의미합니다. 큐가 항상 소비자에 의해 생성되어야한다는 것을 안다면, 메시지를 보낼 때마다 큐를 생성 할 필요가 없습니다 (처음에는 큐를 생성하는 것이 더 좋습니다). 하나의 가능한 문제는'{exclusive : true, durable : false}'와'{}'(기본적으로 배타적 인 false)라는 서로 다른 매개 변수로 큐가 정의되고 일반적으로 실패합니다 - 매개 변수가 동일해야합니다. –

답변

0

'직접'유형의 교환을 만들고이 교환에 대기열을 바인딩하는 것이 한 가지 방법입니다. 따라서이 교환기에 메시지를 전달하면 교환기로 전달한 라우팅 키와 이름이 같은 대기열로만 라우팅됩니다. 예를 들어 라우팅 키가 '12345'인 모든 메시지는 해당 교환에 의해 '12345'라는 대기열로 라우팅됩니다.