как отправить ответ jms в корпоративных приложениях java

Привет, ребята, мне нужно разработать приложение, в котором я должен построить мост между двумя корпоративными приложениями, и я использую JMS для установления связи между этими двумя приложениями. Здесь я использую Message Driven Bean для отправки сообщения 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);
        }
    }
}

так что происходит, что я могу отправить сообщение, но не могу получить ответ. пожалуйста, помогите мне, что я упускаю или делаю неправильно. Благодарность


person monty    schedule 29.09.2013    source источник


Ответы (1)


Похоже, вы используете одну и ту же очередь (myTestQueue) как для сообщения запроса, так и для сообщения ответа. Это плохо, потому что вы-получатель можете получать ответное сообщение вместо отправителя/запрашивающего.

В общем, при выполнении запроса/ответа с помощью JMS использование javax.jms.QueueRequestor должно быть лучше, чем выполнение «ручной» реализации с отправкой сообщения запроса с последующей попыткой его получить.

person Miichi    schedule 29.09.2013