Як атрымаць Вясна тэлеграму мой JmsComponent

Я пішу прыкладанне, якое выкарыстоўвае Акку, Akka-вярблюд і Spring для налады. Прыкладанне павінна дзейнічаць у якасці асобнага JMS кліента з рознымі серверамі прыкладанняў, для чаго яму неабходна стварыць фабрыку злучэнняў JMS з дапамогай JNDI. Я адчуваю гэта з JBoss. У мяне тая ж праблема з JBoss 5 і 6 (гэта, здаецца, праблема Спринг на баку кліента, не звязаных з JBoss).

Я канфігураванне спружыны фасолі з гэтым XML:



    
        
    

    
        
            java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
            java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
            java.naming.provider.url=jnp://192.168.0.109:1099
        
    

    
        
    


Як вы можаце бачыць, я налады:

    <�Літый> а ConnectionFactory ініцыялізаваць з дапамогай JNDI, званы jmsConnectionFactory
  • JmsComponent з ConnectionFactory уласнасці усталёўваецца ў папярэднім кампаненце

З дапамогай гэтай канфігурацыі майго прыкладання трывае няўдачу пры запуску з гэтым:

java.lang.IllegalArgumentException: connectionFactory must be specified
    at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:294) ~[camel-core.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.createConnectionFactory(JmsConfiguration.java:1053) ~[camel-jms.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.getConnectionFactory(JmsConfiguration.java:416) ~[camel-jms.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.createListenerConnectionFactory(JmsConfiguration.java:1062) ~[camel-jms.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.getListenerConnectionFactory(JmsConfiguration.java:435) ~[camel-jms.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.configureMessageListenerContainer(JmsConfiguration.java:889) ~[camel-jms.jar:2.10.4]
    at org.apache.camel.component.jms.JmsConfiguration.createMessageListenerContainer(JmsConfiguration.java:379) ~[camel-jms.jar:2.10.4]

Гэта адбываецца з гэтага кода ў JmsConfiguration.java:

protected ConnectionFactory createConnectionFactory() {
    ObjectHelper.notNull(connectionFactory, "connectionFactory");
    return null;
}

Так гэта выглядае, як ініцыялізацыя Spring бабы не атрымоўваецца звязаць/провад фасолю, як праінструктавалі тут (вынятыя з поўнай канфігурацыі xml Spring раней налепленай):

    
        
    

Я таксама спрабаваў стварыць прамежкавы JmsConfiguration боб, і усталяваўшы ўласцівасць канфігурацыі ў JmsComponent, замест ўстаноўкі ConnectionFactory уласнасці непасрэдна, але я атрымліваю той жа вынік у абодвух устаноўках.

Дарэчы, я магу падключыць бабы з дапамогай кода ў парадку. Я маю на ўвазе, што гэта:

val connFactory = springContext.getBean[javax.jms.ConnectionFactory]("jmsConnectionFactory", classOf[javax.jms.ConnectionFactory])
camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connFactory))

выдатна працуе. Так што я ведаю, што я атрымліваю ConnectionFactory з JNDI, гэта проста, што я не магу трапіць у правільную канфігурацыю Spring, каб тэлеграму яго ў XML.

Мне трэба гэта дадатак, каб быць вельмі наладжвальнымі без перакампіляванні, таму атрыманне xml для працы з'яўляецца абавязковым для мяне.

У выпадку, калі гэта не ясна, пытанне: Як атрымаць Spring наладзіць мой JmsComponent боб, з яго ConnectionFactory усталёўваецца ў JNDI атрыманага завода?

EDIT: Кропка выкарыстання Camel у тым, што яна павінна дазволіць мне памяняць гэты кампанент нават для іншых іншага тыпу. Такім чынам, сёння я выкарыстоўваю JMS, можа быць, заўтра я буду выкарыстоўваць пратакол TCP. Таму было б важна, каб быць у стане вызначыць усе ў XML.

2
не павінны вызначаецца як <�вярблюд: camelContext>?
дададзена аўтар user1516873, крыніца
Можа быць, калі вы LookUp фабрыкі злучэнняў у JNDI, ён усё яшчэ не ініцыялізаваны? Паспрабуйце ўсталяваць пошук-на-старт = хлусня
дададзена аўтар user1516873, крыніца
Зараз, калі вы згадваеце ... Вы, напэўна, маюць рацыю, хоць ён выдатна працуе без вярблюда: па нейкай прычыне
дададзена аўтар Jeet Idealist Dalui, крыніца
Дзякуй @ user1516873 за прапанову. На жаль, пасля дадання пошуку-на-старце = "хлусьня" проксі-інтэрфейс = «javax.jms.ConnectionFactory», і я атрымаў тую ж памылку.
дададзена аўтар Jeet Idealist Dalui, крыніца
Дзякуй @ user1516873 за прапанову. На жаль, пасля дадання пошуку-на-старце = "хлусьня" проксі-інтэрфейс = «javax.jms.ConnectionFactory», і я атрымаў тую ж памылку.
дададзена аўтар Jeet Idealist Dalui, крыніца

9 адказы

Я лічу, што праблема ў тым, што Акка выкарыстоўвае свой уласны CamelContext, а не тую, якая вызначана ў канфігурацыі Spring. У больш ранніх версіях Акки, здавалася, што можна было ў не ўстаноўлены кантэкст, які выкарыстоўваецца Akka , але больш не ўяўляецца магчымым у апошніх версіях.

Я сутыкаўся з такім жа пытаннем, я выкарыстоўваю канфігурацыю на аснове анатацый, у Java (а не Scala), і атрымаў вакол пытання, выкарыстоўваючы гэты код:

@Bean
public ActorSystem getCamelActorSystem(ConnectionFactory factory) {

    ActorSystem system = ActorSystem.create("some-system");

    Camel camel = CamelExtension.get(system);
    CamelContext camelContext = camel.context();
    camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(factory));

    return system;
}

Гэта ўводзіць ConnectionFactory залежнасці, вызначаную ў іншым месцы і выкарыстоўвае гэта, каб дадаць кампанент JMS да camelContext, якім карыстаецца Акки.

Іншым рашэннем можа быць падоўжыць код CamelExtension нейкім чынам, каб дазволіць camelContext залежнасць, які будзе ўведзены, як гэта было магчыма раней. Тым не менш, я мяркую, што ў іх былі важкія падставы для змены, і таму я пакінуць яго ў спакоі. Я думаю, што гэта так яны могуць забяспечыць кантэкст не можа быць зменены такім чынам, Actor сістэма заўсёды выкарыстоўвае адзін і той жа кантэкст, вярблюд, гэта заснавана на наступным:

<�Р> Адзін CamelExtension загружаецца толькі адзін раз для кожнага аднаго ActorSystem,   што робіць яго бяспечным для выкліку CamelExtension ў любым пункце вашага   код, каб дабрацца да аб'ектаў Apache Camel, звязаных з ім. Гэта   адзін CamelContext і адзін ProducerTemplate на кожны ActorSystem   які выкарыстоўвае CamelExtension.

http://doc.akka.io/docs/akka/current /scala/camel.html#CamelExtension

1
дададзена

Я лічу, што праблема ў тым, што Акка выкарыстоўвае свой уласны CamelContext, а не тую, якая вызначана ў канфігурацыі Spring. У больш ранніх версіях Акки, здавалася, што можна было ў не ўстаноўлены кантэкст, які выкарыстоўваецца Akka , але больш не ўяўляецца магчымым у апошніх версіях.

Я сутыкаўся з такім жа пытаннем, я выкарыстоўваю канфігурацыю на аснове анатацый, у Java (а не Scala), і атрымаў вакол пытання, выкарыстоўваючы гэты код:

@Bean
public ActorSystem getCamelActorSystem(ConnectionFactory factory) {

    ActorSystem system = ActorSystem.create("some-system");

    Camel camel = CamelExtension.get(system);
    CamelContext camelContext = camel.context();
    camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(factory));

    return system;
}

Гэта ўводзіць ConnectionFactory залежнасці, вызначаную ў іншым месцы і выкарыстоўвае гэта, каб дадаць кампанент JMS да camelContext, якім карыстаецца Акки.

Іншым рашэннем можа быць падоўжыць код CamelExtension нейкім чынам, каб дазволіць camelContext залежнасць, які будзе ўведзены, як гэта было магчыма раней. Тым не менш, я мяркую, што ў іх былі важкія падставы для змены, і таму я пакінуць яго ў спакоі. Я думаю, што гэта так яны могуць забяспечыць кантэкст не можа быць зменены такім чынам, Actor сістэма заўсёды выкарыстоўвае адзін і той жа кантэкст, вярблюд, гэта заснавана на наступным:

<�Р> Адзін CamelExtension загружаецца толькі адзін раз для кожнага аднаго ActorSystem,   што робіць яго бяспечным для выкліку CamelExtension ў любым пункце вашага   код, каб дабрацца да аб'ектаў Apache Camel, звязаных з ім. Гэта   адзін CamelContext і адзін ProducerTemplate на кожны ActorSystem   які выкарыстоўвае CamelExtension.

http://doc.akka.io/docs/akka/current /scala/camel.html#CamelExtension

1
дададзена

Я лічу, што праблема ў тым, што Акка выкарыстоўвае свой уласны CamelContext, а не тую, якая вызначана ў канфігурацыі Spring. У больш ранніх версіях Акки, здавалася, што можна было ў не ўстаноўлены кантэкст, які выкарыстоўваецца Akka , але больш не ўяўляецца магчымым у апошніх версіях.

Я сутыкаўся з такім жа пытаннем, я выкарыстоўваю канфігурацыю на аснове анатацый, у Java (а не Scala), і атрымаў вакол пытання, выкарыстоўваючы гэты код:

@Bean
public ActorSystem getCamelActorSystem(ConnectionFactory factory) {

    ActorSystem system = ActorSystem.create("some-system");

    Camel camel = CamelExtension.get(system);
    CamelContext camelContext = camel.context();
    camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(factory));

    return system;
}

