ClassCastException:将IBM MQ配置为Flume JMS源时,无法将javax.nam.Conction转换为javax.jms.ConnectionFactory

问题描述 投票:0回答:1

我正在尝试将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 Support Portal的单个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. 在我的水槽主机上加载了罐子和.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 = QUEUE

当我最终启动我的Flume代理时,我收到此错误:

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

接下来是这个小Stacktrace

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

检查Flume源,爆炸线如下

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

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

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

我开始怀疑是否有一些不喜欢JMS2.0的Flume 1.6

有帮助吗?谢谢

java jms ibm-mq flume-ng
1个回答
0
投票

我不是专家但是:

test_IBM_MQ.sources.amq_ibm.connectionFactory=flumeConnectionFactory 

我相信该参数期待QueueConnectionFactory(QCF)。

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

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

此外,MQ JNDI(“。binddings”)文件所在的位置是?

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

基于您上面提到的“PROVIDER_URL”参数,我认为它应该是:

test_IBM_MQ.sources.amq_ibm.providerURL = file:/C:/temp/jmsbindings
© www.soinside.com 2019 - 2024. All rights reserved.