有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当我试图发送消息显示在wicket网页上时,java无法打开IWebSocketConnection

我正在尝试以异步方式向网页发送一些消息,但我做不好,缺少一些信息。我正在做一些计算,我想看看我现在的处境。无论如何,在我的calcul()方法中,wsConnection总是关闭的。我尝试使用调试器,发现它在calcul()方法之前和之后进入onConnect,wsConnection不是null,而是connection。。。关闭=正确。所以我有:

CalculPanel。html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<h1>Calcul</h1>
<form wicket:id="form">
    <input type="submit" value="Calcul"/>
</form>
<div wicket:id="container">
    <ul wicket:id="messages">
        <li wicket:id="message"></li>
    </ul>
</div>
<div style="color:red" wicket:id="feedback"></div>
</wicket:extend>
</body>
</html>

CalculPanel。爪哇:

public class CalculPanel extends BasePage {

    Logger LOGGER = LoggerFactory.getLogger(CalculPanel.class);

    String message;

    private String applicationName;

    IWebSocketConnection wsConnection;

    private WebMarkupContainer container;

    private FeedbackPanel feedbackPanel;

    private List<String> messages = Collections
            .synchronizedList(new LinkedList<String>());

    private IKey pageId;

    private String sessionId;

    private Model<String> updateModel;

    public CalculPanel () {
        Form<?> form = new Form("form") {
            @Override
            protected void onSubmit() {
                super.onSubmit();
                calcul();
            }
        };
        this.feedbackPanel = new FeedbackPanel("feedback");
        this.feedbackPanel.setOutputMarkupId(true);
        add(this.feedbackPanel);

        add(form);

        setDefaultModel(new CompoundPropertyModel<CalculPanel >(this));
        container = new WebMarkupContainer("container");
        add(container.setOutputMarkupId(true));
        container.add(new ListView<String>("messages",
                new PropertyModel<List<String>>(this, "messages")) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<String> item) {
                item.setDefaultModel(CompoundPropertyModel.of(item
                        .getDefaultModel()));
                item.add(new Label("message", item.getModelObject()));
            }
        });

        add(new WebSocketBehavior() {
            private static final long serialVersionUID = 1L;

            @Override
            public void onException(Component component,
                    RuntimeException exception) {
                LOGGER.warn("Got exception", exception);
            }

            @Override
            protected void onConnect(ConnectedMessage message) {
                super.onConnect(message);

                CalculPanel.this.applicationName = message.getApplication().getName();
                CalculPanel.this.sessionId = message.getSessionId();
                CalculPanel.this.pageId = message.getKey();

                Application application = Application.get(CalculPanel.this.applicationName);
                WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
                IWebSocketConnectionRegistry webSocketConnectionRegistry = webSocketSettings.getConnectionRegistry();
                CalculPanel.this.wsConnection = webSocketConnectionRegistry.getConnection(application,
                    CalculPanel.this.sessionId, CalculPanel.this.pageId);

                WebSocketService.getInstance().addClient(message);
                LOGGER.info("Client connected");
            }

            @Override
            protected void onMessage(WebSocketRequestHandler handler, TextMessage message) {
                String msg = message.getText();
                // use the message sent by the client

                handler.push("A message pushed by the server");
            }

            @Override
            protected void onPush(WebSocketRequestHandler handler, IWebSocketPushMessage message) {
                super.onPush(handler, message);

                if (message instanceof FeedItem) {
                    FeedItem msg = (FeedItem) message;
                    updateModel.setObject(msg.toString());
                }
                handler.add(feedbackPanel);
            }
        });
    }

  public void calcul() {
  .......
        for (int agency = START_AGENCY; TOTAL_NUMBER_OF_AGENTIES >= agency; agency++) {
        .......
           this.message = agency + "....";
          //info(this.message);
          //wsConnection is always closed...
          if (null != wsConnection && wsConnection.isOpen()) {
              wsConnection.sendMessage(this.message);
          }
        .......
        }

public void handleMessage(WebSocketRequestHandler handler, FeedItem message) {
    messages.add(message.toString());
    while (5 < messages.size()) {
        messages.remove(0);
    }
    LOGGER.info("Push message {}. Number of messages {}.", message, messages.size());
    LOGGER.info("FeedPage: {}", handler);
    container.modelChanged();
    handler.add(container);
}

@Override
public void onEvent(IEvent<?> event) {
    if (event.getPayload() instanceof WebSocketPushPayload) {
        WebSocketPushPayload wsEvent = (WebSocketPushPayload) event
                .getPayload();
        handleMessage(wsEvent.getHandler(), (FeedItem) wsEvent.getMessage());
    }
}

我在用<wicket.version>7.10.0</wicket.version>

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-native-websocket-javax</artifactId>
    <version>${wicket.version}</version>
</dependency>

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您正在为每个calculate()创建一个新的连接注册表,但应该使用应用程序中的一个:

    Application application = Application.get(applicationName);
    WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
    IWebSocketConnectionRegistry webSocketConnectionRegistry = webSocketSettings.getConnectionRegistry();
    IWebSocketConnection wsConnection = webSocketConnectionRegistry.getConnection(application, sessionId, pageId);
    

    请看一下有关如何正确执行此操作的示例:

    https://github.com/apache/wicket/tree/master/wicket-examples/src/main/java/org/apache/wicket/examples/websocket