4

MassTransitをAppHarborとCloudAMQPで正常に動作させることができた人はいますか?

私はそれで時間のクマを持っています。

パブリッシャー(Webサイト)にメッセージを送信させていますが、サーバー(バックグラウンドワーカー)がメッセージを受信して​​いないようです。

私が懸念していることの1つは、MTがrabbitmqスキームを必要とするのに対し、CloudAMQPはスキームをamqpに設定することです。

バスを構成するときにスキームを(amqpからrabbitmqに)交換していますが、メッセージのアドレスのスキームがrabbitmqであることに気付きました。これは、置き換えたので意味があります。しかし、サーバーがそれらを取得するために、それらがamqpである必要があるかどうか疑問に思っていますか?

これは私が送信した簡単なメッセージです。RabbitMQに届きましたが、サーバーはそれを取得していません。

message_id: 08cf2cbc-5b4f-14dd-1231-381f8b520000
delivery_mode:  2
headers:    
Content-Type:   application/vnd.masstransit+json
Payload
614 bytes
Encoding: string
{

  "destinationAddress": "rabbitmq://98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com:*********@lemur.cloudamqp.com/98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com/Messages.Product:ProductCreatedEvent",

  "headers": {},

  "message": {

    "id": "dd6ecfaa-60d2-4cd4-8cd6-a08a00e872fb"

  },

  "messageType": [

    "urn:message:Messages.Product:ProductCreatedEvent"

  ],

  "retryCount": 0,

  "sourceAddress": "rabbitmq://98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com:**********@lemur.cloudamqp.com/98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com/enterprise_web"

}

ありがとう、ジョー

編集:URLでパスワードを指摘してくれたCarlに感謝します

4

2 に答える 2

7

編集:CloudAMQPでMassTransitを使用することを他の人に考えさせるには、代わりにEasyNetQを調べてください。MassTransit から何も奪わない、素晴らしいプロジェクトです。毎月のデータ使用量を請求する CloudAMQP のようなサービスで使用する場合の問題は、MassTransit がメッセージをサブスクライブするのではなく、ポーリングを使用してメッセージをチェックすることです (少なくとも、私が 2.1.1 で作業していた最後のバージョンでは)。このポーリングは、メッセージを公開していない場合でも、データ使用量を食いつぶします。

実際、それは可能です。

調べてみると、それはすべて appharbor のバックグラウンド ワーカーの構成の一部でした。

それが解決されると、バックグラウンドワーカーは「生きた」ままになり、メッセージを消費し始めました。この問題は、app.config と myworker.exe.config および構成変換を中心に展開されました。それが構成の問題であることに気付いたら、このリンクが役に立ちました。Appharbor バックグラウンド ワーカーの App.config 変換

rabbitmq の amqp スキームを交換する必要がありますが、それは悪くありません。バックグラウンド ワーカーのバス構成は次のとおりです。

log.Info("Configuring MassTransit");
var rabbitUrl = ConfigurationManager.AppSettings["CLOUDAMQP_URL"];

var bus = ServiceBusFactory.New(sbc =>
{
    // configure for log4net
    sbc.UseLog4Net();

    // configure the bus
    sbc.UseRabbitMq();
    sbc.UseRabbitMqRouting();
    sbc.ReceiveFrom(String.Format("{0}/server", rabbitUrl.Replace("amqp://", "rabbitmq://"))); // need to swap the scheme for masstransit

    // finds all the consumers in the container and register them with the bus
    sbc.Subscribe(x => x.LoadFrom(container));

    sbc.BeforeConsumingMessage(() =>
    {
        var session = container.GetInstance<ISessionFactory>().OpenSession();
        CurrentSessionContext.Bind(session);
    });

    sbc.AfterConsumingMessage(() =>
    {
        var sessionFactory = container.GetInstance<ISessionFactory>();
        if (CurrentSessionContext.HasBind(sessionFactory) == false) return;

        var session = CurrentSessionContext.Unbind(sessionFactory);
        if (session != null)
        {
            session.Dispose();
        }
    });

    var results = sbc.Validate();
    if (results.Any())
    {
        throw new Exception("MassTransit may not be setup correctly. Review validate results");
    }
});

// finally inject the bus into the container
container.Inject(bus);
于 2012-07-11T17:10:10.543 に答える
1

メーリングリストでこれを行った人を私は知りません。うまくいきましたが、動作するようになったら、メーリング リストに報告してください。

のプロトコルは、rabbitmq使用するトランスポートを決定するために MT によって使用されます。

RabbitMQ コネクタの .NET ドキュメントによると、amqpプロトコルを使用する必要があります。したがって、これは問題ではありません。しかし、他の場所からインスタンスに接続できますか?

于 2012-07-10T23:53:03.397 に答える