Расширение Quarkus IBM MQ - PullRequest
       20

Расширение Quarkus IBM MQ

2 голосов
/ 27 марта 2020

Я пытаюсь создать расширение, используя quarkus, чтобы использовать ibm mq как для собственного исполняемого файла. До сих пор я создал (в модуле времени выполнения) производителя ConnectionFactory:

@ApplicationScoped
public class ConnectionFactoryProducer {

    @Produces
    @ApplicationScoped
    @DefaultBean
    public JmsConnectionFactory connectionFactory() throws JMSException {

        JmsFactoryFactory ff;
        JmsConnectionFactory factory;
        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);
        factory.setStringProperty(CommonConstants.WMQ_HOST_NAME, "localhost");
        factory.setIntProperty(CommonConstants.WMQ_PORT, 1414);
        factory.setStringProperty(CommonConstants.WMQ_CHANNEL, "DEV.ADMIN.SVRCONN");
        factory.setStringProperty(CommonConstants.WMQ_QUEUE_MANAGER, "QM1");
        factory.setStringProperty(WMQConstants.USERID, "admin");
        factory.setStringProperty(WMQConstants.PASSWORD, "passw0rd");
        return factory;
    }

}

Модуль развертывания содержит процессор:

public final class IbmExtProcessor {

    private static final String FEATURE = "ibm-ext";

    @BuildStep
    FeatureBuildItem feature() {
        return new FeatureBuildItem(FEATURE);
    }

}

Где FEATURE - имя расширения.

Но когда я пытаюсь выполнить код, используя расширение, импортируя его как зависимость в моем проекте, ничего не происходит. Похоже, что классы, которые используют зависимость, больше не находятся в контексте приложения. Пример производителя сообщения:

public class NumberProducer implements Runnable {

    private final Random random = new Random();
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    @Inject
    private ConnectionFactoryProducer cf;
    private ConnectionFactory c;



    void onStart(@Observes StartupEvent ev) throws JMSException {
        c=cf.connectionFactory();
        scheduler.scheduleWithFixedDelay(this, 0L, 1L, TimeUnit.SECONDS);
    }

    void onStop(@Observes ShutdownEvent ev) {
        scheduler.shutdown();
    }

    @Override
    public void run() {
        JMSContext context = c.createContext();
        Queue destination=context.createQueue("queue:///DEV.QUEUE.1");
        try {
            TextMessage message = context.createTextMessage(String.format("Value : %d", random.nextInt(100)));
            JMSProducer producer = context.createProducer();
            producer.send(destination, message);
            System.out.println(message);
        } catch (Exception e) {
            throw e;
        }
    }
}

В этом случае я никогда не получу печать переменной сообщения. Кто-нибудь может помочь? Я думаю, что что-то упустил в расширении, но я не могу понять, что может быть.

1 Ответ

1 голос
/ 27 марта 2020

Этот подход не будет работать, потому что клиент MQ JMS использует динамическую c загрузку и самоанализ для создания экземпляров соответствующих классов реализации. Эти классы исключаются из собственной среды выполнения. Вы можете запустить на Quarkus JVM, но нативная проблема.

Альтернативой является использование одного из клиентов Qpid JMS AMQP - https://quarkus.io/guides/jms, но вам необходимо убедиться, что на вашем сервере MQ включен протокол AMQP.

...