Пример автономного теста Apache Qpid (amqp) Junit
Есть ли у кого-нибудь пример использования Apache Qpid в тесте junit автономно.
В идеале я хочу иметь возможность создавать очередь на лету, которую я могу поставить/получить msgs в моем тесте.
Поэтому я не тестирую QPid в своем тесте, я буду использовать для этого тесты интеграции, однако очень полезно тестировать методы, обрабатывающие msgs с необходимостью израсходовать загрузку сервисов.
Ответы
Ответ 1
Вот метод установки, который я использую для QPID 0.30 (я использую это в тесте Spock, но не должен быть переносимым на Java Junit без проблем). Это поддерживает SSL-соединение, управление HTTP и использует только запуск в памяти. Время запуска - подсечка. Конфигурация для QPID неудобна по сравнению с использованием ActiveMQ с той же целью, но QPID является совместимым с AMQP и позволяет проводить плавное, нейтральное тестирование для клиентов AMQP (очевидно, использование обменов не может имитировать реализацию RabbitMQs, но для основных целей это достаточно)
Сначала я создал минимальный test-config.json, который я вложил в папку ресурсов:
{
"name": "${broker.name}",
"modelVersion": "2.0",
"defaultVirtualHost" : "default",
"authenticationproviders" : [ {
"name" : "passwordFile",
"type" : "PlainPasswordFile",
"path" : "${qpid.home_dir}${file.separator}etc${file.separator}passwd",
"preferencesproviders" : [{
"name": "fileSystemPreferences",
"type": "FileSystemPreferences",
"path" : "${qpid.work_dir}${file.separator}user.preferences.json"
}]
} ],
"ports" : [ {
"name" : "AMQP",
"port" : "${qpid.amqp_port}",
"authenticationProvider" : "passwordFile",
"keyStore" : "default",
"protocols": ["AMQP_0_10", "AMQP_0_8", "AMQP_0_9", "AMQP_0_9_1" ],
"transports" : [ "SSL" ]
}, {
"name" : "HTTP",
"port" : "${qpid.http_port}",
"authenticationProvider" : "passwordFile",
"protocols" : [ "HTTP" ]
}],
"virtualhostnodes" : [ {
"name" : "default",
"type" : "JSON",
"virtualHostInitialConfiguration" : "{ \"type\" : \"Memory\" }"
} ],
"plugins" : [ {
"type" : "MANAGEMENT-HTTP",
"name" : "httpManagement"
}],
"keystores" : [ {
"name" : "default",
"password" : "password",
"path": "${qpid.home_dir}${file.separator}keystore.jks"
}]
}
Я
Мне также нужно было создать файл keystore.jks для localhost, потому что брокер QPID и клиент RabbitMQ не любят общаться по незашифрованному каналу. Я также добавил файл с именем "passwd" в "integTest/resources/etc", который имеет этот контент:
гость: пароль
Вот код из unit test setup:
переменные уровня класса:
def tmpFolder = Files.createTempDir()
Broker broker
def amqpPort = PortFinder.findFreePort()
def httpPort = PortFinder.findFreePort()
def qpidHomeDir = 'src/integTest/resources/'
def configFileName = "/test-config.json"
код для метода setup():
def setup() {
broker = new Broker();
def brokerOptions = new BrokerOptions()
File file = new File(qpidHomeDir)
String homePath = file.getAbsolutePath();
log.info(' qpid home dir=' + homePath)
log.info(' qpid work dir=' + tmpFolder.absolutePath)
brokerOptions.setConfigProperty('qpid.work_dir', tmpFolder.absolutePath);
brokerOptions.setConfigProperty('qpid.amqp_port',"${amqpPort}")
brokerOptions.setConfigProperty('qpid.http_port', "${httpPort}")
brokerOptions.setConfigProperty('qpid.home_dir', homePath);
brokerOptions.setInitialConfigurationLocation(homePath + configFileName)
broker.startup(brokerOptions)
log.info('broker started')
}
код для очистки()
broker.shutdown()
Чтобы выполнить соединение AMQP с клиентом MQ Rabbit:
ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://guest:[email protected]:${amqpPort}");
factory.useSslProtocol()
log.info('about to make connection')
def connection = factory.newConnection();
//get a channel for sending the "kickoff" message
def channel = connection.createChannel();
Ответ 2
В проекте Qpid есть ряд тестов, которые используют встроенный брокер для тестирования. Несмотря на то, что мы используем базовый код для запуска запуска, вы можете сделать следующее, чтобы просто интегрировать брокера в свои тесты:
public void setUp()
{
int port=1;
// Config is actually a Configuaration File App Registry object, or Configuration Application Registry.
ApplicationRegistry.initialise(config, port);
TransportConnection.createVMBroker(port);
}
public void test()
{...}
public void tearDown()
{
TransportConnection.killVMBroker(port);
ApplicationRegistry.remove(port);
}
Затем для соединения вам нужно указать conectionURL для брокера. то есть borkerlist = 'vm://1'
Ответ 3
Лучшее, что я мог понять:
PropertiesConfiguration properties = new PropertiesConfiguration();
properties.addProperty("virtualhosts.virtualhost.name", "test");
properties.addProperty("security.principal-databases.principal-database.name", "testPasswordFile");
properties.addProperty("security.principal-databases.principal-database.class", "org.apache.qpid.server.security.auth.database.PropertiesPrincipalDatabase");
ServerConfiguration config = new ServerConfiguration(properties);
ApplicationRegistry.initialise(new ApplicationRegistry(config) {
@Override
protected void createDatabaseManager(ServerConfiguration configuration) throws Exception {
Properties users = new Properties();
users.put("guest","guest");
users.put("admin","admin");
_databaseManager = new PropertiesPrincipalDatabaseManager("testPasswordFile", users);
}
});
TransportConnection.createVMBroker(ApplicationRegistry.DEFAULT_INSTANCE);
С URL-адресом:
amqp://admin:[email protected]/test?brokerlist='vm://:1?sasl_mechs='PLAIN''
Большая боль связана с настройкой и авторизацией. Милирование может меняться.
Ответ 4
Мое решение на qpid-broker @6.1.1, добавьте ниже к pom.xml
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-broker</artifactId>
<version>6.1.1</version>
<scope>test</scope>
</dependency>
qpid конфигурационный файл:
{
"name" : "${broker.name}",
"modelVersion" : "6.1",
"defaultVirtualHost" : "default",
"authenticationproviders" : [ {
"name" : "anonymous",
"type" : "Anonymous"
} ],
"ports" : [ {
"name" : "AMQP",
"port" : "${qpid.amqp_port}",
"authenticationProvider" : "anonymous",
"virtualhostaliases" : [ {
"name" : "defaultAlias",
"type" : "defaultAlias"
} ]
} ],
"virtualhostnodes" : [ {
"name" : "default",
"type" : "JSON",
"defaultVirtualHostNode" : "true",
"virtualHostInitialConfiguration" : "{ \"type\" : \"Memory\" }"
} ]
}
для запуска qpid-сервера
Broker broker = new Broker();
BrokerOptions brokerOptions = new BrokerOptions();
// I use fix port number
brokerOptions.setConfigProperty("qpid.amqp_port", "20179");
brokerOptions.setConfigurationStoreType("Memory");
// work_dir for qpid log, configs, persist data
System.setProperty("qpid.work_dir", "/tmp/qpidworktmp");
// init config of qpid. Relative path for classloader resource or absolute path for non-resource
System.setProperty("qpid.initialConfigurationLocation", "qpid/qpid-config.json");
brokerOptions.setStartupLoggedToSystemOut(false);
broker.startup(brokerOptions);
для остановки qpid сервера
broker.shutdown();
Поскольку я использую режим anonymouse, клиент должен делать следующее:
SaslConfig saslConfig = new SaslConfig() {
public SaslMechanism getSaslMechanism(String[] mechanisms) {
return new SaslMechanism() {
public String getName() {
return "ANONYMOUS";
}
public LongString handleChallenge(LongString challenge, String username, String password) {
return LongStringHelper.asLongString("");
}
};
}
};
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(20179);
factory.setSaslConfig(saslConfig);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
Это все.
Немного больше о том, как это сделать в другой версии.
Вы можете загружать двоичный пакет qpid-broker с официального сайта. После загрузки и распаковки вы можете запустить его, чтобы протестировать его на сервере. После того, как ваш сервер подключен хорошо, используя командную строку для генерации или просто скопируйте исходный файл конфигурации в QPID_WORK, удалите ненужный идентификатор и используйте его для встроенного сервера, как указано выше.
Самая сложная вещь - аутентификация. Вы можете выбрать режим PLAIN, но вы должны добавить имя пользователя и пароль в первоначальную конфигурацию. Я выбираю анонимный режим, который требует небольшого кода при подключении. Для другого режима проверки подлинности вы указываете файл пароля или хранилище ключей/сертификатов, которое я не пробовал.
Если он все еще не работает, вы можете прочитать код dpid-borker и код основного класса в артефакте qpid-broker, который показывает, как работает командная строка для каждого параметра.