stoppen Sie den Twitter-stream und zurückgeben der Liste der status mit twitter4j
Mit dem code-Beispiel von Twitter4j, möchte ich t-stop, die stream nach einer Liste der 1.000-status erhoben wurden, und wieder in dieser Liste. Wie kann ich das tun?
public class Stream {
public List<Status> execute throws TwitterException {
List<Status> statuses = new ArrayList();
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true);
cb.setOAuthConsumerKey("bbb");
cb.setOAuthConsumerSecret("bbb");
cb.setOAuthAccessToken("bbb");
cb.setOAuthAccessTokenSecret("bbb");
TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
StatusListener listener = new StatusListener() {
public void onStatus(Status status) {
statuses.add(status);
if (statuses.size>1000){
//return statuses. Obviously that's not the correct place for a return statement...
}
}
public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
}
public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
}
public void onScrubGeo(long userId, long upToStatusId) {
System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
}
public void onException(Exception ex) {
ex.printStackTrace();
}
};
FilterQuery fq = new FilterQuery();
String keywords[] = {"Keyword 1", "Keyword 2"};
fq.track(keywords);
twitterStream.addListener(listener);
twitterStream.filter(fq);
}
- Hast u bekommen, eine Lösung?
- Nein... immer noch Interesse an einer Antwort!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht eine gute Idee, um eine asynchrone code in den synchronen Modus schaltet. Bitte sehen https://stackoverflow.com/a/5934656/276263
Sehen Sie, wenn Sie können überarbeiten Sie Ihre Logik.
Jedoch, der code unten funktioniert, wie pro Ihre Anforderung.
Erwägen Sie die Verwendung einer
BlockingQueue
als Vermittler, der mithilfe der listener hinzu, dieStatus
Objekte an.Nachdem der stream gestartet wurde können Sie mit der Einnahme beginnen
Status
es aus der Warteschlange, bis Sie die tausend, die Sie benötigen.Als Ausgangspunkt, würde es wie folgt Aussehen:
Gibt es zwei Möglichkeiten:
Wenn Sie nur brauchen, um zu beenden den thread, verbraucht Strom (das ist der thread, der fordert, Ihr Hörer), können Sie sich
twitterStream.cleanUp();
. Diese werden ordnungsgemäß beenden Sie den thread. Sie möchten möglicherweise verwenden Sie eineboolean stopped
variable in Ihrem status-listener so zu ignorieren, die Anrufe, die Sie erhalten, nachdem dieses Ereignis.Schließen Sie die Strom verbrauchen-thread zusammen mit dem dispatcher-thread (das ist ein deamon-thread) durch den Aufruf
twitterStream.shutdown();
dies ist Jedoch ein brutaler Ansatz, endet die Kommunikation mit der twitter API. Obwohl es funktioniert, wenn Sie rufen Sie diese aus dem inneren der Zuhörer, ich würde lieber den Ansatz vorgeschlagen, durch @krishnakumarp