ฉันจะสร้างข้อความของฉันใน Spring Integration ได้อย่างไร

ฉันมีแอปพลิเคชันที่ฉันเขียนโค้ดซึ่งฉันกำลังปรับโครงสร้างใหม่เพื่อให้ใช้งาน Spring Integration ได้ดียิ่งขึ้น แอปพลิเคชันประมวลผลเนื้อหาของไฟล์

ปัญหา (อย่างที่ฉันเห็น) คือการใช้งานปัจจุบันของฉันผ่าน Files แทนที่จะเป็น Messages เช่น Spring Integration Messages


เพื่อหลีกเลี่ยงการกลิ้งโค้ดของตัวเองไป ซึ่งฉันต้องบำรุงรักษาในภายหลัง ฉันสงสัยว่ามีโครงสร้างที่แนะนำสำหรับการสร้าง Messages ใน Spring Integration หรือไม่ สิ่งที่ฉันสงสัยคือมีชุดค่าผสมที่แนะนำของ channel กับบางอย่างเช่น MessageBuilder ที่ฉันควรใช้หรือไม่


กระบวนการ/รหัส (ในที่สุด)

ฉันยังไม่มีรหัสในการกำหนดค่า แต่ฉันต้องการให้มีส่วนประกอบ/กระบวนการต่อไปนี้:

  1. รับไฟล์ ลบส่วนหัวและส่วนท้ายของไฟล์ นำแต่ละบรรทัดแล้วแปลงเป็น Message<String> (ซึ่งดูเหมือนว่าจะเป็น Splitter) ที่ฉันส่งไปที่...
  2. Channel/Endpoint ส่งข้อความไปยัง Router
  3. เราเตอร์ตรวจพบรูปแบบสตริงใน Payload และกำหนดเส้นทางไปยังช่องทางที่เหมาะสมซึ่งคล้ายกับ คำสั่งซื้อ เราเตอร์ที่นี่...
  4. ช่องทางที่เลือกจะสร้างข้อความประเภทที่เหมาะสมโดยเฉพาะข้อความที่พิมพ์ ตัวอย่างเช่นฉันมีตัวสร้างต่อไปนี้เพื่อสร้างข้อความ...

    คลาสสาธารณะ ShippedBoxMessageBuilder ใช้ CustomMessageBuilder {

    @แทนที่ข้อความสาธารณะ buildMessage (อินพุตสตริง) { ShippedBox shippingBox = (ShippedBox) ShippedBoxFactory.manufactureShippedFile (อินพุต); กลับ MessageBuilder.withPayload(shippedBox).build(); } ...

  5. ข้อความถูกกำหนดเส้นทางตามประเภทไปยังช่องทางการประมวลผลที่เหมาะสม

วิธีแก้ปัญหาที่ฉันตั้งใจไว้ดูเหมือนว่าฉันจะซับซ้อน อย่างไรก็ตาม ฉันได้แยกงานสองอย่างโดยตั้งใจ 1) แบ่งไฟล์ออกเป็น Messages<String> หลายบรรทัด และ 2) การแปลง Messages<String> เป็น Messages<someType> ด้วยเหตุนี้ ฉันคิดว่าฉันต้องการตัวสร้างเราเตอร์/ข้อความเพิ่มเติมสำหรับงานที่สอง


person Crowie    schedule 13.01.2014    source แหล่งที่มา


คำตอบ (1)


ที่จริงแล้วมี MessageBuilder รองรับ Spring Integration

วัตถุประสงค์ทั่วไปของกรอบงานดังกล่าวคือการช่วยให้นักพัฒนาแบ็คเอนด์แยกรหัสโดเมนของตนออกจากโครงสร้างพื้นฐานการส่งข้อความ สุดท้ายนี้ หากต้องการทำงานร่วมกับ Spring Integration คุณต้องปฏิบัติตามหลักการ POJO และ Method Invocation

คุณเขียนบริการ หม้อแปลง และโมเดลโดเมนของคุณเอง จากนั้นคุณเพียงแค่ใช้องค์ประกอบนอกกรอบบางส่วน (เช่น <int-file:inbound-channel-adapter>) และอ้างอิงถึง POJO ของคุณจากที่นั่น แต่ไม่ได้ในทางกลับกัน

ฉันขอแนะนำให้คุณอ่านหนังสือ Spring Integration in Action เพื่อให้เห็นภาพเพิ่มเติมเกี่ยวกับเรื่องนี้

คุณช่วยอธิบายเหตุผลในการรับข้อตกลงกับส่วนประกอบ Spring Integration โดยตรงได้ไหม

อัปเดต

