Hallo Community;
ich schreibe eine Anwendung, die erstens vom SwingWorker bestimmt wird und in der zweitens Objekte miteinander über den Austausch von Nachrichten nach dem Observer-Prinzip kommunizieren, wobei dies in einer Endlosschleife (while(true)) läuft.
Ich zeige hier einen Ausschnitt, d.h. es gibt noch mehr Objekte für die Informationsweiterleitung...
In der GUI soll der Anwender diese Schleife über einen Stop-Button beenden können. Hierzu habe ich ein statisches Flag in der GUI Klasse, das beim Button-Klick auf true gesetzt wird. Die Methoden der Objekte prüfen nun bei (fast) jeder Anweisung, ob das Flag gesetzt ist. Bei erfolgreicher Prüfung (true) wird die jeweilige Methode beendet (return).
Und dennoch bekomme ich eine NullPointerException für notifyObservers(Observer). ???:L
Bitte nicht wundern, da ich viele eigene Kommentare für eine bessere Lesbarkeit für euch entfernt habe, stimmen die Zeilennummern in der Meldung nicht mehr.
TweetTransformer.java:53 --> 46
TwitterMonitor.java:179-->102
TwitterMonitor.java:63 --> 43
Wie kann ich das beheben?
Vielen Dank vorab.
LG Antje
Observer:
Observable:
GUI:
ich schreibe eine Anwendung, die erstens vom SwingWorker bestimmt wird und in der zweitens Objekte miteinander über den Austausch von Nachrichten nach dem Observer-Prinzip kommunizieren, wobei dies in einer Endlosschleife (while(true)) läuft.
Ich zeige hier einen Ausschnitt, d.h. es gibt noch mehr Objekte für die Informationsweiterleitung...
In der GUI soll der Anwender diese Schleife über einen Stop-Button beenden können. Hierzu habe ich ein statisches Flag in der GUI Klasse, das beim Button-Klick auf true gesetzt wird. Die Methoden der Objekte prüfen nun bei (fast) jeder Anweisung, ob das Flag gesetzt ist. Bei erfolgreicher Prüfung (true) wird die jeweilige Methode beendet (return).
Und dennoch bekomme ich eine NullPointerException für notifyObservers(Observer). ???:L
Bitte nicht wundern, da ich viele eigene Kommentare für eine bessere Lesbarkeit für euch entfernt habe, stimmen die Zeilennummern in der Meldung nicht mehr.
TweetTransformer.java:53 --> 46
TwitterMonitor.java:179-->102
TwitterMonitor.java:63 --> 43
Java:
Exception in thread "Thread-2" java.lang.NullPointerException
at com.espertech.esper.core.EPRuntimeImpl.processEvent(EPRuntimeImpl.java:389)
at com.espertech.esper.core.EPRuntimeImpl.sendEvent(EPRuntimeImpl.java:212)
at SocialMediaCEP.Network.TweetTransformer.update(TweetTransformer.java:53)
at java.util.Observable.notifyObservers(Unknown Source)
at SocialMediaCEP.Network.TwitterMonitor.checkTwitter(TwitterMonitor.java:179)
at SocialMediaCEP.Network.TwitterMonitor.startMonitor(TwitterMonitor.java:63)
at SocialMediaCEP.GUI.CEPFrame$1.construct(CEPFrame.java:127)
at SocialMediaCEP.util.SwingWorker$2.run(SwingWorker.java:151)
at java.lang.Thread.run(Unknown Source)
Wie kann ich das beheben?
Vielen Dank vorab.
LG Antje
Observer:
Java:
package SocialMediaCEP.Network;
import java.sql.Date;
import java.util.Observable;
import java.util.Observer;
import com.espertech.esper.client.EPRuntime;
import com.sun.syndication.feed.synd.SyndEntry;
import SocialMediaCEP.EventBean.BaseEvent;
import SocialMediaCEP.EventBean.InputEvent;
import org.apache.log4j.Logger;
import SocialMediaCEP.GUI.CEPFrame;
public class TweetTransformer implements Observer extends Observable{
private static Logger log = Logger.getLogger(TweetTransformer.class);
private EPRuntime runtime;
public TweetTransformer(EPRuntime runtime) {
this.runtime = runtime;
}
public void update(Observable o, Object arg) {
if (CEPFrame.getStopFlag() == true)
return;
SyndEntry tweetEntry = (SyndEntry) arg;
java.util.Date entrytimeUtil = tweetEntry.getPublishedDate();
java.sql.Date entrytime = new Date(entrytimeUtil.getTime());
// Infos aus Feed extrahieren
if (CEPFrame.getStopFlag() == true)
return;
String title = tweetEntry.getTitle().split("\n")[0];
String link = tweetEntry.getLink();
String author = tweetEntry.getAuthor();
// zu Objekt transformieren
if (CEPFrame.getStopFlag() == true)
return;
BaseEvent tmp = new InputEvent(title, entrytime, link, author);
if (CEPFrame.getStopFlag() == false){
runtime.sendEvent(tmp);
} else
return;
Database db = new Database();
db.saveInputEvents((InputEvent) tmp);
}
}
Observable:
Java:
package SocialMediaCEP.Network;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import SocialMediaCEP.GUI.CEPFrame;
import org.apache.log4j.Logger;
import twitter4j.TwitterException;
import twitter4j.http.HttpClient;
import twitter4j.http.Response;
import java.io.IOException;
import java.sql.Date;
import java.util.List;
import java.util.Observable;
import java.util.Properties;
public class TwitterMonitor extends Observable {
private static int sleepingtime;
private static Logger log = Logger.getLogger(TwitterMonitor.class);
public TwitterMonitor() {
}
public void startMonitor() {
if (CEPFrame.getStopFlag() == true)
return;
try{
sleepingtime = 1;
//Endlosschleife, die auf Wunsch beendet werden soll
while (true){
if (CEPFrame.getStopFlag() == true)
return;
Properties prop= new Properties();
prop.load(this.getClass().getResourceAsStream("/statement.properties"));
String brandProp = prop.getProperty("brands");
String brands = brandProp.replaceAll(", ","+OR+");
String twitterurl = "http://search.twitter.com/search.atom?q="+ brands
+"&resulttype=mixed&rpp=100";
log.info("CheckTwitter aufrufen.");
if (CEPFrame.getStopFlag() == false){
checkTwitter(sleepingtime, twitterurl);
}
else return;
if (CEPFrame.getStopFlag() == false){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else return;
}
}
catch (IOException e){
log.error("Configuration file not found:" + e.getMessage());
}
}
private void checkTwitter(Integer sleepingtime, String twitterURL){
HttpClient http = new HttpClient();
int page = 1;
try{
try{
Properties prop = new Properties();
prop.load(this.getClass().getResourceAsStream("/statement.properties"));
String brands = prop.getProperty("brands");
log.info("Searching for "+ brands);
} catch (IOException e) {
log.error("Configuration file not found:" + e.getMessage());
}
String pageurl = twitterURL + "&page=" + page;
Response res;
List<SyndEntry> entries;
res = http.get(pageurl);
entries = new SyndFeedInput().build(res.asDocument()).getEntries();
if (CEPFrame.getStopFlag() == false){
log.info("Page "+ (page -1 )+" mit "+entries.size()+" Tweets gesamt.");
}
else return;
if (CEPFrame.getStopFlag() == false){
log.info ("Prüfe Liste auf Neuheiten");
}
else return;
for(SyndEntry entry : entries){
if (CEPFrame.getStopFlag() == false){
setChanged();
}
else
return;
if (CEPFrame.getStopFlag() == false){
notifyObservers(entry);
}
else
return;
}
if (CEPFrame.getStopFlag() == false){
}
else return;
notifyObservers(entries);
}catch (TwitterException te){
log.info("Failed to fetch the feed: " + te.getMessage());
}catch (FeedException fe){
log.info("Failed to parse the feed: " +fe.getMessage());
}
}
}
GUI:
Java:
package SocialMediaCEP.GUI;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import org.apache.log4j.Logger;
import SocialMediaCEP.util.SwingWorker;
import SocialMediaCEP.Start;
import SocialMediaCEP.Stop;
import SocialMediaCEP.EventBean.stopMonitoring;
import SocialMediaCEP.Network.ServiceBrandMonitor;
import SocialMediaCEP.Network.TweetTransformer;
import SocialMediaCEP.Network.TwitterMonitor;
import info.clearthought.layout.TableLayout;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class CEPFrame extends javax.swing.JFrame {
private JTabbedPane jTabbedPane1;
private JPanel jPanel1;
private JButton jButton1;
private JPanel email;
private JPanel marken;
private JPanel mainPanel;
private JPanel kopfpanel2;
private JTextField jTextField1;
private JPanel ueberschrift2;
private JPanel ueberschrift1;
private JPanel fuss;
private JPanel main;
private JPanel kopf;
private JButton jButton2;
private JLabel jLabel9;
private JLabel jLabel8;
private JLabel jLabel3;
private JTextField jTextField10;
private JLabel jLabel12;
private JTextField jTextField4;
private JTextField user;
private JTextField jTextField3;
private JTextField jTextField2;
private JLabel jLabel7;
private JLabel jLabel6;
private JLabel jLabel5;
private JLabel jLabel4;
private JPanel jPanel3;
private JPanel jPanel2;
private JLabel jLabel1;
private JPanel buttonPanel;
private JPanel fußpanel;
private JPanel kopfPanel;
private static Boolean stopFlag = false;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
CEPFrame inst = new CEPFrame();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
private static Logger log = Logger.getLogger(Start.class);
String host;
String username;
String password;
String recipientsAddress;
String brands;
String limitUp;
private SwingWorker cepApp = new SwingWorker() {
public Object construct() {
TwitterMonitor twittermonitor = new TwitterMonitor();
TweetTransformer tweetTransformer = new
TweetTransformer(ServiceBrandMonitor.getRuntime());
try{
twittermonitor.addObserver(tweetTransformer);
log.info("TweetTransformer am Twittermonitor registriert.");
}
catch(Exception e){
log.error(""+ e.getMessage());
}
twittermonitor.startMonitor();
return null;
}
};
public CEPFrame() {
super();
initGUI();
}
private void initGUI() {
try {
//Property-Datei laden
final Properties propGUI = new Properties();
try {
propGUI.load(this.getClass().getResourceAsStream("/statement.properties"));
} catch (IOException e1) {
e1.printStackTrace();
}
//Properties setzen
host = propGUI.getProperty("hostMail");
username = propGUI.getProperty("usernameMail");
password = propGUI.getProperty("passwordMail");
recipientsAddress = propGUI.getProperty("mailReceiver");
brands = propGUI.getProperty("brands");
limitUp = propGUI.getProperty("limitUp");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setTitle("CEP Monitoring");
{
jTabbedPane1 = new JTabbedPane();
getContentPane().add(jTabbedPane1, BorderLayout.CENTER);
jTabbedPane1.setPreferredSize(new java.awt.Dimension(458, 262));
{
jPanel1 = new JPanel();
BorderLayout jPanel1Layout = new BorderLayout();
jPanel1.setLayout(jPanel1Layout);
jTabbedPane1.addTab("Allgemein", null, jPanel1, null);
jPanel1.setPreferredSize(new java.awt.Dimension(379, 182));
{
fußpanel = new JPanel();
BoxLayout fußpanelLayout = new BoxLayout(fußpanel,
javax.swing.BoxLayout.X_AXIS);
fußpanel.setLayout(fußpanelLayout);
jPanel1.add(fußpanel, BorderLayout.SOUTH);
fußpanel.setPreferredSize(new java.awt.Dimension(379, 118));
{
buttonPanel = new JPanel();
GridBagLayout buttonPanelLayout = new GridBagLayout();
buttonPanelLayout.rowWeights = new double[] {0.1, 0.1,
0.1, 0.1};
buttonPanelLayout.rowHeights = new int[] {7, 7, 7, 7};
buttonPanelLayout.columnWeights = new double[] {0.1,
0.1, 0.1, 0.1};
buttonPanelLayout.columnWidths = new int[] {7, 7, 7, 7};
buttonPanel.setLayout(buttonPanelLayout);
fußpanel.add(buttonPanel);
buttonPanel.setPreferredSize(new java.awt.Dimension(463,
136));
{
jButton1 = new JButton();
buttonPanel.add(jButton1, new GridBagConstraints(1,
0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0,
0));
jButton1.setText("Start Monitoring");
jButton1.setSize(50, 23);
jButton1.setPreferredSize(new
java.awt.Dimension(130, 36));
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == jButton1){
Start.start();
cepApp.start();
}
}
});
}
{
jButton2 = new JButton();
buttonPanel.add(jButton2, new GridBagConstraints(2,
0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.NONE, new Insets(0, 0,
0, 0), 0, 0));
jButton2.setText("Stop");
jButton2.setPreferredSize(new
java.awt.Dimension(121, 36));
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == jButton2){
Stop.stop();
stopFlag = true;
cepApp.kill();
}
}
});
}
}
}
}
pack();
this.setSize(518, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Boolean getStopFlag(){
return stopFlag;
}
public static void setStopFlag(Boolean stopFlagNew){
stopFlag = stopFlagNew;
}
}