web-dev-qa-db-ja.com

埋め込みAMQP Javaブローカー

Scala/Java RabbitMQブローカーに接続するアプリケーション)の統合テストを作成しようとしています。これを実現するには、AMQPを話す組み込みブローカーが必要です各テストの前に開始および停止します。元々は、AMQPを組み込んだブローカーとしてActiveMQを導入しようとしましたが、アプリケーションはRabbitMQを使用するため、AMQPバージョン0.9.3しか話せませんが、ActiveMQにはAMQPバージョン1.0が必要です。

ActiveMQの代わりに使用できる別の組み込みブローカーはありますか?

18
ahjmorton

完全にメモリ内のソリューション。 spring.*プロパティは必要に応じて。

<dependency>
  <groupId>org.Apache.qpid</groupId>
  <artifactId>qpid-broker</artifactId>
  <version>6.1.1</version>
  <scope>test</scope>
</dependency>
public class EmbeddedBroker {
  public void start() {
    Broker broker = new Broker();
    BrokerOptions brokerOptions = new BrokerOptions();
    brokerOptions.setConfigProperty("qpid.amqp_port", environment.getProperty("spring.rabbitmq.port"));
    brokerOptions.setConfigProperty("qpid.broker.defaultPreferenceStoreAttributes", "{\"type\": \"Noop\"}");
    brokerOptions.setConfigProperty("qpid.vhost", environment.getProperty("spring.rabbitmq.virtual-Host"));
    brokerOptions.setConfigurationStoreType("Memory");
    brokerOptions.setStartupLoggedToSystemOut(false);
    broker.startup(brokerOptions);
  }
}

追加 initial-config.jsonをリソースとして:

{
  "name": "Embedded Test Broker",
  "modelVersion": "6.1",
  "authenticationproviders" : [{
    "name": "password",
    "type": "Plain",
    "secureOnlyMechanisms": [],
    "users": [{"name": "guest", "password": "guest", "type": "managed"}]
  }],
  "ports": [{
    "name": "AMQP",
    "port": "${qpid.amqp_port}",
    "authenticationProvider": "password",
    "protocols": [ "AMQP_0_9_1" ],
    "transports": [ "TCP" ],
    "virtualhostaliases": [{
      "name": "${qpid.vhost}",
      "type": "nameAlias"
    }]
  }],
  "virtualhostnodes" : [{
    "name": "${qpid.vhost}",
    "type": "Memory",
    "virtualHostInitialConfiguration": "{ \"type\": \"Memory\" }"
  }]
}
13
OrangeDog

RabbitMQのダウンロード、抽出、起動、管理のプロセスをラッパーとして開発したので、JVMプロジェクトによって制御される組み込みサービスのように機能します。

ご覧ください: https://github.com/AlejandroRivera/embedded-rabbitmq

それは次のように簡単です:

EmbeddedRabbitMqConfig config = new EmbeddedRabbitMqConfig.Builder()
    .version(PredefinedVersion.V3_5_7)
    .build();
EmbeddedRabbitMq rabbitMq = new EmbeddedRabbitMq(config);
rabbitMq.start();
...
rabbitMq.stop();

Linux、Mac、Windowsで動作します。

10
Alejandro

here からインスピレーションを得て、Qpid Broker 7.xに適合したOrangeDogによって提案されたソリューションを次に示します。

Qpid 7.xをテスト依存として追加します。 7.xでは、これらは必要に応じてコア+プラグインに分離されています。 RabbitMQ AMQPバージョンの場合、qpid-broker-plugins-amqp-0-8-protocolが必要です。インメモリで実行するには(統合テストに十分)、qpid-broker-plugins-memory-storeを使用します。

pom.xml

...
<properties>
    ...
    <qpid-broker.version>7.0.2</qpid-broker.version>
</properties>

<dependencies>
    ...
    <dependency>
        <groupId>org.Apache.qpid</groupId>
        <artifactId>qpid-broker-core</artifactId>
        <version>${qpid-broker.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.Apache.qpid</groupId>
        <artifactId>qpid-broker-plugins-amqp-0-8-protocol</artifactId>
        <version>${qpid-broker.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.Apache.qpid</groupId>
        <artifactId>qpid-broker-plugins-memory-store</artifactId>
        <version>${qpid-broker.version}</version>
        <scope>test</scope>
    </dependency>
</dependecies>
...

ハードコードされたユーザー/パスワードとデフォルトのメモリ内仮想ホストをデフォルトのポート(5672)にマップして、ブローカー構成を追加します。

qpid-config.json

{
  "name": "EmbeddedBroker",
  "modelVersion": "7.0",
  "authenticationproviders": [
    {
      "name": "password",
      "type": "Plain",
      "secureOnlyMechanisms": [],
      "users": [{"name": "guest", "password": "guest", "type": "managed"}]
    }
  ],
  "ports": [
    {
      "name": "AMQP",
      "port": "${qpid.amqp_port}",
      "authenticationProvider": "password",
      "virtualhostaliases": [
        {
          "name": "defaultAlias",
          "type": "defaultAlias"
        }
      ]
    }
  ],
  "virtualhostnodes": [
    {
      "name": "default",
      "defaultVirtualHostNode": "true",
      "type": "Memory",
      "virtualHostInitialConfiguration": "{\"type\": \"Memory\" }"
    }
  ]
}

Junit ExternalResourceを定義し、ClassRuleとして宣言します(またはIT @BeforeClassおよび@AfterClassメソッドで組み込みブローカーを開始および終了します):

EmbeddedAMQPBroker.Java

public class EmbeddedAMQPBroker extends ExternalResource {

    private final SystemLauncher broker = new SystemLauncher();

    @Override
    protected void before() throws Throwable {
        startQpidBroker();
        //createExchange();
    }

    @Override
    protected void after() {
        broker.shutdown();
    }

    private void startQpidBroker() throws Exception {
        Map<String, Object> attributes = new HashMap<>();
        attributes.put("type", "Memory");
        attributes.put("initialConfigurationLocation", findResourcePath("qpid-config.json"));
        broker.startup(attributes);
    }

    private String findResourcePath(final String fileName) {
        return EmbeddedAMQPBroker.class.getClassLoader().getResource(fileName).toExternalForm();
    }
}

統合テスト:

public class MessagingIT{
    @ClassRule
    public static EmbeddedAMQPBroker embeddedAMQPBroker = new EmbeddedAMQPBroker();

    ...
}
8
Timi

私は組み込みのRabbitMQサーバーを認識していませんので、これを回避するためのオプションがいくつかあると思います。

  1. RabbitMQサーバーはCIサーバー上に存在する必要はありません。CIrabbitmqサーバーである新しいサーバーを起動できます。自分で作成できない場合は、 CloudAMQP を調べてください。今日の無料枠では、1か月に100万メッセージ、20同時接続、100キュー、10,000キューメッセージが提供されます。 CIプロセスには十分かもしれません。

  2. テストがRabbitMQの単体テストのみで行われている場合は、RabbitMQメッセージ生成を模擬できます。これは、単体テストの一部で行うことです。特定の操作がメソッドを呼び出して特定のメッセージを生成することを確認するだけですが、これをモックアウトして実際にメッセージを公開しないようにします。次に、作成した特定のメッセージを使用してコンシューマーメソッドを明示的に呼び出すことにより、各コンシューマーをテストします。

3
Ian Dallas

Apache QPid Java broker を試すことができます。これは組み込みブローカーとして使用できます。

Scalaは別のセクションで説明されていますSO質問- スタンドアロンApache Qpid(amqp)Junitテストの例

2
Arnost Valicek