You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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」

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:45:32