Почему этот код не открывает простой веб-сокет? - PullRequest
0 голосов
/ 22 февраля 2019

Может кто-нибудь сказать мне, почему этот код не открывает простой веб-сокет?

(На случай, если это будет интересно, я пытаюсь реализовать интеграцию веб-сокетов и JMS, как описано здесь: https://blogs.oracle.com/theaquarium/integrating-websockets-and-jms-with-cdi-events-in-java-ee-7-v2. Но это не часть вопроса)

Я развернул HTML-страницу, конечную точку и пару Java-бинов в этом ухе на локальном сервере Wildfly 10.Это структура уха.

WebSocketsOne.ear
  META-INF
    application.xml
    MANIFEST.MF
  WebSocketsOne-server.jar
    META-INF
      persistence.xml
    org
      america3
        websockets
          endpoints
            WebSocketsOneEndPt.java
          javabeans
            WebSocketsOneJMSMsg.java
            WebSocketsOneMDB.java
            WebSocketsOneSenderBean.java
  WebSocketsOne-war.war
    META-INF
      MANIFEST.MF
    WEB-INF
      web.xml
    index.html

«/ WebSocketsOne» - это контекст проекта.

<module id="WebSocketsOneWar">
  <web>
    <web-uri>WebSocketsOne-war.war</web-uri>
    <context-root>/WebSocketsOne</context-root>
  </web>
</module>

Он развертывается только с одним предупреждением, связанным с компонентами Java (я буду иметь дело с ним)после открытия веб-сокета);

09:17:20,201 INFO Starting subdeployment (runtime-name: "WebSocketsOne-war.war")

09:17:24,977 WARN Deployment deployment "WebSocketsOne-ear.ear" contains CDI annotations but no bean archive was not found. (No beans.xml nor class with bean defining annotations)

09:17:27,430 INFO Deployed "WebSocketsOne-ear.ear" (runtime-name : "WebSocketsOne-ear.ear")

Этот URL-адрес открывает HTML-страницу: http://localhost:8080/WebSocketsOne/index.html

Это код JavaScript, вызываемый HTML-страницей с этой ссылкой: Open Session

Я структурирую файл ear, чтобы дублировать подкаталог, соответствующий иерархии java-пакетов.А также используйте его в URL ниже.Это неправильно?

function openUp() {
  URL = "ws://localhost:8080/WebSocketsOne/org/america3/websockets/endpoints/WebSocketsOneEntPt";
  alert("Opening: websocket " + URL);
  if (!websocketSession) {
    websocketSession = new WebSocket(URL);
    websocketSession.onopen =  function (event) {
      alert ("I am open"); 
    };
  }
}

websocketSession.onopen никогда не вызывается.

Вот мой класс конечной точки

package org.america3.websockets.endpoints;
// imports

@Named
@ServerEndpoint("/WebSocketsOne/org/america3/websockets/endpoints") 
public class WebSocketsOneEndPt implements Serializable {

  private WebSocketsOneSenderBean senderBean;
  private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>()); 
    /* sessions holds all WebSocket sessions connected to this 
     * WebSocket server endpoint (per JVM).
     * Notice that on onOpen and onClose, we manage 
     * all user sessions connected to this endpoint.
     *  We will see later how sessions will be used 
     *  inside onMessage.
     */
  final Logger logger = Logger.getLogger("org.america3.websockets.endpoints");
  private static final long serialVersionUID = 1L;

  // Constructor
  @Inject
  public WebSocketsOneEndPt(WebSocketsOneSenderBean sb) {
    this.senderBean = sb;
    logger.info("Constructor");    
  }  
  /* Injecting the MsgSenderBean into the Websocket, allows
   * it to call the MsgSenderBean's send message from within
   * the websocket's onMessage() method below.
   */

  @OnOpen
  public void onOpen(final Session session) {
    sessions.add(session); 
    logger.info("Endpoint opened session");    
  } 

  @OnMessage 
  public void onMessage(final String message, final Session client) {
    senderBean.sendMessage(message); 
    /* this allows the endpoint to broadcast messages through 
     * MsgSenderBean's sendMessage() method.
     */
  } 

  @OnClose 
  public void onClose(final Session session) {
    sessions.remove(session); 
  }

  public void onJMSMessage(@Observes @WebSocketsOneJMSMsg Message msg) {
    try {
      for (Session s : sessions) {
          s.getBasicRemote().sendText("message from JMS: " + msg.getBody(String.class));
      }
  } catch (IOException | JMSException ex) {
      Logger.getLogger(WebSocketsOneEndPt.class.getName()).log(Level.SEVERE, null, ex);
  }     } 

}

Если они представляют интерес, вотпроекты моих бобов Java, упомянутые в статье, на которую ссылаются выше.Но не часть моей первой проблемы.Я отлажу их после того, как открою веб-сокет.

package org.america3.websockets.javabeans;
// imports
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})

public @interface WebSocketsOneJMSMsg {

}


package org.america3.websockets.javabeans;
// imports
@Named
@MessageDriven(mappedName = "/jms/queue/sendToServerQueue")
public class WebsocketsOneMDB implements MessageListener {
  @Inject
  @WebSocketsOneJMSMsg     Event<Message> jmsEvent;

  @Override
  public void onMessage(Message msg) { 
    jmsEvent.fire(msg);   
  }
}

package org.america3.websockets.javabeans;
// imports
@Named
@LocalBean
@Stateless 
public class WebSocketsOneSenderBean {
/* This SessionBean is @Stateless,
 * as well as being part of the CDI context (@Named),
 * and as it does not have an interface, it is a @LocalBean.
 */

  /* Inject the JMSContext
   * JMSContext is a new classes added to JMS API.
   * It encapsulates a Connection and a Session, and makes 
   * use of a default ConnectionFactory, now a required resource to be 
   * provided by all Java EE 7 certified application servers.
   */
  @Inject private JMSContext jmsContext;

  /* Inject a Queue through which messages
   * will be published.  
   */
//  @Resource(mappedName = "/jms/queue/sendToClientQueue")
//  private Queue sendQueue;
  @Resource(name="SendToClientQueue", mappedName = "java:/jms/queue/sendToClientQueue")  
  private Queue sendToClientQueue; 

  private static final Set<Session> sessions 
  = Collections.synchronizedSet(new HashSet<Session>()); 

  /* Then add add a business method: sendMessage() */
  public void sendMessage(String message) {
    jmsContext.createProducer().send(sendToClientQueue, message);
    /* And you are done with the SessionBean. */
  }

}
...