1

Javaで非同期処理を行うにはどうすればよいですか?

私のプログラムには、2 つのプロセスがあります。

  1. 顧客に通知メッセージをメールで送信します。
  2. 注文情報をデータベースに追加します。

sendMessage()と の並列処理をしたいと思いますaddNewOrder()。実は、私は未経験ですMulti-Threading

OrderService.java

public void addNewOrder(Order order) {
    mailer.sendMessage(order.getCustomer());
    orderDAO.insert(order);
}

SMTPMailer.java

public void sendMessage(Customer customer) {
    // send notification message
}

OrderDAO.java

public void insert(Order order) {
    // insert order to database
}

プロセスが失敗しinsert()てもメソッドを実行する必要があります。sendMessage()

ところで、私の開発環境は

  1. JBoss 7.1
  2. 春 3.0。
  3. JSF 2.0 と Primefaces 3.5
  4. JPA2.0
  5. JBoss シーム 2.3
4

3 に答える 3

0

ExecutorService を使用して、より洗練されたソリューションを実現できます。

// prepare the callables 
    class MailerCallable implements Callable<Void>{

        Customer customer;
        public MailerCallable(Customer customer){
            this.customer = customer;
        }
        @Override
        public Void call() throws Exception {
            mailer.sendMessage(customer);
            return null;
        }
    }

    class OrderCallable implements Callable<Void>{

        Order order;

        public OrderCallable(Order order){
            this.order = order;
        }
        @Override
        public Void call() throws Exception {
            orderDAO.insert(order);
            return null;
        }
    }

    // prepare the executor service
    ExecutorService service = Executors.newFixedThreadPool(2);
    List<Callable<Void>> callables = new ArrayList<Callable<Void>>();
    callables.add(new MailerCallable(order.getCustomer()));
    callables.add(new OrderCallable(order));

    // execute all and wait for the results
    try{
        service.invokeAll(callables);
    }
    catch (InterruptedException e){
        e.printStackTrace();
    }
于 2013-07-29T08:40:49.307 に答える