2013-11-28 2 views
0

Я только что начал с 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.

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

ответ

0

Возможно, есть файл jndi.properties, в котором определено соединение с стеклянной рыбкой

Смежные вопросы