В чем заключается магия Java ee jms?

Я только начал с Java ee 7, и вот что я не мог понять, как это волшебным образом работает.

Я следую примеру из книги Антонио Гонсалвеса Beginning 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();
    }
  }
}

Содержимое msg, инкапсулированное в объект POJO, который реализует интерфейс Serializable

ExpensiveOrderMDB, а POJO упакован в файл .jar и развернут на сервере Glassfish, работающем локально. Ресурсы для подключения и назначения созданы asadmin.

Вопрос: как потребитель и производитель могут узнать, что соединение и пункт назначения доступны на локальном сервере Glassfish, чтобы он мог установить соединение и отправить/получить сообщение? (Строки, которые создают соединение и место назначения, ничего не говорят о локальном сервере Glassfish)


person jAckOdE    schedule 28.11.2013    source источник


Ответы (1)


Вероятно есть файл jndi.properties в котором определяется подключение к стекляннице

person andi    schedule 29.11.2013