【问题标题】:Problem connecting to Azure service bus using apache qpid-client使用 apache qpid-client 连接到 Azure 服务总线的问题
【发布时间】:2019-12-10 21:00:56
【问题描述】:

我是 Azure 服务总线和 apache qpid 的新手。我正在尝试使用 Tomcat context.xml 中的 AMPConnectionFactory 连接 Azure 服务总线,如 https://qpid.apache.org/releases/qpid-jms-amqp-0-x-6.3.4/jms-amqp-0-8-book/JMS-Client-0-8-Appendix-Tomcat-JNDI-Integration.html 中所述,并配置 JMS 对等缓存复制

pom.xml

 <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-jms-client</artifactId>
            <version>0.47.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-client</artifactId>
            <version>6.3.4</version>
        </dependency>

Tomcat 上下文.xml

    <Resource name="testConnectionFactory" auth="Container"
            type="org.apache.qpid.client.AMQConnectionFactory"
            factory="org.apache.qpid.jndi.ObjectFactory"
            connectionURL="amqp://rootmanagesharedaccesskey:*********=/? 
           brokerlist='servicebusurl:5672'"/>
   <Resource name="myqueue" auth="Container"
            type="org.apache.qpid.client.AMQQueue"
            factory="org.apache.qpid.jndi.ObjectFactory"
             address="BURL:direct://amq.direct//myqueue?durable='true'"/>`
    <Resource name="mytopic" auth="Container"
            type="org.apache.qpid.client.AMQTopic"
            factory="org.apache.qpid.client.AMQConnectionFactory"
            address="BURL:topic://amq.topic//mytopic?routingkey='mytopic'"/>

ehcache.xml

<cacheManagerPeerProviderFactory
    class="className extending JMSCacheManagerPeerProviderFactory"
    properties="initialContextFactoryName=org.apache.qpid.jms.jndi.JmsInitialContextFactory,
        replicationTopicConnectionFactoryBindingName=java:comp/env/testConnectionFactory,
        replicationTopicBindingName=java:comp/env/mytopic,
        getQueueConnectionFactoryBindingName=java:comp/env/testConnectionFactory,
        getQueueBindingName=java:comp/env/myqueue"
    propertySeparator="," />

扩展 JMSCacheManagerPeerProviderFactory 的类名包含以下代码 sn-p。我不能发布完整的课程,因为它违反了政策

TopicConnectionFactory topicConnectionFactory;
topicConnectionFactory = (TopicConnectionFactory) context.lookup(replicationTopicConnectionFactoryBindingName);
replicationTopicConnection = topicConnectionFactory.createTopicConnection("username","password");

上面的代码行抛出异常。 我是否缺少任何 jar 或不正确的版本? 当我调试时,与 azure 服务命名空间的套接字连接正在启用,但在等待以下异常后关闭。请指教

    Caused by: net.sf.ehcache.CacheException: Problem creating connections: Error creating connection: Protocol: 0.0 is required by the broker but is not currently supported by this client library implementation
    at com.distribution.jms.TestCacheManagerPeerProviderFactory.createCachePeerProvider(TestCacheManagerPeerProviderFactory.java:120)
    at net.sf.ehcache.config.ConfigurationHelper.createCachePeerProviders(ConfigurationHelper.java:136)
    at net.sf.ehcache.CacheManager.configure(CacheManager.java:795)
    at net.sf.ehcache.CacheManager.doInit(CacheManager.java:471)
    at net.sf.ehcache.CacheManager.init(CacheManager.java:395)
    at net.sf.ehcache.CacheManager.<init>(CacheManager.java:270)
    at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:1116)
    at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:1092)
    at net.sf.ehcache.CacheManager.create(CacheManager.java:1075)
    at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:139)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
    ... 109 more
Caused by: javax.jms.JMSException: Error creating connection: Protocol: 0.0 is required by the broker but is not currently supported by this client library implementation
    at org.apache.qpid.client.AMQConnectionFactory.createConnection(AMQConnectionFactory.java:168)
    at org.apache.qpid.client.AMQConnectionFactory.createConnection(AMQConnectionFactory.java:143)
    at org.apache.qpid.client.AMQConnectionFactory.createTopicConnection(AMQConnectionFactory.java:195)
    at com.wwglobal.wits.distribution.jms.WITSJMSCacheManagerPeerProviderFactory.createCachePeerProvider(WITSJMSCacheManagerPeerProviderFactory.java:116)
    ... 120 more
Caused by: org.apache.qpid.AMQProtocolException: Protocol: 0.0 is required by the broker but is not currently supported by this client library implementation [error code: 543(client unsupported protocol)]
    at org.apache.qpid.client.AMQConnection.initDelegate(AMQConnection.java:715)
    at org.apache.qpid.client.AMQConnection.makeConnection(AMQConnection.java:600)
    at org.apache.qpid.client.AMQConnection.<init>(AMQConnection.java:522)
    at org.apache.qpid.client.AMQConnectionFactory.createConnection(AMQConnectionFactory.java:164)
    ... 123 more
Caused by: java.lang.ClassNotFoundException: org.apache.qpid.client.AMQConnectionDelegate_0_0
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1364)
    at org.apache.tomee.catalina.TomEEWebappClassLoader.loadClass(TomEEWebappClassLoader.java:208)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1185)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.apache.qpid.client.AMQConnection.initDelegate(AMQConnection.java:695)
    ... 126 more

【问题讨论】:

    标签: java tomcat8 ehcache azureservicebus qpid


    【解决方案1】:

    您的第一个问题是您的项目中包含两个不同的 AMQP JMS 客户端:

    这是一个基于 AMQP 1.0 的 AMQP 客户端,正在积极开发中,因为 AMQP 1.0 是 ISO 标准 AMQP 协议。

    <dependency>
        <groupId>org.apache.qpid</groupId>
        <artifactId>qpid-jms-client</artifactId>
        <version>0.47.0</version>
    </dependency>
    

    这是旧版 AMQP 0.x JMS 客户端,尚未积极开发,它会在出现严重问题时偶尔发布错误修复版本。

    <dependency>
        <groupId>org.apache.qpid</groupId>
        <artifactId>qpid-client</artifactId>
        <version>6.3.4</version>
    </dependency>
    

    因此,您需要从这两个中选择一个,并且由于您尝试使用 Azure,因此应该选择第一个,因为 Azure 是基于 AMQP 1.0 的消息传递系统。因此,您的第二个问题是您已将 tomcat 配置为使用旧客户端,而 Azure 不支持它可以说话的协议,因此您会收到错误消息。

    【讨论】:

    • 感谢蒂姆的回复。如果我删除 qpid-client 依赖项,如何在 Tomcat context.xml 中声明 qpid jndi 资源以进行连接。请指教
    • 我还尝试在 TestCacheManagerPeerProviderFactory 中使用 qpid-jms-client 依赖项创建主题和队列连接。在执行 'topicSubscriber = topicSubscriberSession.createSubscriber(replicationTopic, null, true);'异常原因:org.apache.qpid.jms.provider.ProviderException:链接“G5:2140578:qpid-jms:receiver:ID:58835be2-0395-4dca-bea3-44d33bbd40df:1:2:1:mytopic”包含过滤器类型无效。系统仅支持 Jms 或 Apache 选择器过滤器类型,但我们发现类型为 Microsoft。服务总线。消息传递。 Amqp。编码。与键 'no-local' 关联的 DescribedType'。
    • 听起来 Azure 不支持 JMS 消费者的 noLocal 选项
    • 感谢蒂姆的宝贵时间。 Azure 不支持使用 JMS API 的 ehcache 和 synamic 订阅者,因此此解决方案无效
    猜你喜欢
    • 2020-11-14
    • 2019-04-09
    • 2017-03-09
    • 2018-05-29
    • 2019-03-05
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多