Интеграция Quarkus IBM MQ - PullRequest
       13

Интеграция Quarkus IBM MQ

0 голосов
/ 17 февраля 2020

Я ищу решение для интеграции Quarkus (только CDI без EJB) с IBM MQ. У кого-нибудь есть такая проблема? или есть идеи.

Параметры, которые я использую для подключения:

  • хост
  • порт
  • канал
  • администратор очередей
  • имя очереди

Я знаю, что могу создать свою собственную фабрику соединений как бин, как в автономном приложении, а затем в пуле потребителей. Что на самом деле мое альтернативное решение. Но, может быть, есть лучшее или "красивее" решение. Может быть, библиотека вроде верблюда позволяет такую ​​конфигурацию? Я не смог найти такой пример конфигурации

1 Ответ

3 голосов
/ 18 февраля 2020

В настоящее время стандартным Java программным интерфейсом для MQ является JMS. Вы можете подключить MQ JMS-клиент в качестве зависимости к вашему проекту, добавив в свой maven pom следующее: xml:

    <!-- JMS API interfaces -->
    <dependency>
        <groupId>javax.jms</groupId>
        <artifactId>javax.jms-api</artifactId>
        <version>2.0.1</version>
    </dependency>

    <!-- MQ JMS client packages -->
    <dependency>
        <groupId>com.ibm.mq</groupId>
        <artifactId>com.ibm.mq.allclient</artifactId>
        <version>${mq.version}</version>
    </dependency>
</dependencies>

Это позволит вам программно создать JMS ConnectionFactory в вашем приложении, используя класс JMSFactoryFactory, как описано в:

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q032180_.htm

Это не позволяет вам использовать инъекцию, вам нужно объявить и создать свой ConnectionFactory в приложении сам по себе.

В Quarkus, чтобы иметь возможность внедрить объект ConnectionFactory в ваше приложение, вы можете написать собственное расширение. Подробнее о написании расширения можно узнать по адресу:

https://quarkus.io/guides/writing-extensions

Основное требование для этого - написать класс Producer во время выполнения вашего расширения. который создает объект JMSConnectionFactory с использованием свойств, определенных в объекте config (который также должен быть определен для хранения свойств, которые вы хотите установить в ConnectionFactory). Производителю потребуется метод, аналогичный:

@Produces
@ApplicationScoped
@DefaultBean
public ConnectionFactory connectionFactory() throws JMSException {
    JmsFactoryFactory ff;
    JmsConnectionFactory factory;
    try {
        // Get a new JMSConnectionFactory
        ff = JmsFactoryFactory.getInstance(JmsConstants.WMQ_PROVIDER);
        factory = ff.createConnectionFactory();
        // Always work in TCP/IP client mode
        factory.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT);
        // Now set the properties in this ConnectionFactory from the config.
        if (config.hostname.isPresent())
            factory.setStringProperty(CommonConstants.WMQ_HOST_NAME, config.hostname.get());
        if (config.port.isPresent())
            factory.setIntProperty(CommonConstants.WMQ_PORT, config.port.get());
        if (config.channel.isPresent())
            factory.setStringProperty(CommonConstants.WMQ_CHANNEL, config.channel.get());
        if (config.queuemanager.isPresent())
            factory.setStringProperty(CommonConstants.WMQ_QUEUE_MANAGER, config.queuemanager.get());
        }
    catch (JMSException je) {
        // Something went wrong. Either handle it here or throw it on.
        throw je;
    }
    return factory;
}
...