2013-09-29 3 views
1

안녕 얘들 아 두 개의 엔터프라이즈 애플리케이션 사이에 다리를 만들어야하는 애플리케이션을 개발해야하며이 두 애플리케이션 간의 통신을 설정하기 위해 JMS를 사용하고 있습니다. 여기서는 Message Driven Bean을 사용하여 한 응용 프로그램에서 다른 응용 프로그램으로 JMS 메시지를 보냅니다. 나는 한 응용 프로그램이 다른 응용 프로그램으로 메시지를 보낼 수 있지만 요청을 보낸 사람에게 응답을 보낼 수 없을 때 나는 때렸다.엔터프라이즈 Java 애플리케이션에서 jms 응답을 보내는 방법

private void sendJMSMessageToMyTestQueue(Message messageData) { 
    try { 
     context.createProducer().send(myTestQueue, messageData); 
     System.out.println("\tTime:  " + System.currentTimeMillis() + " ms"); 
     System.out.println("\tMessage ID: " + messageData.getJMSMessageID()); 
     System.out.println("\tCorrel. ID: " + messageData.getJMSCorrelationID()); 
     System.out.println("\tReply to: " + messageData.getJMSReplyTo()); 
     //System.out.println("\tContents: " + messageData.getText()); 
    } catch (JMSException ex) { 
     Logger.getLogger(HomeLoanJMS.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 



private void recieveSync() { 

    Message msg = context.createConsumer(myTestQueue).receive(); 
    if (msg instanceof TextMessage) { 
     try { 
      TextMessage tms = (TextMessage) msg; 
      System.out.println("Received reply "); 
      System.out.println("Received reply "); 
      System.out.println("\tTime:  " + System.currentTimeMillis() + " ms"); 
      System.out.println("\tMessage ID: " + tms.getJMSMessageID()); 
      System.out.println("\tCorrel. ID: " + tms.getJMSCorrelationID()); 
      System.out.println("\tReply to: " + tms.getJMSReplyTo()); 
      System.out.println("\tContents: " + tms.getText()); 
      System.out.println("Coming Reply: ---->>>>" + tms.getText()); 

     } catch (JMSException ex) { 
      Logger.getLogger(HomeLoanJMS.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

@Override 
public void sendMessage(String message) { 
    try { 
     TextMessage msg = context.createTextMessage(message); 
     // msg.setJMSType("Textmsg"); 
     msg.setText(message); 
     msg.setJMSReplyTo(myTestQueue); //setting reply destination 
     sendJMSMessageToMyTestQueue(msg); 
     System.out.println("after reply"); 
    // recieveSync(); 
    } catch (JMSException ex) { 
     Logger.getLogger(HomeLoanJMS.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

이 메시지가 응답자받을 때하지만 난 getReplyTo 대상을 인쇄 않지만 내가 응답을 구축하고 그것을 다시 보낼 때 대상 값이 null로 설정하고 응답이 실행되지 않습니다. 답장 코드는 다음과 같습니다

@MessageDriven(activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
    , @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myTestQueue") 
}) 
public class TestingMDB implements MessageListener { 
    @EJB 
    private SavingBeanRemote savingBean; 
    @Resource(mappedName = "jms/myTestQueue") 
    private Queue myTestQueue; 
    @Inject 
    @JMSConnectionFactory("jms/myTestQueueConnectionFactory") 
    private JMSContext context; 

    public TestingMDB() { 
    } 

    @Override 
    public void onMessage(Message message) { 
     try { 
      if (message instanceof MapMessage) { 
       MapMessage mmsg = (MapMessage) message; 
       String id = mmsg.getString("messageType"); 
       System.out.println(id); 
       String cid = mmsg.getString("C_ID"); 
       System.out.println(cid); 

      } else if (message instanceof TextMessage && (message.getJMSReplyTo() != null)) { 
       TextMessage tm = (TextMessage) message; 
       System.out.println("Received request"); 
       System.out.println("\tTime:  " + System.currentTimeMillis() + " ms"); 
       System.out.println("\tMessage ID: " + tm.getJMSMessageID()); 
       System.out.println("\tCorrel. ID: " + tm.getJMSCorrelationID()); 
       System.out.println("\tReply to: " + tm.getJMSReplyTo()); 
       System.out.println("\tContents: " + tm.getText()); 
       String contents = tm.getText(); 

       Double balance = savingBean.getBalance("c0566664", "a4016692"); 
       String text = (String)balance.toString(); 
       Destination replyDestination = (Destination)message.getJMSReplyTo(); 

       TextMessage replyMessage = context.createTextMessage(); 
       replyMessage.setText(text); 
       replyMessage.setJMSCorrelationID(tm.getJMSMessageID()); 
       context.createProducer().send(replyDestination, replyMessage); 
       System.out.println("Sent reply"); 
       System.out.println("\tTime:  " + System.currentTimeMillis() + " ms"); 
       System.out.println("\tMessage ID: " + replyMessage.getJMSMessageID()); 
       System.out.println("\tCorrel. ID: " + replyMessage.getJMSCorrelationID()); 
       System.out.println("\tReply to: " + replyMessage.getJMSReplyTo()); 
       System.out.println("\tContents: " + replyMessage.getText()); 
       TextMessage tms = context.createTextMessage("Reply from Client"); 

       for (int i = 0; i < 2; i++) { 
        try { 
         try { 
          System.out.println(message.equals(tm)); 

          Thread.sleep(1000); 
          System.out.println(tm.getText()); 
          System.out.println(tm.getText()); 

         } catch (InterruptedException ex) { 
          Logger.getLogger(TestingMDB.class.getName()).log(Level.SEVERE, null, ex); 
         } 

        } catch (JMSException ex) { 
         Logger.getLogger(TestingMDB.class.getName()).log(Level.SEVERE, null, ex); 
        } 

       } 

      } else { 
       System.out.println("error"); 
      } 
     } catch (JMSException ex) { 
      Logger.getLogger(TestingMDB.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

그래서 나는 메시지를 보낼 수 있지만 회신을받을 수 없습니다. 내가 놓치거나 잘못한 것을 도와주세요. 감사합니다.

답변

0

요청 메시지와 응답 메시지 모두에 대해 동일한 대기열 (myTestQueue)을 사용하고있는 것으로 보입니다. 수신자가 발신자/요청자 대신 응답 메시지를 수신하고 있기 때문에 이것은 나쁘다.

일반적으로 JMS를 사용하여 요청/응답을 수행 할 때 요청 메시지를 보내고받은 다음 "수동"구현을 수행하는 것보다 javax.jms.QueueRequestor을 사용하는 것이 좋을 것입니다.

관련 문제