java—从twitter上检索用户的关注者列表

juud5qan  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(283)

我试图检索一个用户的追随者列表,以便以后我可以在一些螺栓中使用该列表,但无论我做什么,我总是得到以下错误:

16374 [Thread-32-twitterSpout] ERROR backtype.storm.util - Async loop died!
java.lang.NullPointerException: null
    at storm.spout.twitterSpout.nextTuple(twitterSpout.java:136) ~[classes/:na]
    at backtype.storm.daemon.executor$fn__5573$fn__5588$fn__5617.invoke(executor.clj:563) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45]
16375 [Thread-32-twitterSpout] ERROR backtype.storm.daemon.executor - 
java.lang.NullPointerException: null
    at storm.spout.twitterSpout.nextTuple(twitterSpout.java:136) ~[classes/:na]
    at backtype.storm.daemon.executor$fn__5573$fn__5588$fn__5617.invoke(executor.clj:563) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45]
16376 [Thread-34-twitterSpout] ERROR backtype.storm.util - Async loop died!
java.lang.NullPointerException: null
    at storm.spout.twitterSpout.nextTuple(twitterSpout.java:136) ~[classes/:na]
    at backtype.storm.daemon.executor$fn__5573$fn__5588$fn__5617.invoke(executor.clj:563) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45]
16376 [Thread-34-twitterSpout] ERROR backtype.storm.daemon.executor - 
java.lang.NullPointerException: null
    at storm.spout.twitterSpout.nextTuple(twitterSpout.java:136) ~[classes/:na]
    at backtype.storm.daemon.executor$fn__5573$fn__5588$fn__5617.invoke(executor.clj:563) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) ~[storm-core-0.9.2-incubating.jar:0.9.2-incubating]
    at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45]

下面是我在上次尝试使用declareoutputfields、open和nexttuple函数时使用的代码:

@Override
    public void declareOutputFields(OutputFieldsDeclarer declarer){
        declarer.declare(new Fields("status","followers"));
    }

    @Override
    public void open(Map map,TopologyContext context,SpoutOutputCollector collector){
        queue=new LinkedBlockingQueue<Status>(10000);
        this.collector=collector;

        ConfigurationBuilder builder=new ConfigurationBuilder();
        Configuration configuration=builder.setOAuthAccessToken(accessToken).setOAuthAccessTokenSecret(accessTokenSecret).setOAuthConsumerKey(consumerKey).setOAuthConsumerSecret(consumerSecret).build();

        StatusListener listener=new StatusListener() {
            @Override
            public void onStatus(Status status) {
                queue.offer(status);
            }

            @Override
            public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {

            }

            @Override
            public void onTrackLimitationNotice(int numberOfLimitedStatuses) {

            }

            @Override
            public void onScrubGeo(long userId, long upToStatusId) {

            }

            @Override
            public void onStallWarning(StallWarning warning) {

            }

            @Override
            public void onException(Exception ex) {
                      ex.printStackTrace();
            }
        };

        twitterStream=new TwitterStreamFactory(configuration).getInstance();
        twitterStream.addListener(listener);

        Twitter twitter=new TwitterFactory(configuration).getInstance();

        if(filterQuery!=null){
            twitterStream.filter(filterQuery);
        }else{
            twitterStream.sample();
        }

    }

    @Override
    public void nextTuple() {
        Status ret=queue.poll();
        long userID=ret.getUser().getId();
        IDs followersIDs;

        if(ret==null){
            backtype.storm.utils.Utils.sleep(10000);
        }else{

                try{
                    followersIDs=twitter.getFollowersIDs(userID);
                    collector.emit(new Values(ret,followersIDs));
                }catch (TwitterException tex){
                    tex.printStackTrace();
                }
        }
    }
sshcrbum

sshcrbum1#

我想你的问题是

Status ret=queue.poll();
long userID=ret.getUser().getId();

如果 retnull ? 你将得到npe,而试图获得用户
你检查空值,但为时已晚。。。。我建议:
检查是否 retnull 就在比赛结束后 poll 添加 ret 跟踪 poll 所以它会帮助你调试

相关问题