Java 如何用数据库实现完美队列

Java 如何用数据库实现完美队列,java,database-design,architecture,Java,Database Design,Architecture,我正在设计一辆购物车, 我的购物车里有X个产品。 每个产品都与一个商店相关联 示例产品1由Shop1销售 示例产品2由Shop2销售 示例产品3由Shop3销售 示例产品4由Shop4销售 我以XML的形式获取Product1的详细信息(Shop1中的可用性和价格[当产品售出或价格改变时]) 我应该在我的购物车中更新这些详细信息 这应该如何处理 我将项目分为两部分: 1:项目1 Product_ID | XML -------------------------------- Prod

我正在设计一辆购物车,
我的购物车里有X个产品。 每个产品都与一个商店相关联

  • 示例产品1由Shop1销售
  • 示例产品2由Shop2销售
  • 示例产品3由Shop3销售
  • 示例产品4由Shop4销售

  • 我以XML的形式获取Product1的详细信息(Shop1中的可用性和价格[当产品售出或价格改变时])
  • 我应该在我的购物车中更新这些详细信息 这应该如何处理

    我将项目分为两部分:

    1:项目1

    Product_ID  | XML 
    --------------------------------
    Prod_1A     | xml  
    Prod_2A     | xml  
    Prod_3A     | xml  
    Prod_1A     | xml  
    
    我创建了一个基于表单的应用程序,所有商店都使用它。
    当产品售出时,商店管理员将输入产品详细信息(可用单元数…等)并提交。我将其转换为XML并保存到表1中

    示例:
    表1

    Product_ID  | XML 
    --------------------------------
    Prod_1A     | xml  
    Prod_2A     | xml  
    Prod_3A     | xml  
    Prod_1A     | xml  
    

    2:项目2

    在这个项目中,我使用了

    ServletContextListener
    
    每当我部署这个项目时,在
    ServletContextListener contextInitialized
    方法的帮助下
    我正在创建一个
    计时器
    ,它将每10秒运行一次。在该
    计时器中
    我正在检查表1是否包含任何记录。如果是,在Timer类的run方法中,我从中选择一条记录并更新购物车中的数据

    for (int i = 0; i <= 5 ; i++) {
    
        fetchFromNotif = fetchFromNotif(); // this methods picks a unique record
        if (fetchFromNotif != null) {
            new Thread()
            {
                public void run()
                {
                    // updating the data in my Shopping cart DB.
                }
            };
            t.start();
        }
    }
    

    for(inti=0;i您可以使用JMS来实现这一点

    -您将在服务器上运行JMS服务(可以是部署project 2的同一服务器)

    -项目1-将向队列中添加XML

    -项目2-将从队列中读取

    使用JMS,您不必实现自己的计时器/侦听器。 项目1将获得到队列的连接,并将消息添加到队列。JMS客户端将实现。无论何时,项目1将消息添加到队列,都将调用项目2中的消息

    要创建队列,可以使用

    同时检查:


    编辑:正如“Amrola”所指出的,使用MDB(消息驱动Bean)比使用消息侦听器更好。使用MDB将为您提供ejb容器提供的服务。

    您还可以确定购物车中何时需要此更新的产品信息,并拉取信息而不是推送信息。也许您不需要实时更新它

    也许你可以只在用户去结账时检查产品库存或价格是否有任何更新?或者也可以在你确定的其他点检查


    这样,您可以简化工作,而不必担心线程或队列。

    我清楚地了解到,您需要从Project 2轮询Project 1模块数据库,以获取产品更新并更改数据库2中的购物卡数据

    在项目#2中,您可以实现ScheduledExecutorService并在其内部执行获取和更新,而无需详细说明:

    public class MyAppServletContextListener 
               implements ServletContextListener {
    . . .
        @Override
        public void contextInitialized(ServletContextEvent e) {
            //Schedule cart updater
    
            Executors.newSingleThreadScheduledExecutor()
                .schedule(new Runnable() {
                    @Override
                    public void run() {
                        ProductUpdate productUpdate = fetchProductUpdate();
    
                        //do some additional stuff with productUpdate, some checks or logging
    
                        updateShoppingCart(shoppingCart, productUpdate);
                    }
                }, 10, TimeUnit.SECONDS);
        }
    
    }
    
    但实际上,如果不强烈要求将产品更新逻辑与购物车更新分开,我建议在商店更新产品之后立即更新Project#1中的所有购物车数据。 然后,您不需要任何计时器,因为您已经在产品更新上下文中,您可以确切地看到哪个产品被更新,哪些数据被更改

    public void processProductUpdateForm(ProductUpdate upd) {
        updateProductInDatabase(upd);
    
    
        updateAssociatedShoppingCarts(upd);
    
    }
    

    您熟悉Java的ExecutorService吗?您可以使用它来设置队列,并以多种方式处理添加到队列中的项目。以下是Spring框架中有关如何使用它的一些文档:也许更好的解决方案是根本不复制购物车上的产品详细信息。只要在需要时懒洋洋地获取它们即可。I如果性能是一个问题,请开发一些具有缓存功能的API。使用消息驱动Bean(MDB)从队列而不是侦听器中读取。