2015-07-14 16 views
6

Sonic Broker Konusuna bağlanmak ve gelen XML mesajlarını dinlemek istiyorum. Aşağıda bir şey yaptım;Spring-Boot @Autowired ana sınıfta sıfırlanıyor

Application.java

@SpringBootApplication 
@ComponentScan({"com.mainpack", "com.msgpack.jms"}) 
@EnableJms 
public class Application extends SpringBootServletInitializer { 

@Autowired 
private JmsTopicListener jmsTopicListener; 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
} 

@Override 
public void onStartup(final ServletContext servletContext) throws ServletException { 
    try { 
     LogService.info(Application.class.getName(), "Starting Service..."); 
     super.onStartup(servletContext); 
     jmsTopicListener.listenMessage(); 
     LogService.info(Application.class.getName(), "Service Started"); 
    } catch (Exception ex) { 
     LogService.error(this.getClass().getName(), ex); 
    } 
} 

public static void main(String[] args) { 
    ApplicationContext context = SpringApplication.run(Application.class, args); 
    LogService.info(Application.class.getName(), "Service Started..."); 
} 
} 

JmsTopicListener.java

@Component 
public class JmsTopicListener { 

@Autowired 
private ApplicationProperties properties; 

@Autowired 
private MsgListener msgListener; 

public void listenMessage() { 
    TopicConnectionFactory factory; 
    TopicConnection connection = null; 
    LogService.info(this.getClass().getName(), "Registering Broker Connection"); 
    try { 
     factory = new progress.message.jclient.TopicConnectionFactory(properties.getBrokerURL()); 
     connection = factory.createTopicConnection(properties.getUserName(), properties.getPass()); 

     javax.jms.TopicSession subSession = (TopicSession) connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

     javax.jms.Topic topic = subSession.createTopic(properties.getTopicName()); 
     MessageConsumer subscriber = subSession.createSubscriber(topic); 
     subscriber.setMessageListener(msgListener); 
     connection.start(); 
     LogService.info(this.getClass().getName(), "Broker connected"); 
    } catch (Exception ex) { 
     LogService.error(this.getClass().getName(), ex); 
    } 
} 
} 

MsgListener.java

@Component 
public class MsgListener implements MessageListener { 

@Override 
public void onMessage(Message msg) { 
    if (msg instanceof XMLMessage) { 
     try { 
      XMLMessage m = (XMLMessage) msg; 
      if (m.getText().contains("Applications")) { 
       LogService.info(this.getClass().getName(), "Recieved A Applications Message"); 
      } else { 
       LogService.info(this.getClass().getName(), "Recieved Message Does not contain Applications Tag"); 
      } 
     } catch (Exception ex) { 
      LogService.info(this.getClass().getName(), "Exception: " + ex.getMessage()); 
     } 
    } 
} 
} 

, ben Application.java satır jmsTopicListener.listenMessage() de nullPointer olsun bu kodu çalıştırdığınızda.

Burada yaptığım hata neydi? Bunu geliştirebilmenin bir yolu var mı (yani işi daha az kodla yapmak).

NOT: Kaydedici itibaren JmsTopicListener.java ve MsgListner.java

Hata gelmiş sınıfları Application.java ve ApplicationProp.java com.msgpack.jms sahip com.mainpack: çok erken servlet konteyner tarafından

ERROR [2015-07-14 14:34:52] [com.mainpack.Application] [localhost-startStop-1] - [Exception: ]java.lang.NullPointerException 
    at com.mainpack.Application.onStartup(Application.java:33) 
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5156) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+0

burada – kuhajeyan

+1

@kbird tam yığın izlemesini yazdırabilirsiniz: O Applicationbir örneğini yaratmış ve herhangi bağımlılıkları enjekte kez Bahar tarafından çağrılır yığın izini eklendi. Lütfen güncellenmiş gönderiye bakın. Tomcat’ta servisi başlattığımda bunu logger’da alıyorum. O zaman hiçbir şey olmaz. Servis daha fazla çalışmaz. – Raj

+0

'@ SpringBootApplication'' 'Configuration',' @ EnableAutoConfiguration' ve 'ComponentScan' için bir kısayol olduğundan, bu zaten sizin sorununuz olabilir. Application sınıfınızdaki '@ Autowired' kaynağına, '@ Component',' @ Service', yani Spring tarafından yönetime hak kazanacak ve bağımlılıkları afair enjekte edecek bir kaynağa erişmeye çalışıyorsunuz. --debug modunda çalışarak iki kez kontrol etmelisiniz. –

cevap

12

onStartup denir senin uygulamanın yaşam döngüsü ve Bahar Önyükleme değil, sunucu kabı tarafından oluşturulan sınıfın bir örneğinde çağrılır. Bu nedenle, jmsTopicListener, null.

onStartup'u geçersiz kılmak yerine, @PostConstruct ile açıklamalı bir yöntem kullanabilirsiniz.

@SpringBootApplication 
@ComponentScan({"com.mainpack", "com.msgpack.jms"}) 
@EnableJms 
public class Application extends SpringBootServletInitializer { 

    @Autowired 
    private JmsTopicListener jmsTopicListener; 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    @PostConstruct 
    public void listen() { 
     jmsTopicListener.listenMessage(); 
    } 

    public static void main(String[] args) { 
     ApplicationContext context = SpringApplication.run(Application.class, args); 
     LogService.info(Application.class.getName(), "Service Started..."); 
    } 
} 
+0

Uygulamayı tomcat üzerinde dağıttığımda, 'main()' işlevini kullanmaz. Bu yüzden, tomcat'ta "Uygulama Hizmeti Başlatılan İleti" yi vermek için onStartUp() işlevini kullandım. Eğer onStartUp() 'ı kullanmazsam, mesajı" Servis İsmim "gibi başlayan/başlatan (başarılı bir şekilde) veya benzer bir şekilde iletebileceğim bir yol var mı? – Raj

+0

Teşekkür ederiz. 'PostConstruct' ekledikten sonra iyi çalışıyor. – Raj

+0

Uygulama başladığında çeşitli etkinlikler yayınlanır. Daha fazla ayrıntı için [javadoc] 'a bakın (http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/event/package-summary.html).Bunlardan birini (veya daha fazlasını) dinleyebilirsin. Bunu yapmak, uygulamanızı başlatmanın her iki yolu için de işe yarayacaktır. –

İlgili konular