ClassCastException:将IBM MQ配置为Flume JMS源时,无法将javax.naming.Reference强制转换为javax.jms.ConnectionFactory。

时间:2019-03-20 14:13:31

标签: java jms ibm-mq flume-ng

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

由于没有官方文档,因此我遵循了这些资源(尽管它们来自较早的版本):

我这样进行:

  1. 安装了MQ 9.1.1.0客户端并配置了JMSAdmin.conf

    • INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory PROVIDER_URL=file:/C:/temp/jmsbindings SECURITY_AUTHENTICATION=none
  2. 创建了.bindings文件:

    • DEF CF(flumeConnectionFactory)QMGR(myQueueManager)HOSTNAME(myHostName)PORT(1414)CHANNEL(myChannelName)TRANSPORT(CLIENT)
  3. 提取了Java客户端(它既可以从Windows客户端中以jar的组形式使用,也可以从IBM支持门户网站以单个uberjar的形式使用)。我尝试了两条路径,但是,现在我提取了这些单个罐子:
    • 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
    • providerutil.jar
  4. 在水槽主机上加载了jar和.bindings文件
  5. 准备此源配置:
  

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 =队列

当我最终启动Flume代理时,出现此错误:

  

java.lang.ClassCastException:javax.naming.Reference无法转换为javax.jms.ConnectionFactory

接着是这个小的Stacktrace

  

由于配置期间发生错误,源amq_ibm已被删除   java.lang.ClassCastException:无法将javax.naming.Reference强制转换为javax.jms.ConnectionFactory       在org.apache.flume.source.jms.JMSSource.doConfigure(JMSSource.java:231)       在org.apache.flume.source.BasicSourceSemantics.configure(BasicSourceSemantics.java:65)       在org.apache.flume.source.AbstractPollableSource.configure(AbstractPollableSource.java:65)       在org.apache.flume.conf.Configurables.configure(Configurables.java:41)       在org.apache.flume.node.AbstractConfigurationProvider.loadSources(AbstractConfigurationProvider.java:326)       在org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:101)       在org.apache.flume.node.PollingPropertiesFileConfigurationProvider $ FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:141)       在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)       在java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)       在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:180)       在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       在java.lang.Thread.run(Thread.java:745)

检查Flume来源,以下是爆炸线

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

我试图遵循这个古老的相关问题

但是,由于要从IBM mq v8升级到jms2.0,因此不再建议加载某些jar:

我开始怀疑Flume 1.6中有什么不喜欢JMS2.0

有帮助吗?谢谢

1 个答案:

答案 0 :(得分:0)

我不是专家,但是:

test_IBM_MQ.sources.amq_ibm.connectionFactory=flumeConnectionFactory 

我认为该参数需要QueueConnectionFactory(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