나는 실행 파일이 생산자이고 WCF 서비스가 소비자 인 scenerio를 가지고있다. 다음과 같이WCF에서 RabbitMQ를 사용하는 방법은 무엇입니까?
WCF 서비스 워크 플로는 다음과 같습니다
1) 서비스 실행 (프로듀서) 호출이 실행 파일이 RabbitMQ 큐에 메시지를 생성하는 또 다른 과정이다.
2) 서비스)는 RabbitMQ 큐
3에서 메시지를 소비하는 클라이언트에 데이터를 반환해야합니다.
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace ConnectionServices
{
public class Connection : IConnection
{
public string ConnectSite(string provider, string server, string siteName)
{
InvokeProducer(provider, server, siteName);
string activeInstance = RunRabbitMQ();
return activeInstance;
}
public void InvokeProducer(string provider, string server, string siteName)
{
string siteManagerExePath = @"C:\Users\mbmercha\Documents\Visual Studio 2015\Projects\Producer\Producer\bin\Debug\Producer.exe";
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
Process siteManagerProcess = new Process();
startInfo.FileName = siteManagerExePath;
startInfo.Arguments = string.Format("{0} {1} {2} {3}", "-b ", provider, server, siteName);
siteManagerProcess.StartInfo = startInfo;
siteManagerProcess.Start();
siteManagerProcess.WaitForExit();
}
catch (Exception e)
{
}
}
public string RunRabbitMQ()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
string activeInstance = null;
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("DurableQueue", true, false, false, null);
channel.ExchangeDeclare("DurableExchange", ExchangeType.Topic, true);
channel.QueueBind("DurableQueue", "DurableExchange", "durable");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
activeInstance = message;
};
channel.BasicConsume(queue: "DurableQueue",
autoAck: false,
consumer: consumer);
}
return activeInstance;
}
}
}
지금까지는 서비스가 실행 파일을 호출하고 메시지가 대기열에서 생성되었습니다.
그러나 서비스가 2 단계에서 실패하면 실제 메시지 대신 null이 반환됩니다. 아무도 내가 여기에없는 것을 제안 할 수 있습니까?
미리 감사드립니다.
'activeInstance'가 사용 된 두 줄 :'string activeInstance = null;'return activeInstance;'이 변수는 절대로 설정하지 마십시오. – Reniuz
그것은 실수였습니다. 실제 코드에서는 null이 여전히 유효합니다. @Reniuz – Mahek
실제 코드를 추가하십시오. 이제 메시지는 null이어야하지만 GetString()이 string을 반환하기 때문에 메시지를 반환 할 수 없습니다. – Reniuz