Может кто-нибудь сказать мне, почему этот код не открывает простой веб-сокет?
(На случай, если это будет интересно, я пытаюсь реализовать интеграцию веб-сокетов и 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. */
}
}