2014-12-21 3 views
0

저는 약 5 년의 .NET 경험 후에 Java로 돌아가는 개발자입니다. MVC 프레임 워크에 대한 지식을 가지고 있지만 Spring MVC와 스프링 프레임 워크에 전혀 익숙하지 않습니다.Spring의 JmsTemplate을 사용하여 JMS 메시지를 activemq 큐로 보낼 수 없습니다.

activemq JMS 대기열에 엔티티를 저장하려고하는 할당이 있습니다. 좀 더 복잡한 객체를 보내기 전에 간단한 TextMessage로 먼저 사용하기로 결정했습니다. 보기에서 입력 단추 컨트롤에 매핑 된 컨트롤러에서 보내기를 시도 할 때마다 Tomcat에서 java.lang.NullPointerException이 발생합니다. 그게 나보다 많은 정보를 보여주지는 않아. 소스가 ApiMessageSender 클래스의이 코드 줄에 있다는 것을 보여줍니다.

jmsTemplate.send(new MessageCreator(){ 

     @Override 
     public Message createMessage(Session session) throws JMSException { 
      return session.createTextMessage(message); 
     } 
    }); 

스프링 웹 MVC 웹 응용 프로그램에서의 구현은 세 가지 클래스로 구성됩니다. 봄 IOC의 배관 공사가 완료 1)

import javax.jms.*; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.jms.core.MessageCreator; 
import org.springframework.stereotype.Component; 

@Component("messageSender") 
public class ApiMessageSender { 
@Autowired 
private JmsTemplate jmsTemplate; 
public void sendMessage(final String message){ 
    jmsTemplate.send(new MessageCreator(){ 

     @Override 
     public Message createMessage(Session session) throws JMSException { 
      return session.createTextMessage(message); 
     } 
    }); 
} 
} 

2 ApiMessageSender.java

) WebAppConfig.java. 이 클래스는이 프로젝트에서 전혀 사용되지 않는 ApplicationContext.xml 파일 대신 사용됩니다. 대기열 이름은 응용 프로그램을 실행하기 전에 ActiveMQ 관리 웹 인터페이스에서 수동으로 작성되었습니다.

@Bean 
    public org.apache.activemq.ActiveMQConnectionFactory connectionFactory() { 
     org.apache.activemq.ActiveMQConnectionFactory connectionFactory = new org.apache.activemq.ActiveMQConnectionFactory(); 
     connectionFactory.setBrokerURL("tcp://localhost:61616"); 
     return connectionFactory; 
    } 

    @Bean 
    public org.springframework.jms.core.JmsTemplate jmsTemplate() { 
     org.springframework.jms.core.JmsTemplate jmsTemplate = new org.springframework.jms.core.JmsTemplate(connectionFactory()); 
     jmsTemplate.setDefaultDestinationName("apiqueue"); 
     return jmsTemplate; 
    } 

3)

버튼이보기에 클릭 할 때 호출되는 컨트롤러에서이 작업 방법 ApiController.java. 특정 코드 스 니펫을 주석 처리 했으므로 다른 요구 사항을 처리 할 수 ​​있습니다.

@RequestMapping(value="/create", method=RequestMethod.POST) 
    public ModelAndView createNewApi(@ModelAttribute @Valid Api api, 
      BindingResult result, 
      final RedirectAttributes redirectAttributes) { 

     if (result.hasErrors()) 
      return new ModelAndView("api-new"); 

     ModelAndView mav = new ModelAndView(); 
     String message = "New api "+api.getApiKey()+" was successfully created."; 

     apiService.create(api); 

     //Send object to Queue. 
     /*GenericXmlApplicationContext ctx=new GenericXmlApplicationContext(); 
     ctx.load("classpath:applicationContext.xml"); 
     ctx.refresh();*/ 

     /* ApiMessageSender sender = new ApiMessageSender(); 
     sender.sendMessage("hello jms3");*/ 
     //ctx.close(); 
     //End of messaging task. The message should be successfully in the JMS Queue. 

     mav.setViewName("redirect:/api/list.html"); 

     redirectAttributes.addFlashAttribute("message", message); 
     return mav;  
    } 

여기에는 어떤 문제가있을 수 있습니까? 왜 java.lang.NullPointerException이 발생합니까? 이 기능을 어떻게 작동시킬 수 있습니까? 대단히 감사합니다.

+0

예외 스택 추적을 게시하고 해당 줄을 표시하십시오. – Ralph

답변

1

전체 스택 트레이스가 없다면 완전히 알려주지는 못했지만 주석 처리 된 코드를 기반으로하면 "ApiMessageSender sender = new ApiMessageSender();"를 사용하고있는 것일 수 있습니다. ApiMessageSender를 인스턴스화합니다. 이렇게하면 콩을 인스턴스화하기 위해 Spring을 사용하지 않으므로 jmsTemplate이 자동으로 실행되지 않습니다. 따라서 (스택 추적을 게시하지 않고) 내 최선의 추측은 jmsTemplate이 설정되지 않았기 때문에 코드가 jmsTemplate.send를 호출하면 null 포인터를 가져옵니다.

올바른 방법은 SpringDispatcherServlet을 사용하여 Spring MVC 컨텍스트를 설정하고 bean을 시작하는 것이다. 당신은 당신의 컨트롤러 메소드에서 직접 응용 프로그램 컨텍스트를 참조 할 필요가 없습니다 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

: 그럼 당신은 대신 "새로운 ApiMessageSender()"를 호출하는 컨트롤러 클래스로 ApiMessageSender를 autowire하기 수

여기에 문서를 살펴 보자 . 모든 것이 web.xml 파일에 의해 Spring과 함께 설정되어야합니다.

+0

안녕하세요 xraiderx 님, 귀하의 제안이 효과적이었습니다. ApiMessageSender에 @Autowired로 주석을 달고 응용 프로그램을 실행하면 메시지가 대기열에 나타납니다. 메시지를 클릭하여 텍스트 형식으로 볼 수 있는지 확인한 결과 ActiveMQ에서 "이 요청을 처리하는 동안 예외가 발생했습니다. 자세한 정보를 보려면 로그를 확인하십시오!"라는 오류 메시지가 나타납니다. 메시지가 대기열에 있지만 문자열이나 텍스트 컨텐츠를 볼 수 없습니다. 대기열에서 메시지를 사용하기 전까지이 정보를 볼 수 있습니까? 고맙습니다. – sage