繁体   English   中英

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

[英]How to Implement a perfect Queue with database

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

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

  1. 我以XML的形式获得了Product1的详细信息(Shop1中的可用性和价格[当产品销售或价格发生变化时])
  2. 我应该在购物车中更新这些细节。

应如何处理?

我将项目分为两个部分:

1: 项目1

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

例:
表格1

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

2: 项目2

在我使用的这个项目中

ServletContextListener

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

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();
    }
}

我的问题是这是否是每10秒使用Timer并创建多个线程的正确方法? 有没有更好的方法来实现这些要求。

对于这种情况,是否有更好的方法来实现队列机制?

您可以为此使用JMS。

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

-项目1-将XML添加到队列

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

使用JMS,您不必实现自己的计时器/监听器。 项目1将获得与队列的连接,并将消息添加到队列。 JMS客户端将实现MessageListener 每当项目1将消息添加到队列时,将调用项目2中的MessageListener#onMessage

要创建队列,可以使用Apache的ActiveMQ

还要检查: how-can-i-use-textmessage-to-send-an-xml-file-to-the-jms-queue

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

您还可以确定购物车中所需的更新产品信息的确切情况,并提取信息而不是推送信息。 也许你不需要实时更新它?

也许您可以检查产品库存或价格的任何更新是否仅在用户进入结账时发生? 或者也许在其他时候您发现...

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

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

在没有详细说明的情况下,在Project#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);
    }

}

但是实际上,如果不强烈要求将产品更新逻辑与购物车更新分开,我建议在商店更新产品后立即更新项目#1中的所有购物车数据。 然后,您不需要任何计时器,因为您已经在产品更新上下文中,并且可以准确地看到更新了哪些产品以及更改了哪些数据。

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


    updateAssociatedShoppingCarts(upd);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM