ฉันกำลังดำเนินการเกี่ยวกับการให้บริการเว็บที่มีอยู่อีกครั้ง วิธีที่ API ของบริการถูกนำไปใช้คือการมี "การประมวลผลขั้นตอน" ซึ่งมีงานที่จะดำเนินการตามลำดับ ไม่น่าแปลกใจที่งานในภายหลังอาจต้องการข้อมูลที่คำนวณโดยงานก่อนหน้านี้และในปัจจุบันวิธีที่ทำได้คือการเพิ่มเขตข้อมูลลงในคลาส "ไปป์ไลน์"
ฉันกำลังคิด (และหวัง?) ว่ามีวิธีที่ดีกว่าในการแบ่งปันข้อมูลระหว่างขั้นตอนไปป์ไลน์กว่าการมีออบเจ็กต์ข้อมูลที่มีเขตข้อมูล zillion ซึ่งบางอันเหมาะสมกับขั้นตอนการประมวลผลบางอย่างและไม่ใช่กับผู้อื่น มันจะเป็นความเจ็บปวดที่สำคัญในการทำให้เธรดปลอดภัยระดับนี้ (ฉันไม่รู้ว่ามันจะเป็นไปได้) ไม่มีทางที่จะให้เหตุผลเกี่ยวกับค่าคงที่ของมัน (และเป็นไปได้ว่ามันจะไม่มี)
ฉันเพจผ่านรูปแบบการออกแบบหนังสือของ Gang of Four เพื่อค้นหาแรงบันดาลใจ แต่ฉันไม่รู้สึกว่ามีวิธีแก้ปัญหาในนั้น (Memento ค่อนข้างมีวิญญาณเดียวกัน แต่ไม่มาก) ฉันดูออนไลน์ด้วยเช่นกัน แต่ครั้งที่สองที่คุณค้นหา "ไปป์ไลน์" หรือ "เวิร์กโฟลว์" ที่คุณได้รับนั้นเต็มไปด้วยข้อมูล Unix pipes หรือเอ็นจิ้นเวิร์กโฟลว์และเฟรมเวิร์กที่เป็นกรรมสิทธิ์
คำถามของฉันคือ - คุณจะแก้ไขปัญหาการบันทึกสถานะการดำเนินการของขั้นตอนการประมวลผลซอฟต์แวร์อย่างไรเพื่อให้งานในภายหลังสามารถใช้ข้อมูลที่คำนวณโดยคนก่อนหน้าได้ ฉันเดาว่าความแตกต่างที่สำคัญกับท่อ Unix คือคุณไม่เพียง แต่สนใจผลงานก่อนหน้านี้ทันที
ตามที่ร้องขอบางรหัสเทียมเพื่อแสดงกรณีการใช้งานของฉัน:
วัตถุ "ไปป์ไลน์บริบท" มีพวงของเขตข้อมูลที่ขั้นตอนไปป์ไลน์ที่แตกต่างกันสามารถเติม / อ่าน:
public class PipelineCtx {
... // fields
public Foo getFoo() { return this.foo; }
public void setFoo(Foo aFoo) { this.foo = aFoo; }
public Bar getBar() { return this.bar; }
public void setBar(Bar aBar) { this.bar = aBar; }
... // more methods
}
แต่ละขั้นตอนไปป์ไลน์ยังเป็นวัตถุ:
public abstract class PipelineStep {
public abstract PipelineCtx doWork(PipelineCtx ctx);
}
public class BarStep extends PipelineStep {
@Override
public PipelineCtx doWork(PipelieCtx ctx) {
// do work based on the stuff in ctx
Bar theBar = ...; // compute it
ctx.setBar(theBar);
return ctx;
}
}
ในทำนองเดียวกันสำหรับสมมติฐานFooStep
ซึ่งอาจต้องใช้แถบคำนวณโดย BarStep ก่อนหน้านั้นพร้อมกับข้อมูลอื่น ๆ จากนั้นเรามีการเรียก API จริง:
public class BlahOperation extends ProprietaryWebServiceApiBase {
public BlahResponse handle(BlahRequest request) {
PipelineCtx ctx = PipelineCtx.from(request);
// some steps happen here
// ...
BarStep barStep = new BarStep();
barStep.doWork(crx);
// some more steps maybe
// ...
FooStep fooStep = new FooStep();
fooStep.doWork(ctx);
// final steps ...
return BlahResponse.from(ctx);
}
}