2012-06-12 3 views
0

내 프로젝트에 활성 mq 인터페이스를 구현하는 방법을 배우고 있습니다. 이것이 내가 생산자와 소비자를 만드는 방법이다.동적으로 생성 할 때 소비자가 메시지를 소비하지 않음

public void connectionSetup(String portName) { // portname is object of PortTO class. We are creating producer and consumer pair for every existing PortTO object. 
      Connection connection = null; 
      try { 

        if (timeToLive != 0) { 

        } 

        // Create the connection. 
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url); 
        connection = connectionFactory.createConnection(); 

        connection.start(); 
        connection.setExceptionListener(this); 

        // Create the session 
        Session session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE); 
        if (topic) { 
          destination = session.createTopic(subject); 
        } else { 
          destination = session.createQueue(portName); 
        } 

        // Create the producer. 
        MessageProducer producer = session.createProducer(destination);      if (persistent) { 
          producer.setDeliveryMode(DeliveryMode.PERSISTENT); 
        } else { 
          producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
        } 


        MessageConsumer consumer = session.createConsumer(destination);      if (timeToLive != 0) 
          producer.setTimeToLive(timeToLive); 

        mapOfSession.put(portName, session); 
        mapOfMessageProducer.put(portName, producer); 
        mapOfMessageConsumer.put(portName, consumer);      log.info("Producer is " + producer); 
        log.info("Consumer is " + consumer); 

      } catch (Exception e) { 

        log.error(e.getMessage()); 
      } 
    } 

그래서 우리는 생산자와 소비자를 생성하고 모든 PortTO 객체의지도에 저장된다.

 public void onMessage(Message message) { 
      PortService portService = new PortService();  
      List<PortTO> portTOList = portService.getMoxaPorts(); 
        for(PortTO portTO : portTOList) { // catching messages from producers of every PortTO object         
       MessageConsumer consumer = DataCollectionMessageProducer.getMapOfMessageConsumer().get(portTO.getPort()); // getting consumer from map of PortTO 
          consumer.setMessageListener(this); 
          message = consumer.receive(1000);        if (message instanceof TextMessage) { 
      // some processing 
         } 
          } else { 
            if (verbose) { 

            } 
          } 

        } 
        } 

어떤 이유가있을 수 있습니다 ...

TextMessage message = session.createTextMessage(); 
message.setIntProperty(key, 2); 
    producer.send(message);   

그러나 소비자는 소비되지 않은 : 자, 생산자는 메시지를 보내는? 내 접근 방식이 잘못 되었습니까 ??

답변

0

onMessage 메소드에서 messageListener를 설정 중입니다. onMessage 메소드는 messageListener가 해당 객체로 설정된 경우에만 호출되므로 catch 22입니다.

또 다른 것은 메시지 수신기에서 수신을 수행하는 이유가 확실하지 않습니다. onMessage는 대기열에있는 각 메시지에 대해 리스너로 설정되고 각 수신 메시지에 대한 논리가 이벤트 구동 방식으로 상주해야하는 경우 호출됩니다. 최소한, 그것은 처음부터 JMS에 대한 아이디어입니다.

+0

그래서 메시지를받을 것입니다. xml 파일에 수동으로 messageListener를 설정하고 싶지는 않습니다. – user746458

+0

consumer.setMessageListener (this); 코드별로 메시지 수신기를 설정합니다. 이를 위해 xml을 편집 할 필요가 없습니다. onMessage 내부에서이를 수행하지 마십시오. 메시지가 도착하면 해당 메소드가 호출됩니다. –

+0

나는 그 점을 얻었다. 사실, 우리 프로젝트에서는 xml 파일에 메시지 리스너를 생성하고 있습니다. 그러나 메시지 청취자의 수는 요구 사항에 따라 미래에 달라질 수 있습니다. 메시지 리스너를 XML로 코딩하지 않고 동적으로 생성 할 수 있습니까? – user746458

관련 문제