我正在使用Apache camel将Weblogic JMS桥接到Kafka。对于weblogic JMS,我使用JDNI连接到主题以获取主题名称。当我检查从我的上下文查找返回的对象时,我看到我有主题名称
我正在设置这样的连接(这只是一个概念证明)
(defn topic-con-factory
[]
(let [props (Properties.)]
(.put props "java.naming.factory.initial" "weblogic.jndi.WLInitialContextFactory")
(.put props "java.naming.provider.url" (:host wl-ctx))
(.put props "java.naming.security.principal" (:username wl-ctx))
(.put props "java.naming.security.credentials" (:password wl-ctx))
(.put props "weblogic.jndi.createIntermediateContexts" "true")
;;please ignore my horrible horrible abuse of let here
(let [ctx (InitialContext. props)
conn-factory (.lookup ctx (:factoryJNDI wl-ctx))
wlcontext (DefaultCamelContext. ctx)
topic (.lookup ctx (:topicJNDI wl-ctx))
]
[conn-factory topic])))
(defn build-jms-component
[factory]
(let [jms (JmsComponent.)]
(.setConnectionFactory jms factory)
(.setClientId jms (:clientId wl-ctx))
(.setDurableSubscriptionName jms (:subName wl-ctx))
jms))
(defn camel-context []
(let [[factory topic] (topic-con-factory)
ctx (camel/make-context)]
(println "topic " topic "!!!!!!!!")
(.addComponent ctx "jms" (build-jms-component factory))
(camel/defroute ctx
:err-handler (camel/default-error-handler)
(camel/from (str "jms:topic:" (.getTopicName topic)))
(camel/to kafka-urn))
ctx))
wl-ctx绑定是我的各种值的哈希映射。当我尝试运行camel-context时出现错误
2017年2月1日下午6:11:09 org.apache.camel.component.jms.DefaultJmsMessageListenerContainer handleListenerSetupFailure警告:JMS消息侦听器的设置 调用者失败的目的地'CENX-WL-JMS!testTopic' - 试图 恢复。原因:[JMSExceptions:045101]传递给的目标名称 createTopic或createQueue“MY-WL-SERVER!testTopic”无效。如果 目标名称不包含“/”字符,那么它必须是 群集中可用的分布式目标的名称 客户所附的。如果它确实包含“/”字符, 那么“/”之前的字符串必须是JMS服务器的名称或 “”。 “/”后面的字符串是所需的名称 目的地。如果使用字符串的“./”版本,那么任何 在本地WebLogic Server实例上具有给定名称的目标 将被退回。
从消息看来,我需要使用“/”作为服务器名称和主题名称之间的分隔符。但如果我使用它而不是爆炸,主题查找失败。
有没有办法重新配置我的JmsComponent接受!作为分隔符而不是/?
答案 0 :(得分:0)
发生错误,JMS模块名称与服务器名称非常相似。在这种情况下,实际的主题名称应该是
MY_JMS_SERVER / MY_MODULE!MY_TOPIC
这样做
(camel/from (str "jms:topic:" (str my-server "/" (.getTopicName topic)))
解决了这个问题。