java分布式库存系统_JAVA消息服务--扩展:多订单分布式自动处理系统

a4c26d1e5885305701be709a3d33442f.png

一、系统特点:分布式,多订单,自动处理

分布式:零售商、集成商和两个配件供应商可以部署在不同的服务器上;启动不分先后

多订单:从原有能够跑通一个订单处理的整个流程,到很多个订单可以完成交互处理,且数据不会混淆。

业务流程与自动处理:从零售商发送最初的初步订单,到集成商接收数据,发送到配件供应商子订单,到配件供应商接收数据,查询库存,到响应集成商,到集成商最终回复是否接收订单的消息给零售商,都能自动处理。其中,需要每一个配件供应商都有配件的库存数据。

二、核心业务处理如何完成,又如何防止数据混淆?

1.在本系统中,采用了“订单编号”(orderId)作为特定批次数据的唯一标识符,以订单对象作为传输对象。从最初零售商发送过来订单消息,该订单编号orderId就存在了,两个供应商收到的从集成商过来的子订单消息中也包含该订单编号(orderId),两个供应商反馈回来的信息亦含有该订单编号orderId。

2.集成商在处理订单时,有一个半成品数据的“半成品存储区”(VENDOR_MAP=new

HashMap

(也可改用支持并发的ConcurrentHashMap;或放入缓存系统,以orderId作为键)

3.当接收到一个供应商的消息后,去"半成品存储区"取出该订单编号对应的半成品(如果不存在的话,新建一个);置将收到的子订单信息设置到半成品对象中;如果该半成品是否完成加工状态已经被设置为true即已经收到两个供应商的数据,立即将其发送出去,并从"半成品存储区"中移除。否则,将加工后的数据存入"半成品存储区"。

4.如果系统出错了,改怎么处理?需要将处理的每一批次的数据,都记录到数据库里。将已经完成的、未完成的订单都存入不同的表。对于为完成的订单,额外调用特定对象的发送功能。

public void onMessage(Message message)

{

if (message != null&& message

instanceof ObjectMessage) {

ObjectMessage objectMessage=(ObjectMessage)message;

Order orderT=null;

try {

orderT = (Order) objectMessage.getObject();

} catch (JMSException e) {

e.printStackTrace();

}

//将取得的信息放到静态的变量中。map

Order oTemp=VENDOR_MAP.get(orderT.getOrderId());

if(oTemp==null){

oTemp=new Order();

oTemp.setOrderId(orderT.getOrderId());

}

oTemp.setQuantity(orderT.getQuantity());

oTemp.setSupplierMonitorStock(orderT.getSupplierMonitorStock());

oTemp.setSupplierNumber(oTemp.getSupplierNumber()+1);//获得的供应商反馈数量+1

System.out.println(new Date().getTime()+ "

:Vendor2: received Supplier M's stocks message:  "+oTemp.toString());

if(oTemp.getSupplierNumber()==2){//已经组装完毕,发送确认消息回到零售商

publicConfirmInfoToRetailer(oTemp);

}

VENDOR_MAP.put(orderT.getOrderId(),

oTemp);

}

ddd

三、开发收获:

1.熟悉了jms常用API.

2.关于消息传递的通道:不同的通道,要对应;不同的信息方向的消息,可以走不同的队列。

3.特定类型的消息的获取与转化。TextMessage,MapMessage,ObjectMessage。getObject();

4.连接开启与关闭

5.并发处理:java提供的类ConcurrentHashMap、关键字synchronized、提供的解决并发的机制(锁与解锁)。

如:使用 JDK1.5

提供的读写锁(java.util.concurrent.locks.ReadWriteLock)。

代码如下:rwlock.readLock().lock();value = map.get(key);rwlock.readLock().unlock();

四、核心示范代码:

文件名:RetailerVendorSuppliers2012-02-21.rar

或 发送邮件(brightmart@hotmail.com)或qq(158085159),向本人获取。

五、运行效果:

以下为零售商同时发生3个订单后,系统的运行效果。1329760897406为时间戳

orderMessageOrder,是order的一个对象;含“============”的提示消息,是最终订单确认状态;

1329760897406:Retailer2:sent order message!messageName:

orderMessageOrder [bFull=false, itemName=computers,

orderId=1329760897427, quantity=35, supplierHardStock=null,

supplierMonitorStock=null, value=0]

1329760897421:Retailer2:sent order message!messageName:

orderMessageOrder [bFull=false, itemName=computers,

orderId=1329760897456, quantity=50, supplierHardStock=null,

supplierMonitorStock=null, value=0]

1329760897437:Retailer2:sent order message!messageName:

orderMessageOrder [bFull=false, itemName=computers,

orderId=1329760897501, quantity=78, supplierHardStock=null,

supplierMonitorStock=null, value=0]

1329760897562:Vendor2:received order from Retailer2:Order

[bFull=false, itemName=computers, orderId=1329760897427,

quantity=35, supplierHardStock=null, supplierMonitorStock=null,

value=0]

1329760897562:Vendor2: send sub order to SupplierH:Order

[bFull=false, itemName=Hard, orderId=1329760897427, quantity=35,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897578 :Supplier2: hard received sub order. Order

[bFull=false, itemName=Hard, orderId=1329760897427, quantity=35,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897609 :Supplier2: monitor received sub order. Order

[bFull=false, itemName=Monitor, orderId=1329760897427, quantity=35,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897625:Supplier2: hard :send stocks message back to Vendor2.

orderWithStockInfo:Order [bFull=false, itemName=Hard,

orderId=1329760897427, quantity=35, supplierHardStock=34,

supplierMonitorStock=null, value=0]

1329760897640:Vendor2: send sub order to SupplierM:Order

[bFull=false, itemName=Monitor, orderId=1329760897427, quantity=35,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897640:Vendor2:received order from Retailer2:Order

[bFull=false, itemName=computers, orderId=1329760897456,

quantity=50, supplierHardStock=null, supplierMonitorStock=null,

value=0]

1329760897640:Vendor2: send sub order to SupplierH:Order

[bFull=false, itemName=Hard, orderId=1329760897456, quantity=50,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897640 :Supplier2: hard received sub order. Order

[bFull=false, itemName=Hard, orderId=1329760897456, quantity=50,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897656:Supplier2: monitor :send stocks message back to

Vendor2. orderWithStockInfo:Order [bFull=false, itemName=Monitor,

orderId=1329760897427, quantity=35, supplierHardStock=null,

supplierMonitorStock=36, value=0]

1329760897687 :Supplier2: monitor received sub order. Order

[bFull=false, itemName=Monitor, orderId=1329760897456, quantity=50,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897703:Supplier2: hard :send stocks message back to Vendor2.

orderWithStockInfo:Order [bFull=false, itemName=Hard,

orderId=1329760897456, quantity=50, supplierHardStock=51,

supplierMonitorStock=null, value=0]

1329760897718:Vendor2: send sub order to SupplierM:Order

[bFull=false, itemName=Monitor, orderId=1329760897456, quantity=50,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897718:Vendor2:received order from Retailer2:Order

[bFull=false, itemName=computers, orderId=1329760897501,

quantity=78, supplierHardStock=null, supplierMonitorStock=null,

value=0]

1329760897718:Vendor2: send sub order to SupplierH:Order

[bFull=false, itemName=Hard, orderId=1329760897501, quantity=78,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897718 :Supplier2: hard received sub order. Order

[bFull=false, itemName=Hard, orderId=1329760897501, quantity=78,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897734:Supplier2: monitor :send stocks message back to

Vendor2. orderWithStockInfo:Order [bFull=false, itemName=Monitor,

orderId=1329760897456, quantity=50, supplierHardStock=null,

supplierMonitorStock=51, value=0]

1329760897750 :Supplier2: monitor received sub order. Order

[bFull=false, itemName=Monitor, orderId=1329760897501, quantity=78,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897765:Supplier2: hard :send stocks message back to Vendor2.

orderWithStockInfo:Order [bFull=false, itemName=Hard,

orderId=1329760897501, quantity=78, supplierHardStock=77,

supplierMonitorStock=null, value=0]

1329760897781:Vendor2: send sub order to SupplierM:Order

[bFull=false, itemName=Monitor, orderId=1329760897501, quantity=78,

supplierHardStock=null, supplierMonitorStock=null, value=0]

1329760897781 :Vendor2: received Supplier H's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897427, quantity=35,

supplierHardStock=34, supplierMonitorStock=null, value=0]

1329760897781 :Vendor2: received Supplier M's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897427, quantity=35,

supplierHardStock=34, supplierMonitorStock=36, value=0]

1329760897781 :Vendor2: tempOrder:Order [bFull=false,

itemName=null, orderId=1329760897427, quantity=35,

supplierHardStock=34, supplierMonitorStock=36, value=0]

==========Vendor2: 1329760897781: ordered quantity: 35

;supplierMonitorStock: 36 ;supplierHardStock: 34 ;accept order?:

false

============Retailer2:1329760897796 : final message about order

from Vendor2: To retailer: 1329760897796from Vendor, final confirm

message. orderId: Order [bFull=false, itemName=null,

orderId=1329760897427, quantity=35, supplierHardStock=34,

supplierMonitorStock=36, value=0]:cancel

1329760897796 :Vendor2: received Supplier H's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897456, quantity=50,

supplierHardStock=51, supplierMonitorStock=null, value=0]

1329760897796 :Vendor2: received Supplier M's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897456, quantity=50,

supplierHardStock=51, supplierMonitorStock=51, value=0]

1329760897796 :Vendor2: tempOrder:Order [bFull=false,

itemName=null, orderId=1329760897456, quantity=50,

supplierHardStock=51, supplierMonitorStock=51, value=0]

==========Vendor2: 1329760897796: ordered quantity: 50

;supplierMonitorStock: 51 ;supplierHardStock: 51 ;accept order?:

true

1329760897812:Supplier2: monitor :send stocks message back to

Vendor2. orderWithStockInfo:Order [bFull=false, itemName=Monitor,

orderId=1329760897501, quantity=78, supplierHardStock=null,

supplierMonitorStock=79, value=0]

============Retailer2:1329760897828 : final message about order

from Vendor2: To retailer: 1329760897812from Vendor, final confirm

message. orderId: Order [bFull=false, itemName=null,

orderId=1329760897456, quantity=50, supplierHardStock=51,

supplierMonitorStock=51, value=0]:accept

1329760897843 :Vendor2: received Supplier H's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897501, quantity=78,

supplierHardStock=77, supplierMonitorStock=null, value=0]

1329760897843 :Vendor2: received Supplier M's stocks message: Order

[bFull=false, itemName=null, orderId=1329760897501, quantity=78,

supplierHardStock=77, supplierMonitorStock=79, value=0]

1329760897843 :Vendor2: tempOrder:Order [bFull=false,

itemName=null, orderId=1329760897501, quantity=78,

supplierHardStock=77, supplierMonitorStock=79, value=0]

==========Vendor2: 1329760897843: ordered quantity: 78

;supplierMonitorStock: 79 ;supplierHardStock: 77 ;accept order?:

false

============Retailer2:1329760897843 : final message about order

from Vendor2: To retailer: 1329760897843from Vendor, final confirm

message. orderId: Order [bFull=false, itemName=null,

orderId=1329760897501, quantity=78, supplierHardStock=77,

supplierMonitorStock=79, value=0]:cancel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值