Гэта ўводзіць ConnectionFactory залежнасці, вызначаную ў іншым месцы і выкарыстоўвае гэта, каб дадаць кампанент JMS да camelContext, якім карыстаецца Акки.

Іншым рашэннем можа быць падоўжыць код CamelExtension нейкім чынам, каб дазволіць camelContext залежнасць, які будзе ўведзены, як гэта было магчыма раней. Тым не менш, я мяркую, што ў іх былі важкія падставы для змены, і таму я пакінуць яго ў спакоі. Я думаю, што гэта так яны могуць забяспечыць кантэкст не можа быць зменены такім чынам, Actor сістэма заўсёды выкарыстоўвае адзін і той жа кантэкст, вярблюд, гэта заснавана на наступным:

<�Р> Адзін CamelExtension загружаецца толькі адзін раз для кожнага аднаго ActorSystem,   што робіць яго бяспечным для выкліку CamelExtension ў любым пункце вашага   код, каб дабрацца да аб'ектаў Apache Camel, звязаных з ім. Гэта   адзін CamelContext і адзін ProducerTemplate на кожны ActorSystem   які выкарыстоўвае CamelExtension.

http://doc.akka.io/docs/akka/current /scala/camel.html#CamelExtension

1
дададзена

Я лічу, што праблема ў тым, што Акка выкарыстоўвае свой уласны CamelContext, а не тую, якая вызначана ў канфігурацыі Spring. У больш ранніх версіях Акки, здавалася, што можна было ў не ўстаноўлены кантэкст, які выкарыстоўваецца Akka , але больш не ўяўляецца магчымым у апошніх версіях.

