环境:Java EE 7,Glassfish 4,MySQL 5.7在Linux上的ARM7服务器上,512MB内存(应用程序必须节省内存!) 应用程序:数据库驱动的Java Web应用程序,使用默认浏览器为运行Android 4.0的多个Android平板电脑客户端提供服务。
客户端将有两种基本用户类型:生产者和消费者。生产者生成在消费者浏览器上显示的任务。当Producer创建一个新任务时,如果它们具有以“PENDING”状态显示的TaskList(viewTaskList.jsp),它应立即显示在所有已登录的消费者浏览器中。消费者从TaskList中选择Tasks并处理它们(doTask.jsp)。当Consumer选择任务时,它应该在所有其他TaskList显示上标记为“WORKING”,而不是可选择的。如果打开任务的消费者单击“取消”按钮,则应在所有TaskLists上将“任务”状态更改为“PENDING”。任务完成后,它会被标记为,并且应该从显示TaskList视图的任何消费者浏览器中消失。
Task entity class: (fragment)
public class Task {
private int taskId;
private String taskDescription;
private boolean isComplete;
private String completerId; // the userId of the Consumer who marked this as Complete (foreign key);
private boolean isLocked;
private String lockId; // the userId of a Consumer who has this task open;
.
.
.
}
我正在学习Java EE编程,而不是精通JPA和JSF,但要理解基本概念。从我在这里和其他地方看到的,我认为Comet和/或JQuery / AJAX可以帮助我解决这个问题,但我不知道如何使用其中任何一个。我需要有关如何让数据库更新导致消费者显示更改的基本指导,而消费者无需请求更改。解决方案的一部分是向MySQL数据库添加一个或多个触发器吗?
答案 0 :(得分:1)
您需要在此处实施轮询模型。在GUI上实现一个应该每n秒进行一次服务器调用的脚本带来最新数据并在GUI上显示,显然在服务器端你需要能够带来数据和生成响应的代码。
要实现轮询,您可以设置在x时间后调用的函数。
window.setInterval(dbCallFunction, x);
一旦函数调用,进行服务器调用,返回结果,您可以再次设置函数间隔。
有很多javascript库可以为你解决这个问题,我建议使用JQuery,这里是link
干杯!!
答案 1 :(得分:1)
轮询不会扩展。
使用WebSocket(旧浏览器的后备广告)。
您可以尝试自己设置,但它是PITA。
您可以使用像Pusher这样的WebSocket服务。
基本上,您设置了客户订阅的WebSocket频道。他们订阅了。如果要通知它们,可以在服务器上调用notify方法,然后将其发送给所有客户端。
您可以在Java中执行此操作,甚至可以直接在Postgres等数据库中使用NOTIFY函数执行此操作。