2013-09-29 39 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目的地,但是当我建立一个答复,并发送回它设定的目标值为空,并且永远不会执行答复。回复代码如下

@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应该比发送请求消息并尝试接收请求消息时执行“手动”实现要好。

相关问题