设置Apache Camel主题名称

时间:2017-02-01 23:26:55

标签: java clojure apache-camel jms weblogic

我正在使用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接受!作为分隔符而不是/?

1 个答案:

答案 0 :(得分:0)

发生错误,JMS模块名称与服务器名称非常相似。在这种情况下,实际的主题名称应该是

MY_JMS_SERVER / MY_MODULE!MY_TOPIC

这样做

(camel/from (str "jms:topic:" (str my-server "/" (.getTopicName topic)))

解决了这个问题。