1) แบ่งไฟล์ออกเป็นข้อความหลายบรรทัด

<splitter> เหมาะสำหรับคุณ คุณควรเขียน POJO ซึ่งส่งคืน List<String> - บรรทัดจากไฟล์ของคุณโดยไม่มีส่วนหัวและส่วนท้าย วิธีอ่านบรรทัดจาก File ไม่ใช่งานของ Spring Integration โดยเฉพาะอย่างยิ่ง หาก "บรรทัด" เป็นสิ่งที่สมเหตุสมผล ไม่ใช่บรรทัดไฟล์จริง

2) การแปลงข้อความเป็นข้อความ

อีกครั้ง: ไม่มีเหตุผลที่จะสร้างวัตถุ Message เพียงสร้าง payload ใหม่ในหม้อแปลงบางตัว (POJO อีกครั้ง) และเฟรมเวิร์กล้อมรอบข้อความที่จะส่ง

Payload Type Router พูดเพื่อตัวเอง: จะตรวจสอบประเภทเพย์โหลด แต่ไม่ใช่ประเภทข้อความ แน่นอนว่า payload ก็สามารถเป็นข้อความได้เช่นกัน และแม้แต่ส่วนหัวใดๆ ก็สามารถเป็นข้อความได้เช่นกัน

อย่างไรก็ตาม Builder สแน็ปช็อตของคุณแสดงให้เห็นว่ามีการสร้าง Spring Integration Message ธรรมดาในตอนท้าย และอย่างที่ฉันพูดไปแล้ว แค่เปลี่ยนเพย์โหลดหนึ่งไปอีกอันหนึ่งแล้วส่งคืนจาก POJO บางตัวซึ่งคุณจะใช้เป็นข้อมูลอ้างอิงของหม้อแปลงก็เพียงพอแล้ว

person Artem Bilan    schedule 13.01.2014
comment
ฉันกำลังพยายามใช้ส่วนประกอบนั้นโดยตรงตามที่ฉันต้องการเพื่อสร้างข้อความที่แตกต่างกันแบบไดนามิกจากสตริงที่แตกต่างกัน จากนั้นกำหนดเส้นทางข้อความเหล่านั้นไปยังช่องทางต่างๆ ตามเพย์โหลดข้อความ - person Crowie; 13.01.2014
comment
สับสน... เหตุใดจึงสร้างข้อความต่างกัน สร้างเพย์โหลดที่แตกต่างกันและเฟรมเวิร์กจะดูแลการสร้างข้อความ คุณใช้ส่วนประกอบใด? โปรดแสดงรหัสของคุณ อาจจะทำให้มีแสงสว่างมากขึ้น... - person Artem Bilan; 13.01.2014
comment
ฉันต้องการสร้างข้อความที่แตกต่างกันเพราะฉันต้องการให้ประเภท Payload แตกต่างออกไป ในกรณีหนึ่ง POJO ที่กำหนดไว้ ในอีกกรณีหนึ่งคือ String ทั้งหมดที่ฉันมีจนถึงตอนนี้ที่เกี่ยวข้องกับบรรทัดการปรับโครงสร้างใหม่นี้มีดังต่อไปนี้.... - person Crowie; 13.01.2014
comment
‹int:payload-type-router input-channel=deirMessageInputChannel› ‹int:mapping type=java.lang.String channel=deirMalformedShippedFileChannel/› ‹int:mapping type=com.t2.lhr.daos.ShippedBox channel=deirShippedBoxChannel /› ‹/int:เพย์โหลดประเภทเราเตอร์› - person Crowie; 13.01.2014
comment
ขวา. PayloadTypeRouterดูดี. แต่โปรดแสดงรหัสที่สร้างข้อความสำหรับเราเตอร์นั้น - person Artem Bilan; 13.01.2014
comment
ฉันเห็นว่าคุณหมายถึงอะไรเกี่ยวกับกรอบงานที่สร้างข้อความตอนนี้ขออภัย ฉันเชื่อว่าฉันจะต้องมีเราเตอร์ก่อนหม้อแปลงไฟฟ้า (เนื่องจากฉันมีหม้อแปลงสองประเภทที่แตกต่างกันที่ต้องส่งคืนโดยหม้อแปลง) นอกจากนั้น - ขอบคุณมาก! - person Crowie; 14.01.2014
comment
15 มกราคม 2014 ฉัน: ฉันไม่สร้างข้อความของตัวเองอีกต่อไป และตอนนี้ใช้เฟรมเวิร์กเพื่อจัดการการมีอยู่ของข้อความ ฉันส่งคืน POJO เท่านั้น - person Crowie; 15.04.2016