2015-02-24 3 views
1

У меня возникли трудности с регистрацией нескольких экземпляров одного класса на одну шину событий guava. Если зарегистрирован один экземпляр класса, он работает нормально, если я пытаюсь зарегистрировать более одного экземпляра, он выдает исключение handlerException. Полная ошибка:Guava EventBus throwing handlerExcionion, когда на шине регистрируются разные экземпляры одного и того же класса.

Feb 24, 2015 10:37:25 PM com.google.common.eventbus.EventBus$LoggingSubscriberExceptionHandler handleException 

SEVERE: Could not dispatch event: backend.modules.SingleSeriesLineChartModule[,2,25,834x485,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] to public void backend.modules.SingleSeriesLineChartModule.serialDataEventHandler(backend.serial.SerialDataEvent) 

Вот как я регистрации слушателей:

 module1 = new SingleSeriesLineChartModule("Test Graph1", moduleContainer, tabbedPane1, "AA", "Var"); 
     serialCommunicator.serialRegister(module1); 
     module2 = new SingleSeriesLineChartModule("Test Graph1", moduleContainer, tabbedPane2, "AA", "Var"); 
     serialCommunicator.serialRegister(module2); 
     module3 = new SingleSeriesLineChartModule("Test Graph3", moduleContainer, tabbedPane3, "AA", "Var"); 
     serialCommunicator.serialRegister(module3); 
     module4 = new SingleSeriesLineChartModule("Test Graph4", moduleContainer, tabbedPane4, "AA", "Var"); 
     serialCommunicator.serialRegister(module4); 

Регистрирующий код в классе SerialCommunicator:

public void serialRegister(Object registree){ 
     serialEventBus.register(registree); 
    } 

    public void serialUnregister(Object unregistree){ 
     serialEventBus.unregister(unregistree); 
    } 

serialEventBus является лишь неопубликованные гуавы eventBus

SingleSeriesLineChartModule (длинное имя е Я знаю, я работаю над этим):

public class SingleSeriesLineChartModule extends AbstractModule{ 

    private final String SERIAL_KEY; 
    private final String Y_AXIS_LABEL; 
    private static XYSeries series; 

    public SingleSeriesLineChartModule(String title, ModuleContainer container, JTabbedPane tabbedPane, String serialKey, String yAxisLabel) { 
     super(title, container, tabbedPane); 
     SERIAL_KEY = serialKey; 
     Y_AXIS_LABEL = yAxisLabel; 

     series = new XYSeries(SERIAL_KEY, false, false); 

     JFreeChart chart = createChart(new XYSeriesCollection(series)); 
     ChartPanel chartPanel = new ChartPanel(chart); 
     this.add(chartPanel); 

    } 

    private JFreeChart createChart(XYDataset data){ 
     JFreeChart chart = ChartFactory.createXYLineChart(TITLE, "Time(s)", Y_AXIS_LABEL, data); 
     XYPlot plot = (XYPlot)chart.getPlot(); 
     plot.setRangePannable(true); 
     plot.setDomainPannable(true); 
     NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis(); 
     numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 
     return chart; 
    } 

    @Override 
    @Subscribe 
    public void serialDataEventHandler(SerialDataEvent event) { 
     if(event.getKey().equals(SERIAL_KEY)){ 
      series.add(System.currentTimeMillis(), event.getData()); 
     } 
    } 
} 

AbstractModule не имеет ничего общего с eventBussing и расширяет JPanel. Я очень смущен и не вижу причин, почему это не работает. Если у кого-то есть какие-то идеи, я бы очень признателен, и если вам нужен еще какой-то код, я с радостью его предоставил.

Спасибо.

Редактировать: последний из созданных SingleSeriesLineChartModules восстанавливает событие нормально, другие 3 не могут его оживить. Кажется, не имеет значения, регистрирую ли я все, кроме одного экземпляра, или нет, они все еще считаются зарегистрированными i.e, если я регистрирую модуль1, модули 2-4 действуют так, как если бы они зарегистрированы

+0

У исключения есть трассировка стека? –

+0

'@ Override' и' @ Подписаться' добавляются в метод 'serialDataEventHandler'. Это означает, что 'AbstractModule' определяет этот метод. Можем ли мы увидеть полное определение 'serialDataEventHandler' в' AbstractModule'? –

+0

Также, какую версию Guava вы используете. Увидев текстовое сообщение, кажется, что между 15 и 17 включенными. Можете ли вы воспроизвести проблему с 18? –

ответ

0

Я нашел проблему. Похоже, что статичность XYSeries означает, что она затем переносится во все экземпляры класса, поэтому, когда новое значение добавляется в серию для каждого экземпляра, после того, как он имеет дело с первым в очереди, другие получают одинаковые серии, когда вы пытаетесь добавить еще одну точку данных с тем же значением X, что и существующее (что вам не разрешено делать), он выдает ошибку, которая полностью возвращается к событию guava. На самом деле это не проблема с guava! Все, что мне нужно сделать, это сделать XYSeries нестатичным

Извините за то, что потратил время!