我正在设计一个购物车,
我的购物车里有X产品。每个产品都与一个商店相关联。
这应该如何处理?
我将项目分为两个部分:
1:项目1
我创建了一个基于表单的应用程序,所有商店都使用它
销售产品时,商店管理员将输入产品详细信息(可用单元数…等)并提交。我将其转换为XML并保存到表1中。
示例:
表1
Product_ID | XML
--------------------------------
Prod_1A | xml
Prod_2A | xml
Prod_3A | xml
Prod_1A | xml
2: 项目2
在这个项目中,我使用
ServletContextListener
当我部署这个项目时,在ServletContextListener contextLaunated
方法
的帮助下,我正在创建一个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秒使用计时器并创建多个线程的正确方法?是否有更好的方法来实现这些要求。
对于这种类型的场景,是否有更好的方法来实现队列机制?
我清楚地了解到,您需要从项目#2轮询项目#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);
}
}
但实际上,如果不强烈要求将产品更新逻辑与购物车更新分开,我建议在商店更新产品后立即更新项目#1中的所有购物车数据。然后您不需要任何计时器,因为您已经处于产品更新上下文中,您可以准确地看到更新了哪个产品以及更改了哪些数据。
public void processProductUpdateForm(ProductUpdate upd) {
updateProductInDatabase(upd);
updateAssociatedShoppingCarts(upd);
}
您还可以确定购物车中何时需要此更新的产品信息,并拉取信息而不是推送信息。也许你不需要实时更新它?
也许你可以检查一下,只有当用户去结账时,产品库存或价格是否有任何更新?或者在你确定的其他点上。。。
这样您就可以简化事情,而不用担心线程或队列。
您可以为此使用JMS。
-您将在html" target="_blank">服务器上运行JMS服务(可以是部署project 2的同一服务器)
-项目1-将向队列添加XML
-Project 2-将从队列中读取。
使用JMS,您不必实现自己的计时器/侦听器。项目1将获得到队列的连接,并将消息添加到队列。JMS客户端将实现MessageListener。每当项目1将消息添加到队列时,都会调用项目2中的MessageListener#onMessage。
对于创建队列,您可以使用Apache的ActiveMQ。
还要检查:how-can-i-use-textmessage-to-send-an-xml-file-to-jms-queue
编辑:正如“Amrola”所指出的,使用MDB(消息驱动Bean)比使用Message Listener更好。使用MDB将为您提供ejb容器提供的服务。
队列简介 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。队列采用的 FIFO
本文向大家介绍如何利用FluentMigrator实现数据库迁移,包括了如何利用FluentMigrator实现数据库迁移的使用技巧和注意事项,需要的朋友参考一下 FluentMigrator Fluent Migrator是一个基于.NET的迁移框架,你可以像使用Ruby on Rails Migrations一样使用它。Fluent Migrator的最新版本是3.13版,官网地址https:
我很困惑为什么我的队列不工作,我相信排队和退队方法中存在问题。但是我不确定,我应该实现初始数组大小设置为8的类。一旦元素数量超过该大小,数组大小将加倍。从数组开头移除元素后,需要将数组中的所有元素向左移动一个位置。编写一个测试程序,将从1到20的20个数字添加到队列中,然后删除这些数字并显示它们。这是我的密码 这里是测试类。
本文向大家介绍批处理完美实现FTP远程备份数据,包括了批处理完美实现FTP远程备份数据的使用技巧和注意事项,需要的朋友参考一下 经过再次努力,终于完成了自己的比较满意的版本,大家多批评…… 批处理功能: 输入几个参数,让批处理代你完成烦琐的工作吧!远程FTP文件到本地计算机,你可以拖入开机启动或任务计划中,定时下载远程的指定数据,希望大家多测试,多提意见,多完善,谢谢!上代码!
我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢
简介 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (largest-in,first-out)的行为特征。 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有: 查找; 插入一个新元素; 删除。 在最小优先队列(min priority qu