小程序formid获取

Tip:这个e.detail.fromId,就是formid,真机才会产生,模拟器中为“the formId is a mock one”

wxml:

<form bindsubmit="submit" report-submit='true' class='formid'>
          <button form-type="submit" >
            <image wx:if="{{select==item.name}}" src="{{item.icon_s}}"></image>
            <image wx:else src="{{item.icon}}"></image>
            <text>{{item.name}}</text>
            <text class='red-dot' wx:if="{{item.name === '消息' && xiaoxishu}}">{{xiaoxishu}}</text>
          </button>
        </form>

js: 

submit: function (e) {
      // console.log(e.detail.formId, "我是formID");
      app.ajax({
        method: 'post',
        url: app.jk.setcustomerformId,
        data: {
          Uid: app.get('userId'),
          FormId: e.detail.formId
        },
        success: (data) => {
        },
        error: (err) => {
          console.log(err)
        }
      })
    }

js里边调用的接口是我们后台的接口。

<think>好的,我现在需要处理用户提供的关于WebSocket OnMessage Error的问题。首先,用户给出的错误信息是“The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method”,并附带了JavaIllegalStateException。我需要分析这个错误的原因,并给出解决方案。 首先,我应该回忆一下WebSocket的基本工作原理。在Java中,尤其是使用JSR 356的标准实现,远程端点(RemoteEndpoint)的状态管理很重要。当发送消息,如果同有多个线程尝试向同一个会话发送数据,可能会导致状态冲突。比如,一个线程正在写入数据(处于TEXT_FULL_WRITING状态),而另一个线程试图同写入,就会抛出这个异常。 接下来,我需要确认用户的应用场景。错误发生在http-nio-8081-exec-2线程中,说明是在处理HTTP请求触发的WebSocket消息发送。可能是在处理某个请求,尝试异步发送消息,但未正确同步导致竞争条件。此外,用户可能在高并发环境下遇到了这个问题,或者没有正确管理WebSocket会话的线程安全。 然后,我要考虑可能的解决方案。首先,检查代码中是否存在多线程同调用发送方法的情况。如果有,需要确保发送操作是同步的,比如使用synchronized关键字或锁机制。其次,使用线程安全的发送方法,比如RemoteEndpoint.Async的sendText方法,并处理返回的Future对象,确保前一个发送完成后再进行下一个。此外,检查消息发送频率,避免在未完成前一次发送触发新的发送操作。最后,确保正确关闭连接,处理异常情况,避免在连接已关闭继续发送消息。 可能还需要考虑其他因素,比如WebSocket服务器的配置,是否启用了适当的缓冲区大小,或者是否有网络问题导致发送延迟,进而引发状态不一致。不过,根据错误信息,更可能的是代码层面的并发控制问题。 用户可能没有意识到WebSocket发送操作不是线程安全的,尤其是在高并发场景下。因此,需要强调同步机制的重要性,或者建议使用异步发送并正确处理Future。同,提醒用户检查代码中所有发送消息的地方,确保它们都被正确地同步或顺序处理。 最后,我需要整理这些思路,分步骤解释问题原因,并提供具体的解决方案和代码示例,帮助用户理解和实施修复措施。</think>以下是关于WebSocket消息发送出现`IllegalStateException`的详细解释和解决方案: --- ### **错误原因分析** 该异常表明在调用WebSocket消息发送方法,远程端点(RemoteEndpoint)处于不可操作状态`TEXT_FULL_WRITING`。核心原因是**多线程并发操作同一个Session发送通道**,具体表现为: 1. **线程竞争**:多个线程同调用`session.getBasicRemote().sendText()`方法 2. **异步发送未完成**:前一次异步发送(`sendText`返回的`Future`未完成)发起新操作 3. **消息发送频率过高**:消息堆积导致缓冲区未释放 --- ### **解决方案步骤** #### **1. 同步发送操作** 通过`synchronized`关键字确保同一间只有一个线程操作发送通道: ```java @OnMessage public void onMessage(String message, Session session) { synchronized (session) { // 对Session加锁 try { session.getBasicRemote().sendText("Response: " + message); } catch (IOException e) { // 异常处理 } } } ``` #### **2. 使用异步发送模式** 通过`RemoteEndpoint.Async`接口的非阻塞特性实现: ```java @OnMessage public void onMessage(String message, Session session) { RemoteEndpoint.Async async = session.getAsyncRemote(); async.sendText("Response: " + message, new SendHandler() { @Override public void onResult(SendResult result) { if (!result.isOK()) { // 处理发送失败 } } }); } ``` #### **3. 增加发送状态检查** 在发送前验证连接状态和端点可用性: ```java if (session.isOpen() && session.getAsyncRemote().isBatchingSupported()) { session.getAsyncRemote().sendText(message); } ``` --- ### **关键配置优化** | 配置项 | 建议值 | 作用说明 | |-------------------------|-------------|----------------------------------| | `maxTextMessageBufferSize` | 81920 (80KB) | 增大文本消息缓冲区容量 | | `maxSessionIdleTimeout` | 300000 (5分钟) | 控制空闲会话超间 | | `asyncSendTimeout` | 10000 (10秒) | 设置异步发送阈值 | --- ### **并发控制原理** WebSocket发送通道的状态机如下图所示: $$ \text{状态流转} = \begin{cases} \text{READY} & \xrightarrow{\text{sendText()}} \text{TEXT_FULL_WRITING} \\ \text{TEXT_FULL_WRITING} & \xrightarrow{\text{发送完成}} \text{READY} \end{cases} $$ 当处于`TEXT_FULL_WRITING`状态,任何新的发送操作都会触发`IllegalStateException`。 --- ### **生产环境建议** 1. **使用消息队列缓冲**:通过`BlockingQueue`解耦接收和发送操作 ```java private static BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(); // 消息接收线程 @OnMessage public void onMessage(String message) { messageQueue.offer(message); } // 专用发送线程 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { while (true) { String msg = messageQueue.take(); synchronized (session) { session.getBasicRemote().sendText(msg); } } }); ``` 2. **监控指标**:统计`SendFailedCount`和`ConcurrentSendError`指标 3. **熔断机制**:当连续出现异常,暂关闭消息发送通道 --- 通过上述方法可有效避免状态冲突问题,建议结合`WebSocket PING/PONG`机制(`@OnPongMessage`)增强连接健康检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值