Я сутыкаўся з такім жа пытаннем, я выкарыстоўваю канфігурацыю на аснове анатацый, у Java (а не Scala), і атрымаў вакол пытання, выкарыстоўваючы гэты код:

@Bean
public ActorSystem getCamelActorSystem(ConnectionFactory factory) {

    ActorSystem system = ActorSystem.create("some-system");

    Camel camel = CamelExtension.get(system);
    CamelContext camelContext = camel.context();
    camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(factory));

    return system;
}

Гэта ўводзіць ConnectionFactory залежнасці, вызначаную ў іншым месцы і выкарыстоўвае гэта, каб дадаць кампанент JMS да camelContext, якім карыстаецца Акки.

Іншым рашэннем можа быць падоўжыць код CamelExtension нейкім чынам, каб дазволіць camelContext залежнасць, які будзе ўведзены, як гэта было магчыма раней. Тым не менш, я мяркую, што ў іх былі важкія падставы для змены, і таму я пакінуць яго ў спакоі. Я думаю, што гэта так яны могуць забяспечыць кантэкст не можа быць зменены такім чынам, Actor сістэма заўсёды выкарыстоўвае адзін і той жа кантэкст, вярблюд, гэта заснавана на наступным:

<�Р> Адзін CamelExtension загружаецца толькі адзін раз для кожнага аднаго ActorSystem,   што робіць яго бяспечным для выкліку CamelExtension ў любым пункце вашага   код, каб дабрацца да аб'ектаў Apache Camel, звязаных з ім. Гэта   адзін CamelContext і адзін ProducerTemplate на кожны ActorSystem   які выкарыстоўвае CamelExtension.

