2016-08-24 4 views
0

보스 5.1 서버봄 3.0.5 프레임 워크 실행을 기반으로하는 응용 프로그램이 있습니다. 어떻게 봄 3.05 및 J 보스 5.1 (JBossMQ와)를 사용하여 JMS 로컬 큐를 구현하는 방법?

나는이 tutorial을 따르려고했는데, 그것은 ActiveMQ를 브로커 대신 JBossMQ와 (기본 JBoss의 5.1 브로커)를 사용합니다.

는 나는 이미 보스의 설정에서이 MyQueue (목적지를-service.xml) 라는 대기열을 설정 한 :

<mbean code="org.jboss.jms.server.destination.QueueService" 
    name="jboss.messaging.destination:service=Queue,name=MyQueue" 
    xmbean-dd="xmdesc/Queue-xmbean.xml"> 
    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> 
    <depends>jboss.messaging:service=PostOffice</depends> 

당신은 아래에있는 내 설정의 나머지 부분을 볼 수 있습니다. 내가 뭘 놓치고 있니? 어떻게 큐와 연결 팩토리의 JNDI 이름을 지정할 수 있습니다? 그리고 서버 주소에 대한 어떤 ([ConnectionFactory에] 커넥터 bisocket : // localhost를 : 4457)?

applicationContext.xml에서 내 설정은 다음과 같다 :

<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" /> 

<bean id="messageDestination" class="javax.jms.Queue" /> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="receiveTimeout" value="10000" /> 
</bean> 

<bean id="springJmsProducer" class="myPackage.QueueProducer"> 
    <property name="destination" ref="messageDestination" /> 
    <property name="jmsTemplate" ref="jmsTemplate" /> 
</bean> 

<bean id="messageListener" class="myPackage.QueueConsumer" /> 

내 프로듀서 :


public class QueueProducer { 

    private JmsTemplate jmsTemplate; 

    private Queue queue; 

    public void setConnectionFactory(ConnectionFactory cf) { 
     this.jmsTemplate = new JmsTemplate(cf); 
    } 

    public void setQueue(Queue queue) {  
     this.queue = queue; 
    } 

    public void send(Object object) { 
     this.jmsTemplate.send(this.queue, new MessageCreator() { 
      public Message createMessage(Session session) throws JMSException { 
       return session.createTextMessage("my text to send"); 
      } 
     }); 
    } 
} 

내 소비자 :




public class QueueConsumer implements MessageListener { 

    @Override 
    public void onMessage(Message message) { 
     if (message instanceof TextMessage) { 
      try { 
       System.out.println(((TextMessage) message).getText()); 
      }catch (JMSException ex) { 
       throw new RuntimeException(ex); 
      } 
     } 
     else { 
      throw new IllegalArgumentException("Message must be of type TextMessage"); 
     } 

    } 
} 

답변

1

당신이 원하는 것을 가장입니다 가능성 있음 jndiTemplate. 또한, 당신은 꽤 함께 제대로 jmsTemplate 콩 배선 아닙니다. 다음은 봄의 ApplicationContext에 필요한 조각의 설명에 의해 조각입니다.

당신은 JBoss의 JNDI 구현 주입 설정에 jndiTemplate가 필요합니다

<!-- spring JMS definition --> 
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate"/> 
    <property name="jndiName" value="ConnectionFactory" /> 
</bean> 

구성 트랜잭션 관리자 : 위의 JNDI의 설정에 가리 키도록 ConnectionFactory에를, 그리고

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
    <property name="environment"> 
     <props> 
      <prop key="java.naming.factory.initial"> 
       org.jnp.interfaces.NamingContextFactory 
      </prop> 
      <prop key="java.naming.provider.url"> 
       jnp://localhost:1099 
      </prop> 
      <prop key="java.naming.factory.url.pkgs"> 
       org.jboss.naming:org.jnp.interfaces 
      </prop> 
     </props> 
    </property> 
</bean> 

을 구성 위의 ConnectionFactory와 함께 :

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
</bean> 

연결 대상 jndiTemplate 및 jndiName와 이온 : 마지막으로

<!-- jms destination already defined in jboss --> 
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate"/> 
    <property name="jndiName" value="queue/MyQueue" /> 
</bean> 

의 ConnectionFactory를 가리하기 위해 JmsTemplate의 자체를 구성하고, 당신은 당신의 코드에서이 JmsTemplate을 사용할 준비가 : 당신은 또한 할 것

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
</bean> 

소비자를 실행하는 메시지 수신기 컨테이너 구성 "jmsexample.ExampleListener"를 MessageListener가 포함 된 클래스의 이름으로 바꿉니다.

<!-- this is the Message Driven POJO (MDP) --> 
<bean id="messageListener" class="jmsexample.ExampleListener" /> 

<!-- and this is the message listener container --> 
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="connectionFactory"/> 
    <property name="destination" ref="myQueue"/> 
    <property name="messageListener" ref="messageListener" /> 
</bean>