小编wal*_*alv的帖子

Java WebSockets:远程端点处于[TEXT_FULL_WRITING]状态

我正在尝试实现一些基于websockets的应用程序,它将与JS客户端密切沟通.

发送消息的代码非常原始:

synchronized (session) {
    if (session.isOpen()) {
        session.getBasicRemote().sendText(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于罕见的发送,它工作正常,但当几个线程试图通过相同的会话(套接字)发送一些消息时,抛出下一个异常(请注意,它不是多线程问题,因为代码块是由会话同步的):

java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1015)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:978)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:161)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
Run Code Online (Sandbox Code Playgroud)

谷歌目前并没有这种类型的例外,在这个问题上打了几个小时后,仍然没有解决方案.

Java 7.0.21,在Tomcat 7.0.52和Tomcat 8.0.3上测试.

任何答案都非常感谢!提前致谢.

更新3/11/2014:我使用Jetty 9.1测试了我的应用程序,但没有发生此异常.我假设这是Tomcat实现错误.

java tomcat websocket jsr356

9
推荐指数
2
解决办法
2万
查看次数

Bitbucket 管道:echo 环境变量

我有一个非常简单的标签管道。当我做标签时,我想发送简单的 slack webhook。我的问题是环境变量$BITBUCKET_TAG既没有在松弛消息中呈现echo,也没有在松弛消息中呈现。

pipelines:
  tags:
    '*':
    - step:
        script:
        - echo $BITBUCKET_TAG 
        - curl -X POST "https://hooks.slack.com/services/mysecuritykey" -H "Content-Type:application/json" -H "cache-control:no-cache" -d '{"username":"CoreLib tag","text":"Tag *$BITBUCKET_TAG* has been created"}'
Run Code Online (Sandbox Code Playgroud)

我在 Slack 中得到了这个

CoreLib tag [12:50 PM]

Tag $BITBUCKET_TAG has been created
Run Code Online (Sandbox Code Playgroud)

我想要实现的是正确呈现$BITBUCKET_TAGecho和 Slack 消息中的值,例如:

CoreLib tag [12:50 PM]

Tag v2019.1.1 has been created
Run Code Online (Sandbox Code Playgroud)

bash bitbucket environment-variables slack-api bitbucket-pipelines

7
推荐指数
1
解决办法
1万
查看次数

Java 8 streaming:如何将对象列表转换为其所选属性的列表

我上课了

class Person {
   // get/set omitted for simplicity
   public String firstName;
   public String lastName;
}
Run Code Online (Sandbox Code Playgroud)

我也有这样的对象列表

List<Person> list ...
Run Code Online (Sandbox Code Playgroud)

我需要使用以下流转换

List<Person> list ...
List<String> firstLastNames = list.stream()....
Run Code Online (Sandbox Code Playgroud)

所以我的List firstLastNames将包含此列表中的名字和姓氏.所以.

System.out.println(firstLastNames); // will give me -> "John", "Smith", "Jessica", "Jones".. etc.
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

4
推荐指数
1
解决办法
1352
查看次数

Cassandra:每个键空间的客户数据

问题:我们的一位新客户希望将数据存储在他自己的国家(法律规定)。但是,我们使用分布在不同国家/地区的几个数据中心的现有客户数据。

问题:如何在不改变现有 Cassandra 架构的情况下,将新客户的数据分离到其本国?

潜在解决方案 #1:为此客户使用单独的密钥空间。键空间之间的模式将是相同的,这增加了数据迁移等的复杂性。DataStax 支持确认可以为每个区域配置密钥空间。但是我们使用的 Spring Data Cassandra 不允许动态选择键空间。唯一的方法是使用 CqlTemplate 并在use keyspace blabla每次调用之前运行或在表之前添加键空间,select * from blabla.mytable但这对我来说听起来像是一个黑客。

潜在的解决方案#2为新客户使用单独的环境,但管理层拒绝这样做。

还有其他方法可以实现这个目标吗?

cassandra spring-data-cassandra

3
推荐指数
1
解决办法
1056
查看次数

Spring 4 + Websockets:如何关闭会话?

我正在使用 Spring 4 + Websockets + Stomp JS 库。我找不到任何方法来设置 websocket ping/pong 机制(心跳)。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...">

<websocket:message-broker>
    <websocket:stomp-endpoint path="/cors/auth/clientEndpoint">
        <websocket:handshake-handler ref="myHandshakeHandler" />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/queue, /topic" />
    <websocket:client-inbound-channel>
        <websocket:interceptors>
            <bean class="com.mycompany.myproject.utils.messaging.MyInboundChannelInterception"></bean>
        </websocket:interceptors>
    </websocket:client-inbound-channel>
</websocket:message-broker>

<bean id="myHandshakeHandler" class="com.mycompany.myproject.utils.security.MyHandshakeHandler" />

<bean class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
    <property name="maxSessionIdleTimeout" value="120000" />
</bean>
Run Code Online (Sandbox Code Playgroud)

因此,我正在实现我自己的 ping/pong 消息机制。

这里的任务之一 - 实现 websocket 的服务器端关闭,以防客户端在超过 10 秒内没有 ping 消息。

并且无法使用 Spring Websockets 来做到这一点!

也许有人可以告诉我如何访问用户的 Session 对象或通过 Spring Websockets 关闭这些 Session?

看来这里的春天很有限。

java spring stomp spring-websocket

2
推荐指数
1
解决办法
1万
查看次数