当前位置: 首页 > 知识库问答 >
问题:

将IBM MQ配置为Flume JMS源时,不能将javax.naming.Reference转换为javax.jms.ConnectionFactory

李兴庆
2023-03-14

我正在尝试配置Flume(Cloudera CDH-5.11.0中的1.6)代理,以使用IBM WebSphere MQ 9.1.1.0作为源。

由于没有官方留档,我遵循了这些资源(尽管它们来自旧版本):

  • http://wpcertification.blogspot.com/2015/08/configure-flume-to-use-ibm-mq-as-jms.html
  • https://community.cloudera.com/t5/Data-Ingestion-Integration/Trying-to-integrate-ibm-mq-as-a-flume-source/td-p/5279

我以这种方式进行:

>

  • 安装MQ9.1.1.0客户端并配置JMSAdmin.conf

    • INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextWorksPROVIDER_URL=file:/C:/temp/jmsbindingsSECURITY_AUTHENTICATION=无

    创建了 .bindings 文件:

    • DEF CF(FlumeConntionWorks)QMGR(myQueueManager)主机名(myHostName)端口(1414)通道(myChannelName)传输(客户端)
    • com.ibm.mq。jar
    • com.ibm.mq.headers。jar
    • com.ibm.mq.jmqi。jar
    • com.ibm.mq.pcf。jar
    • com.ibm.mq.mqjms。jar
    • fcontext。jar
    • jms中。jar
    • 提供rutil.jar

    test_IBM_MQ.sources.amq_ibm.type = jms test_IBM_MQ.sources.amq_ibm.initialContextFactory = com.sun.jndi.fscontext.RefFSContextFactory test_IBM_MQ.sources.amq_ibm.connectionFactory=flumeConnectionFactory test_IBM_MQ.sources.amq_ibm.providerURL = file:///etc/flume/conf test_IBM_MQ.sources.amq_ibm.destinationName = myDestination test_IBM_MQ.sources.amq_ibm.destinationType = QUEUE

    当我最终启动我的Flume代理时,我得到了这个错误:

    Java . lang . classcastexception:javax . naming . reference不能转换为javax.jms.ConnectionFactory

    接着是这个小小的Stacktrace

    由于配置java.lang.ClassCastException:javax.naming.Reference无法强制转换为org.apache.flume.Source.jms.JMSSource.doConfigure(JMSSources.java:231)上的javax.jms.ConnectionFactory,org.apacche.flume.Source.BasicSourceSemantics.configure(BasicSourceSe曼tics.java:65),org.apache.flame.Source.AbstractPollableSource.configure(AbstractPollableSource.java:65)位于org.apache.flume.conf.Configurables.configure(Configurables.java:41),位于org.aapache.flume.node.AbstractConfigurationProvider.loadSources(Abstract配置提供程序.java:326),位于org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(pollingProperties FileConfiguration Provider.java:141),位于java.util.concurrent.Executors$RunnableAdapter.call(Executtors.java:511),位于java.util.concurrent_FutureTask.runAndReset(FutureTask.java:308),位于java。util.consurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180),位于java.util.concurrent.ScheduledThreadPool Executor$Scheduled FutureTask.run(SchededThreadPoOLExecuttor.java:294),位于java.util.concurrent。ThreadPooleExecutori.runWorker(ThreadPoulExecutory.java:1142),位于java

    检查水槽源,爆炸线如下

    connectionFactory = (ConnectionFactory) initialContext.lookup(connectionFactoryName);
    

    我试图回答这个古老的相关问题

    • ClassCastException:javax.naming。无法将引用强制转换为javax.jms.ConnectionFactory

    但是,建议加载的一些jar不再存在,因为从IBMmq v8升级到jms2.0:

      < Li > https://www . IBM . com/support/knowledge center/en/SSFKSJ _ 8 . 0 . 0/com . IBM . MQ . pro . doc/q 115920 _。htm

    我开始怀疑这是Flume 1.6不喜欢JMS2.0的地方

    有什么帮助吗?谢谢

  • 共有1个答案

    钦耀
    2023-03-14

    我不是专家但是:

    test_IBM_MQ.sources.amq_ibm.connectionFactory=flumeConnectionFactory 
    

    我相信该参数需要一个QueueConntionWorks(QCF)。

    删除“CF”并将QCF添加到MQ JDNI:

    DEF QCF(flumeConnectionFactory) QMGR(myQueueManager) HOSTNAME(myHostName) PORT(1414) CHANNEL(myChannelName) TRANSPORT(CLIENT)
    

    另外,MQ JNDI(“.bindings”)文件所在的位置是吗?

    test_IBM_MQ.sources.amq_ibm.providerURL = file:///etc/flume/conf 
    

    根据您上面提到的“PROVIDER_URL”参数,我认为应该是:

    test_IBM_MQ.sources.amq_ibm.providerURL = file:/C:/temp/jmsbindings
    
     类似资料: