【问题标题】:Quarkus IBM MQ extensionQuarkus IBM MQ 扩展
【发布时间】:2020-07-08 04:08:40
【问题描述】:

我正在尝试使用 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;
        }
    }
}

在这种情况下,我永远不会得到消息变量的打印。任何人都可以帮忙吗?我想我在扩展中遗漏了一些东西,但我不知道可能是什么。

【问题讨论】:

    标签: jms ibm-mq quarkus


    【解决方案1】:

    当您必须连接到经典 IBM MQ 通道时,AMQP 将不起作用。在这种情况下,您必须使用 com.ibm.mq.allclient jar。尽管有自省和线程生成,但仍可以在 Quarkus 原生映像中使用 com.ibm.mq.allclient。您将需要以下 quarkus.native.additional-build-args

    -J-Dcom.ibm.mq.cfg.useIBMCipherMappings=false,\
    -J-Dcom.ibm.msg.client.commonservices.ffst.suppress=-1,\
    --initialize-at-run-time=org.apache.http.impl.auth.NTLMEngineImpl\,com.ibm.mq.jmqi.remote.impl.RemoteReconnectThread\,com.ibm.mq.jmqi.JmqiDefaultThreadPool\,com.ibm.msg.client.wmq.compat.jms.internal.MQJMSMessage\,com.ibm.msg.client.commonservices.workqueue.WorkQueueManager,\
    -H:ResourceConfigurationFiles=resources-config.json,\
    -H:ReflectionConfigurationFiles=reflection-config.json,\
    -H:+ReportUnsupportedElementsAtRuntime,\
    --report-unsupported-elements-at-runtime
    

    使用非 IBM JDK 时需要第一个系统属性。
    我添加了第二个系统属性以避免 FFDC 日志记录; (它将尝试写入本地文件系统)。 第一类提到 initialize-at-run-time 的东西是因为使用了 SecureRandom。
    其余部分用于 WorkQueueManager 的两个类加载路径。 WorkQueueManager 本身是必需的,因为它在运行时生成线程。

    关于反射,您必须为类定义一个反射配置.json

    1. com.ibm.msg.client.jms.internal.JmsFactoryFactoryImpl
    2. com.ibm.mq.jmqi.remote.api.RemoteFAP
    3. com.sun.security.cert.internal.x509.X509V1CertImpl

    在连接到 MQ 通道时使用 SSL/TLS 时需要最后一个类。

    {"pattern": ".+properties$"} 还需要 resources-config.json,因为 IBM MQ 代码使用 ResourceBundles 和许多属性文件来获取错误消息。

    使用 SSL/TLS 时,您必须在 JmsConnectionFactory 上显式设置 SSLSocketfactory:

    connectionFactory.setObjectProperty("XMSC_WMQ_SSL_SOCKET_FACTORY", sslSocketFactory);
    

    根据您配置 JmsConnectionFactory 的方式和 com.ibm.mq.allclient jar 的版本,您可能会在“XMSC_WMQ_HOST_NAME”配置中遇到错误。这些错误是 IBM 代码中的错误,与本机映像无关。

    【讨论】:

      【解决方案2】:

      这种方法行不通,因为 MQ JMS 客户端使用动态加载和自省来实例化适当的实现类。这些类被排除在本机运行时之外。你可以在 Quarkus JVM 上运行,但是原生是个问题。

      另一种方法是使用其中一个 Qpid JMS AMQP 客户端 - https://quarkus.io/guides/jms,但您需要确保在 MQ 服务器中打开 AMQP 协议。

      【讨论】:

      • 所以即使我创建了一个自定义扩展,这也不起作用?因为我确实需要使用 ibm mq 作为 MQ
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多