【发布时间】:2019-03-20 14:13:31
【问题描述】:
我正在尝试配置 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
我是这样处理的:
-
安装 MQ 9.1.1.0 客户端并配置 JMSAdmin.conf
INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory PROVIDER_URL=file:/C:/temp/jmsbindings SECURITY_AUTHENTICATION=none
-
创建了 .bindings 文件:
- DEF CF(flumeConnectionFactory) QMGR(myQueueManager) HOSTNAME(myHostName) PORT(1414) CHANNEL(myChannelName) TRANSPORT(CLIENT)
- 提取了 java 客户端(它既可以作为来自 Windows 客户端的 jar 组,也可以作为来自 IBM Support Portal 的单个 uberjar)。我尝试了两种路径,但是,现在我提取了这些单个 jar:
- 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
- 在我的 Flume 主机上加载了 jars 和 .bindings 文件
- 已准备好此源配置:
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
由于配置过程中的错误,源 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
有什么帮助吗?谢谢
【问题讨论】: