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销售
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)从队列而不是侦听器中读取。