【问题标题】:Specifying java.naming.provider.url for an inbound endpoint configuration in jndi.properties在 jndi.properties 中为入站端点配置指定 java.naming.provider.url
【发布时间】:2019-11-17 10:21:25
【问题描述】:

我有一个入站端点配置,我想在 jndi.properties 内指定 java.naming.provider.url 值,这将使我能够根据我拥有的不同环境的提供程序 URL 动态配置入站端点。

这是我的 ActiveMq 的axis2.xml 配置

<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
   <parameter name="myTopicConnectionFactory" locked="false">
       <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
       <parameter name="java.naming.provider.url" locked="false">failover:tcp://localhost:6092</parameter>
       <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
        <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
   </parameter>

   <parameter name="myQueueConnectionFactory" locked="false">
       <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
       <parameter name="java.naming.provider.url" locked="false">failover:tcp://localhost:6092</parameter>
       <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
        <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
   </parameter>

   <parameter name="default" locked="false">
       <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
       <parameter name="java.naming.provider.url" locked="false">failover:tcp://localhost:6092</parameter>
       <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
        <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
   </parameter>                                          
</transportReceiver>

这是我的入站端点配置:

<?xml version="1.0" encoding="UTF-8"?>
<inboundEndpoint name="inboundEP" onError="conf:sequences/om.esb/om.esb-faultSQ.xml" protocol="jms" sequence="inbEPSQ" suspend="false" xmlns="http://ws.apache.org/ns/synapse">
    <parameters>
        <parameter name="interval">1000</parameter>
        <parameter name="sequential">true</parameter>
        <parameter name="coordination">true</parameter>
        <parameter name="transport.jms.Destination">example_request</parameter>
        <parameter name="transport.jms.CacheLevel">3</parameter>
        <parameter name="transport.jms.ConnectionFactoryJNDIName">QueueConnectionFactory</parameter>
        <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
        <parameter name="java.naming.provider.url" locked="false">conf/jndi.properties</parameter> 
        <parameter name="transport.jms.SessionAcknowledgement">AUTO_ACKNOWLEDGE</parameter>
        <parameter name="transport.jms.SessionTransacted">false</parameter>
        <parameter name="transport.jms.ConnectionFactoryType">queue</parameter>
        <parameter name="transport.jms.ContentType">application/json</parameter>
        <parameter name="transport.jms.SharedSubscription">false</parameter>
    </parameters>
</inboundEndpoint>

在 jndi.properties 文件中,我尝试以这种方式指定java.naming.provider.url

# register some connection factories
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5675'
connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5675'


java.naming.provider.url=failover:tcp://localhost:6092
# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue

# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic

但在 WSO2 控制台中,出现以下错误:

Could not create Transport. Reason: java.io.IOException: Transport not scheme specified: [conf/jndi.properties]

感谢您的任何想法!

【问题讨论】:

    标签: wso2 jms activemq wso2esb


    【解决方案1】:

    顾名思义,'java.naming.provider.url' 应该是一个 URL,所以是以 '(protocol)://' 开头的东西

    由于 tcp://localhost:6092 在您的其他配置中为您工作,请尝试以下操作:

    <parameter name="java.naming.provider.url" locked="false">tcp://localhost:6092</parameter> 
    

    在 JNDI 中发生的事情是首先创建您的“java.naming.factory.initial”类(在您的情况下为 org.apache.activemq.jndi.ActiveMQInitialContextFactory),然后您可以使用任何支持的提供程序 url通过这堂课。根据您的提供商,它可以支持不同的 URL 类型(tcp:、file:、ssl:、...)。 ActiveMQ 支持 vm: 和 tcp: - 指定 tcp 时:它将使用来自该代理的 TCP 加载此 JNDI 配置。

    【讨论】:

    • 你好,这种方式我没有问题,但是java.naming.provider.url的值会根据环境不同。因此,我需要为入站配置使用动态结构。我尝试从治理文件夹 ($registry:gov:/javaNamingProviderURL) 中的文件读取 java.naming.provider.url 值,但在入站端点配置中看不到文件内部的 url。在 WSO2 控制台中,我只看到 java.naming.provider.url 值中的文件路径。
    • 您可以做的是使用基于文件的 JNDI 实现:将 java.naming.factory.initial 设置为 "com.sun.jndi.fscontext.RefFSContextFactory" 并将 java.naming.provider.url 设置为为“file://conf/jndi.properties” - 参见例如docs.oracle.com/cd/E19575-01/820-6767/aeqbb/index.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2013-10-10
    相关资源
    最近更新 更多