我正在寻找将Quarkus(仅CDI而没有EJB)与IBM MQ集成的解决方案。有人有这样的问题吗?或有任何想法。
我用于连接的参数:
我知道我可以像在独立应用程序中那样,以bean的形式创建自己的连接工厂,然后再建立一组消费者。这实际上是我的替代解决方案。但是,也许有更好或更“漂亮”的解决方案。也许像骆驼这样的库允许这样的配置?我找不到这样的配置示例
当前,用于MQ的标准Java编程接口是JMS。您可以通过将以下内容添加到您的maven pom.xml中,将MQ JMS客户端作为对项目的依赖关系来引入:
<!-- 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>
这将使您能够使用JMSFactoryFactory类在应用程序内以编程方式创建JMS ConnectionFactory,如下所述:
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对象(还需要定义该属性以包含要在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;
}