0

完全に理解できない問題があります。この方法でメッセージを作成すると、次のように機能します。

var message = new StartFakeJobCommand();
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

メッセージがキューに入れられ、リスナーがそれを消費できます。しかし、このようにActivator.CreateInstanceを使用してメッセージを作成すると、機能しません。キューには何も発行されません。

var t = Type.GetType(string.Format("{0}.{1},{2}", job.CommandNamespace, job.Command, job.AssemblyName));
if (t == null)
    throw new ArgumentException();

var message = Activator.CreateInstance(t);
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

デバッグ中に、両方の方法を使用して同じタイプが作成されていることがはっきりとわかります。2番目のアプローチが機能しない理由は何ですか?

これは私がメッセージを購読する方法です:

bus.Subscribe<StartFakeJobCommand>("StartFakeJobCommand_ID", message => fakeJob.Handle(message));
4

1 に答える 1

1

Activator.CreateInstance の署名は次のとおりです。

public static Object CreateInstance(
    Type type
)

メッセージのタイプはオブジェクトであるため、メッセージはタイプ オブジェクトとして公開され、オブジェクトのサブスクライバーがないため、ブラック ホールになります。

問題を解決するには、正しいジェネリック型で publishChannel.Publish を呼び出します。

于 2013-04-30T15:40:14.737 に答える