У меня есть приложение, которое использует временные таблицы (существовавшие в рамках сеанса пользователя) и комплексную обработку данных.
В целях отладки мне нужно выполнять запросы к этим временным таблицам во время обработки приложения.
Я добавил некоторую дополнительную логику в качестве аспектов (AspectJ) и запустил свое приложение как ткацкое приложение во время загрузки в Eclipse (используя плагин ткачества AJDT / JDT).
Я делаю следующее: после получения нового соединения я создаю другой поток с графическим интерфейсом и передаю ему соединение (будет описано позже).
После каждого запроса основной поток приложения ожидает сообщения от потока графического интерфейса, чтобы продолжить работу (что дает мне возможность выполнять запросы и видеть промежуточные результаты во временных таблицах). Обмен сообщениями осуществляется с помощью BlockingQueue.
В графическом интерфейсе у меня есть рамка с текстовой областью для запроса и две кнопки «Выполнить запрос» и «Освободить основной поток».
Я хотел, чтобы нажатие кнопки «Выполнить запрос» выполняло запрос и показывало результаты во фрейме. А нажатие на кнопку «Освободить основную ветку» отправит сообщение в основную ветку для продолжения работы.
Проблема в том, что когда основной поток ожидает blockingQueue.take (), нажатие кнопки «Выполнить запрос» приводит к зависанию кадра и ничего не делать (похоже, графический интерфейс перестает отвечать на запросы).
Когда основной поток ожидает blockingQueue.take (), «Release main thread» отлично разветвляется (но не после нажатия «Run query»).
Когда основной поток работает (я поместил много объектов в очередь), кнопка «Выполнить запрос» работает нормально, и я вижу результаты запроса.
Сначала я попробовал манипуляции с EDT и диспетчеризацией событий, но мне ничего не помогло. У вас есть идеи по поводу проблемы?
//aspect on 'newConnection' pointcut
after() returning (final Connection connection): newConnection() {
gUI = new Runnable() {
public void run() {
new GuiView(blockingQueue, connection);
}
};
SwingUtilities.invokeLater(gUI);
}
//GuiView code extract for button with query data retrieval action
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
ResultSet rs = ConnectionManipulator.executeStatement(
queryTextAreaG.getText()
);
///....result parsing logic
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "Exception!");
} finally {
}
//....result out logic
}
});