У меня возникли трудности с регистрацией нескольких экземпляров одного класса на одну шину событий 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 действуют так, как если бы они зарегистрированы
У исключения есть трассировка стека? –
'@ Override' и' @ Подписаться' добавляются в метод 'serialDataEventHandler'. Это означает, что 'AbstractModule' определяет этот метод. Можем ли мы увидеть полное определение 'serialDataEventHandler' в' AbstractModule'? –
Также, какую версию Guava вы используете. Увидев текстовое сообщение, кажется, что между 15 и 17 включенными. Можете ли вы воспроизвести проблему с 18? –