Я только что начал с Java ee 7, и вот что-то, что я не мог понять, как это магически работает.Какова магия за сценой Java ee jms?
Я следую примеру из книги «Начало Java EE 7» Антонио Гонсалвеса. Мне удалось скомпилировать и развернуть код главы 13 (о JMS) без каких-либо проблем. Сообщения отправляются и принимаются, как ожидалось, но это меня смущает.
Исходный код является составным для класса потребителей, класса производителя, класса POJO и MDB.
здесь потребитель:
public class OrderConsumer {
public static void main(String[] args) throws NamingException {
// Gets the JNDI context
Context jndiContext = new InitialContext();
// Looks up the administered objects
ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/javaee7/ConnectionFactory");
Destination topic = (Destination) jndiContext.lookup("jms/javaee7/Topic");
// Loops to receive the messages
System.out.println("\nInfinite loop. Waiting for a message...");
try (JMSContext jmsContext = connectionFactory.createContext()) {
while (true) {
OrderDTO order = jmsContext.createConsumer(topic).receiveBody(OrderDTO.class);
System.out.println("Order received: " + order);
}
}
}
}
производитель:
public class OrderProducer {
public static void main(String[] args) throws NamingException {
if (args.length != 1) {
System.out.println("usage : enter an amount");
System.exit(0);
}
System.out.println("Sending message with amount = " + args[0]);
// Creates an orderDto with a total amount parameter
Float totalAmount = Float.valueOf(args[0]);
OrderDTO order = new OrderDTO(1234l, new Date(), "Serge Gainsbourg", totalAmount);
// Gets the JNDI context
Context jndiContext = new InitialContext();
// Looks up the administered objects
ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/javaee7/ConnectionFactory");
Destination topic = (Destination) jndiContext.lookup("jms/javaee7/Topic");
try (JMSContext jmsContext = connectionFactory.createContext()) {
// Sends an object message to the topic
jmsContext.createProducer().setProperty("orderAmount", totalAmount).send(topic, order);
System.out.println("\nOrder sent : " + order.toString());
}
}
}
ПДБ:
@MessageDriven(mappedName = "jms/javaee7/Topic", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "orderAmount > 1000")
})
public class ExpensiveOrderMDB implements MessageListener {
public void onMessage(Message message) {
try {
OrderDTO order = message.getBody(OrderDTO.class);
System.out.println("Expensive order received: " + order.toString());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
Содержание сообщ инкапсулируется в объекте POJO, который реализует Serializable
интерфейс
ExpensiveOrderMDB
и POJO упакован в файл .jar и разворачивается на серверной панели, работающей локально. Замены о подключении и восстановлении создаются asadmin
.
Вопрос: Как потребитель и производитель могут знать, что соединение и пункт назначения доступны на локальном сервере из стекла, чтобы он мог установить соединение и отправить/получить сообщение? (Строки, которые создают соединение и пункт назначения, ничего не говорят о локальном сервере озерной рыбы)