こんにちは皆さん、2 つのエンタープライズ アプリケーション間のブリッジを構築する必要があるアプリケーションを開発する必要があり、これら 2 つのアプリケーション間の通信を確立するために JMS を使用しています。ここでは、メッセージ駆動型 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 宛先を出力しますが、返信を作成して送り返すと、宛先値が 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);
}
}
}
メッセージを送信できるのに返信を受信できないというのはどういうことですか。何が足りないのか、間違っているのか教えてください。ありがとう