Guava入门~EventBus~Subscribe示例

TradeAccountEvent

package bbejeck.guava.chapter7.events;

import bbejeck.guava.common.model.TradeAccount;
import static com.google.common.base.Preconditions.*;

import java.util.Date;

/**
 * User: Bill Bejeck
 * Date: 4/26/13
 * Time: 10:20 AM
 */
public class TradeAccountEvent {

    private double amount;
    private Date tradeExecutionTime;
    private TradeType tradeType;
    private TradeAccount tradeAccount;

    public TradeAccountEvent(TradeAccount account, double amount, Date tradeExecutionTime, TradeType tradeType) {
        checkArgument(amount > 0.0, "Trade can't be less than zero");
        this.amount = amount;
        this.tradeExecutionTime = checkNotNull(tradeExecutionTime,"ExecutionTime can't be null");
        this.tradeAccount = checkNotNull(account,"Account can't be null");
        this.tradeType = checkNotNull(tradeType,"TradeType can't be null");
    }

    public double getAmount() {
        return amount;
    }

    public Date getTradeExecutionTime() {
        return tradeExecutionTime;
    }

    public TradeType getTradeType() {
        return tradeType;
    }

    public TradeAccount getTradeAccount() {
        return tradeAccount;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof TradeAccountEvent)) return false;

        TradeAccountEvent that = (TradeAccountEvent) o;

        if (Double.compare(that.amount, amount) != 0) return false;
        if (tradeAccount != null ? !tradeAccount.equals(that.tradeAccount) : that.tradeAccount != null) return false;
        if (tradeExecutionTime != null ? !tradeExecutionTime.equals(that.tradeExecutionTime) : that.tradeExecutionTime != null)
            return false;
        if (tradeType != that.tradeType) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result;
        long temp;
        temp = Double.doubleToLongBits(amount);
        result = (int) (temp ^ (temp >>> 32));
        result = 31 * result + (tradeExecutionTime != null ? tradeExecutionTime.hashCode() : 0);
        result = 31 * result + (tradeType != null ? tradeType.hashCode() : 0);
        result = 31 * result + (tradeAccount != null ? tradeAccount.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "TradeAccountEvent{" +
                "amount=" + amount +
                ", tradeExecutionTime=" + tradeExecutionTime +
                ", tradeType=" + tradeType +
                ", tradeAccount=" + tradeAccount +
                "} ";
    }


    public static class Builder {
        private double amount = 1000.43;
        private Date tradeExecutionTime = new Date();
        private TradeType tradeType = TradeType.BUY;
        private TradeAccount tradeAccount = new TradeAccount.Builder().build();

        public Builder(){}

        public Builder amount(double amount) {
            this.amount = amount;
            return this;
        }

        public Builder tradeExecutionTime(Date tradeExecutionTime) {
            this.tradeExecutionTime = tradeExecutionTime;
            return this;
        }

        public Builder tradeType(TradeType tradeType) {
            this.tradeType = tradeType;
            return this;
        }

        public Builder tradeAccount(TradeAccount tradeAccount) {
            this.tradeAccount = tradeAccount;
            return this;
        }

        public TradeAccountEvent build(){
            return new TradeAccountEvent(this.tradeAccount,this.amount,this.tradeExecutionTime,this.tradeType);
        }

    }
}

SimpleTradeAuditor

package bbejeck.guava.chapter7.subscriber.simple;

import bbejeck.guava.chapter7.events.TradeAccountEvent;
import com.google.common.collect.Lists;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import static com.google.common.base.Preconditions.*;

import java.util.List;

/**
 * User: Bill Bejeck
 * Date: 4/26/13
 * Time: 10:39 AM
 */
@Component
public class SimpleTradeAuditor {

    private List<TradeAccountEvent> tradeEvents = Lists.newArrayList();

    @Autowired
    public SimpleTradeAuditor(EventBus eventBus){
        checkNotNull(eventBus,"EventBus can't be null");
        eventBus.register(this);
    }

    @Subscribe
    public void auditTrade(TradeAccountEvent tradeAccountEvent){
        tradeEvents.add(tradeAccountEvent);
        System.out.println("Received trade "+tradeAccountEvent);
    }

    public List<TradeAccountEvent> getTradeEvents() {
        return tradeEvents;
    }
}

测试用例

package bbejeck.guava.chapter7;

import bbejeck.guava.chapter7.events.BuyEvent;
import bbejeck.guava.chapter7.events.SellEvent;
import bbejeck.guava.chapter7.events.TradeAccountEvent;
import com.google.common.eventbus.EventBus;

/**
 * User: Bill Bejeck
 * Date: 4/28/13
 * Time: 8:01 PM
 */
public abstract class EventBusTestBase {


    protected TradeAccountEvent.Builder getTradeAccountEventBuilder(){
        return new TradeAccountEvent.Builder();
    }

    protected BuyEvent.Builder buyEventBuilder(){
        return new BuyEvent.Builder();
    }

    protected SellEvent.Builder sellEventBuilder(){
        return new SellEvent.Builder();
    }

    protected EventBus getEventBus() {
        return new EventBus();
    }



}
package bbejeck.guava.chapter7.subscriber;

import bbejeck.guava.chapter7.EventBusTestBase;
import bbejeck.guava.chapter7.events.TradeAccountEvent;
import bbejeck.guava.chapter7.events.TradeType;
import bbejeck.guava.chapter7.subscriber.simple.SimpleTradeAuditor;
import com.google.common.eventbus.EventBus;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

/**
 * User: Bill Bejeck
 * Date: 4/28/13
 * Time: 8:24 PM
 */
public class SimpleTradeAuditorTest extends EventBusTestBase {

    private SimpleTradeAuditor auditor;
    private EventBus eventBus;
    private TradeAccountEvent.Builder builder;

    @Before
    public void setUp() {
        eventBus = getEventBus();
        auditor = new SimpleTradeAuditor(eventBus);
        builder = getTradeAccountEventBuilder();
    }

    @Test
    public void testSubscribeBuy() throws Exception {
        TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.BUY).amount(5000.89).build();
        eventBus.post(tradeAccountEvent);
        List<TradeAccountEvent> events = auditor.getTradeEvents();
        assertThat(events.get(0).getTradeType(), is(TradeType.BUY));
        assertThat(events.get(0).getAmount(), is(5000.89));
    }

    @Test
    public void testSubscribeSell() throws Exception {
        TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.SELL).amount(5000.89).build();
        eventBus.post(tradeAccountEvent);
        List<TradeAccountEvent> events = auditor.getTradeEvents();
        assertThat(events.get(0).getTradeType(), is(TradeType.SELL));
        assertThat(events.get(0).getAmount(), is(5000.89));
    }

    @Test
    public void testSubscribeBuySell() throws Exception {
        TradeAccountEvent tradeAccountEvent = builder.tradeType(TradeType.SELL).amount(5000.89).build();
        eventBus.post(tradeAccountEvent);
        tradeAccountEvent = builder.tradeType(TradeType.BUY).amount(80000).build();
        eventBus.post(tradeAccountEvent);
        List<TradeAccountEvent> events = auditor.getTradeEvents();

        assertThat(events.get(0).getTradeType(), is(TradeType.SELL));
        assertThat(events.get(0).getAmount(), is(5000.89));

        assertThat(events.get(1).getTradeType(), is(TradeType.BUY));
        assertThat(events.get(1).getAmount(), is(80000D));
    }

}


版权声明:本文为gqltt原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。