Oracle APEX聊天区域如何实现实时自动刷新?求方案实现指引
Oracle APEX聊天功能自动刷新方案实现指南
方案2:Automation + 全局项 + 动态动作(体验优、中等复杂度)
步骤1:创建应用全局项
- 进入应用的「Shared Components」→「Application Items」
- 创建全局项
G_NEW_MESSAGE_FLAG,类型设为「Character」,默认值设为'N'
步骤2:创建定时Automation
- 进入「Shared Components」→「Automations」→「Create」
- 选择「Schedule」类型,设置执行间隔(比如5秒),勾选「Enabled」
- 在「Execution」标签页编写PL/SQL块,检查当前用户的聊天会话是否有未读新消息:
DECLARE l_has_new_msg NUMBER; l_current_user VARCHAR2(100) := :APP_USER; -- 替换为你的聊天表字段定义 BEGIN SELECT COUNT(1) INTO l_has_new_msg FROM CHAT_MESSAGES WHERE SESSION_ID = :P1_SESSION_ID -- 替换为页面会话ID项 AND RECEIVER_USER = l_current_user AND IS_READ = 'N'; :G_NEW_MESSAGE_FLAG := CASE WHEN l_has_new_msg > 0 THEN 'Y' ELSE 'N' END; END; - 保存Automation,确保定时执行生效
步骤3:页面动态动作配置
- 打开聊天页面,进入「Dynamic Actions」→「Create」
- 触发条件:选择「Interval」,设置与Automation一致的间隔时间(比如5秒)
- 动作1:检查全局项状态
- 动作类型选「Execute PL/SQL Code」,代码留空仅用于提交全局项
- 勾选「Page Items to Submit」,添加
G_NEW_MESSAGE_FLAG
- 添加分支:当
G_NEW_MESSAGE_FLAG = 'Y'时执行以下动作- 动作1:刷新聊天区域:动作类型选「Refresh」,选择目标聊天区域(比如静态ID为
chat_region的区域) - 动作2:重置全局项:动作类型选「Set Value」,设置项为
G_NEW_MESSAGE_FLAG,值设为'N',选择「Static Value」
- 动作1:刷新聊天区域:动作类型选「Refresh」,选择目标聊天区域(比如静态ID为
方案3:Service Worker + Webhook(实时性高、高复杂度)
步骤1:数据库端触发Webhook
- 在聊天消息表上创建触发器,新消息插入时发送HTTP请求到前端端点:
CREATE OR REPLACE TRIGGER TRG_CHAT_NEW_MSG AFTER INSERT ON CHAT_MESSAGES FOR EACH ROW DECLARE l_payload CLOB; BEGIN -- 构造消息关键信息的JSON payload l_payload := JSON_OBJECT( 'session_id' VALUE :NEW.SESSION_ID, 'sender' VALUE :NEW.SENDER_USER, 'message' VALUE :NEW.MESSAGE_TEXT ); -- 发送POST请求到Webhook端点 APEX_WEB_SERVICE.MAKE_REQUEST( p_url => 'https://your-apex-app-url/ords/your-app/webhook', -- 替换为你的端点 p_http_method => 'POST', p_body => l_payload, p_body_type => 'application/json' ); END; / - 在APEX中创建RESTful服务作为Webhook端点,接收并转发消息通知
步骤2:配置Service Worker
- 在「Shared Components」→「Static Files」上传Service Worker脚本
sw.js:self.addEventListener('fetch', function(event) { if (event.request.url.includes('/webhook')) { event.respondWith( fetch(event.request) .then(res => res.json()) .then(data => { // 通知所有打开的聊天页面 self.clients.matchAll({type: 'window'}).then(clients => { clients.forEach(client => { client.postMessage({ type: 'new_chat_msg', sessionId: data.session_id }); }); }); return new Response('Received'); }) ); } }); - 在聊天页面的「JavaScript」→「Function and Global Variable Declaration」添加注册代码:
if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/i/your-app/static/sw.js') // 替换为静态文件路径 .catch(err => console.log('SW注册失败:', err)); }); }
步骤3:页面监听新消息
- 在聊天页面创建「Custom」触发的动态动作,触发事件选
message,代码:window.addEventListener('message', function(event) { if (event.data.type === 'new_chat_msg' && event.data.sessionId === $v('P1_SESSION_ID')) { apex.region('chat_region').refresh(); } });
内容的提问来源于stack exchange,提问作者Moptan
相关产品推荐
相关产品推荐

