apache storm สร้างการใช้งาน bolt อย่างไร

หลังจากใช้โทโพโลยี apache storm ที่เรียบง่ายใน java ฉันพบ NPE ซึ่งทำให้เกิดความสับสน

นี่เป็นวิธีการหลักของฉัน:

TologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new CustomSpout(true), 4);
final CustomBolt bolt = new CustomBolt();
builder.setBolt("bolt", bolt, 1).shuffleGrouping("spout");

LocalCluster cluster = new LocalCluster();
Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 10);
cluster.submitTopology("test", conf, createTopology());

CustomBolt ขยายคลาส AbstractBasic และนำไปใช้ IRichBolt พวกเขามีฟิลด์เหล่านี้:

abstract class AbstractBasic {
    A a;
    B b;
} 

CustomBolt extends AbstractBasic implements IRichBolt {
    A anotherA;
    C c;
    CustomBolt() {
        this.anotherA = new A(true);
        this.a = new A(false);
        this.b = new B();
        this.c = new C();
    }
}

ในเมธอด execute ของ CustomBolt จะมีการแทรกลงในคลาสทั้งหมด อย่างไรก็ตาม ฟิลด์ที่สืบทอดมาจาก AbstractBasic จะไม่ถูกสร้างอินสแตนซ์ แต่ฟิลด์อื่นๆ ที่อยู่ใน CustomBolt โดยตรงนั้น...

ไม่มีใครรู้ว่ามีการสร้างโบลต์อย่างไร และเป็นไปได้อย่างไรที่บางฟิลด์จะเริ่มต้นได้ แต่บางฟิลด์จะไม่ได้เริ่มต้น


person user3354890    schedule 07.07.2014    source แหล่งที่มา


คำตอบ (2)


เมื่อโบลต์ถูกส่งไปยังโทโพโลยี โบลต์เหล่านั้น ทำให้เป็นอนุกรมและส่งไปยังแต่ละอัน ผู้ปฏิบัติงานที่พวกเขาถูกดีซีเรียลไลซ์ เนื่องจาก AbstractBasic ไม่ได้ใช้ Serializable ฟิลด์ จะไม่ถูกทำให้เป็นอนุกรม เมื่อ CustomBolt เป็นอนุกรม

จากตัวอย่างที่คุณให้มา คุณควรจะสามารถแก้ไขปัญหาของคุณได้ด้วยการประกาศว่า AbstractBasic นำไปใช้ Serializable:

abstract class AbstractBasic implements Serializable ...
person Carl Veazey    schedule 10.07.2014

ฉันไม่แน่ใจว่าการสร้างอินสแตนซ์ทำงานอย่างไรกับ Bolts แต่ฉันสามารถหาเหตุผลที่ดีได้ ตามความเข้าใจของฉัน เรารันโทโพโลยีในสภาพแวดล้อมแบบกระจาย และเพื่อหลีกเลี่ยงการแก้ไขตัวแปรที่ใช้ร่วมกันพร้อมกัน (เช่น ตัวแปรระดับคลาสที่สืบทอดมาจากคลาสพาเรนต์) ตัวแปรพาเรนต์อาจถูกตั้งค่าเป็นโมฆะในคลาสลูก

person java_enthu    schedule 08.07.2014