http://doc.akka.io/docs/akka/current /scala/camel.html#CamelExtension

1
дададзена

Так як ваш пошук, здаецца, працуе, гэта, верагодна, больш, чым вы шукаеце, але вось як я атрымліваю фабрыку злучэнняў праз JNDI, выкарыстоўваючы jndiTemplate (спружынны 3,1). Звярніце ўвагу, я даць contection фабрыку праз канфігурацыю (з дапамогай мэнэджара транзакцый). Выбачайце за любыя памылкі друку, але вы атрымаеце ідэю.



     
        classpath:connection.properties
     


    


   


   
   
   
   


   
   
   
        
   
   
 

 
   
   
        
   
 
 
       
           
                ${db.jms.JNDIServerName}
           
       
  
0
дададзена

Так як ваш пошук, здаецца, працуе, гэта, верагодна, больш, чым вы шукаеце, але вось як я атрымліваю фабрыку злучэнняў праз JNDI, выкарыстоўваючы jndiTemplate (спружынны 3,1). Звярніце ўвагу, я даць contection фабрыку праз канфігурацыю (з дапамогай мэнэджара транзакцый). Выбачайце за любыя памылкі друку, але вы атрымаеце ідэю.



     
        classpath:connection.properties
     


    


   


   
   
   
   


   
   
   
        
   
   
 

 
   
   
        
   
 
 
       
           
                ${db.jms.JNDIServerName}
           
       
  
0
дададзена

Так як ваш пошук, здаецца, працуе, гэта, верагодна, больш, чым вы шукаеце, але вось як я атрымліваю фабрыку злучэнняў праз JNDI, выкарыстоўваючы jndiTemplate (спружынны 3,1). Звярніце ўвагу, я даць contection фабрыку праз канфігурацыю (з дапамогай мэнэджара транзакцый). Выбачайце за любыя памылкі друку, але вы атрымаеце ідэю.



     
        classpath:connection.properties
     


    


   


   
   
   
   


   
   
   
        
   
   
 

 
   
   
        
   
 
 
       
           
                ${db.jms.JNDIServerName}
           
       
  
0
дададзена

Так як ваш пошук, здаецца, працуе, гэта, верагодна, больш, чым вы шукаеце, але вось як я атрымліваю фабрыку злучэнняў праз JNDI, выкарыстоўваючы jndiTemplate (спружынны 3,1). Звярніце ўвагу, я даць contection фабрыку праз канфігурацыю (з дапамогай мэнэджара транзакцый). Выбачайце за любыя памылкі друку, але вы атрымаеце ідэю.



     
        classpath:connection.properties
     


    


   


   
   
   
   


   
   
   
        
   
   
 

 
   
   
        
   
 
 
       
           
                ${db.jms.JNDIServerName}
           
       
  
0
дададзена

Так як ваш пошук, здаецца, працуе, гэта, верагодна, больш, чым вы шукаеце, але вось як я атрымліваю фабрыку злучэнняў праз JNDI, выкарыстоўваючы jndiTemplate (спружынны 3,1). Звярніце ўвагу, я даць contection фабрыку праз канфігурацыю (з дапамогай мэнэджара транзакцый). Выбачайце за любыя памылкі друку, але вы атрымаеце ідэю.



     
        classpath:connection.properties
     


    


   


   
   
   
   


   
   
   
        
   
   
 

 
   
   
        
   
 
 
       
           
                ${db.jms.JNDIServerName}
           
       
  
0
дададзена