【问题标题】:MQSeries error com.ibm.mq.jmqi.CustomCharsetProvider not a subtypeMQSeries 错误 com.ibm.mq.jmqi.CustomCharsetProvider 不是子类型
【发布时间】:2020-10-07 21:39:01
【问题描述】:

我有一个在 Windows 上运行的现有 java 批处理进程,它写入 MQSeries 队列。 在 v7 中工作正常,但使用 v8.0.0.3 失败。

使用这些 jar 文件: com.ibm.mq.allclient-8.0.0.3.jar javax.jms-api-2.0.1.jar 尝试同时运行 allclient jar,但反复出现此错误:

Exception in thread "main" java.util.ServiceConfigurationError: java.nio.charset.spi.CharsetProvider: Provider com.ibm.mq.jmqi.CustomCharsetProvider not a subtype
               at java.util.ServiceLoader.fail(ServiceLoader.java:239)
               at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
               at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
               at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
               at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
               at java.nio.charset.Charset$1.getNext(Charset.java:352)
               at java.nio.charset.Charset$1.hasNext(Charset.java:365)
               at java.nio.charset.Charset$2.run(Charset.java:410)
               at java.nio.charset.Charset$2.run(Charset.java:407)
               at java.security.AccessController.doPrivileged(Native Method)
               at java.nio.charset.Charset.lookupViaProviders(Charset.java:406)
               at java.nio.charset.Charset.lookup2(Charset.java:477)
               at java.nio.charset.Charset.lookup(Charset.java:464)
               at java.nio.charset.Charset.forName(Charset.java:528)
               at com.ibm.mq.jmqi.system.JmqiCodepage$JmqiCodepageFactory.initializeCodepage(JmqiCodepage.java:194)
               at com.ibm.mq.jmqi.system.JmqiCodepage$JmqiCodepageFactory.getByName(JmqiCodepage.java:181)
               at com.ibm.mq.jmqi.system.JmqiCodepage.getJmqiCodepage(JmqiCodepage.java:661)
               at com.ibm.mq.jmqi.system.JmqiCodepage.getJmqiCodepage(JmqiCodepage.java:637)
               at com.ibm.mq.jmqi.JmqiEnvironment.getJmqiCodepage(JmqiEnvironment.java:294)
               at com.ibm.mq.jmqi.JmqiEnvironment.lookupDefaultCharset(JmqiEnvironment.java:361)
               at com.ibm.mq.jmqi.JmqiEnvironment.<init>(JmqiEnvironment.java:262)
               at com.ibm.mq.jmqi.system.JmqiSystemEnvironment.<init>(JmqiSystemEnvironment.java:76)
               at com.ibm.mq.jmqi.JmqiFactory.getInstance(JmqiFactory.java:122)
               at com.ibm.mq.internal.MQCommonServices.<clinit>(MQCommonServices.java:146)
               at com.ibm.mq.MQSESSION.getJmqiEnv(MQSESSION.java:141)
               at com.ibm.mq.MQSimpleConnectionManager.<init>(MQSimpleConnectionManager.java:95)
               at com.ibm.mq.MQEnvironment.<clinit>(MQEnvironment.java:569)

我的代码调用了 MQenvironment

【问题讨论】:

  • 确保 CLASSPATH 中没有其他 MQ 版本的任何其他 MQ jar 文件。

标签: ibm-mq


【解决方案1】:

当存在由相同类组成的冲突 MQ jar 时,通常会发生这种情况。在运行应用程序之前,您必须删除不必要的 mq jars

【讨论】:

    【解决方案2】:

    使用嵌入在 MQClient 中的 java 版本执行。

    【讨论】:

      【解决方案3】:

      问题在于,对于您配置的 CCSID(代码页),字符集未正确解析,使用了 CustomCharsetProvider 但未实现正确的接口,我认为这是 IBM 错误)。

      你有两个选择来解决它:

      1. 在您所在的代码中将不同的 CCSID(例如将 UTF-8 的 1208)作为 MQConstants.CCSID_PROPERTY 传递 创建 MQQueueManager 作为 HashMap 属性传递

      2. 或在 MQ 服务器配置中更改 CCSID(例如输入 1208,即 UTF-8)

      【讨论】:

      • OP 自己回答说他们使用 IBM 提供的 Java 来解决这个问题,您为什么认为这是 CCSID 问题?
      • 问题是 Charset 没有找到所以也许 IBM java 有它。但是,如果您出于某种原因不想使用 IBM java,则必须更改 CCSID。我们遇到了同样的问题,当我们将 CCSID 更改为 1208 (UTF-8) 时 - 一切都开始正常工作了。
      • 感谢您提供的信息。我猜Provider com.ibm.mq.jmqi.CustomCharsetProvider not a subtype at java.util.ServiceLoader.fail(ServiceLoader.java:239) 是什么告诉你它是一个缺失的字符集?
      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 2021-10-20
      • 2021-03-17
      • 1970-01-01
      • 2022-07-10
      • 2022-09-27
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多