Отредактировано 12/20
Oracal требует, чтобы я перестроил корпоративный проект WebStart / JMS / Java-Swing-Client в Websockets ./
Итак, я начинаю кривую обучения с реализацииПример JMS / Websockets в следующем блоге и развертывание проекта в виде файла EAR на сервере Wildfly 10.
[https://blogs.oracle.com/theaquarium/integrating-websockets-and-jms-with-cdi-events-in-java-ee-7-v2][1]
Мой проект компилируется нормально.Файл сборки ANT упаковывает его в файл ear, хорошо.
Но когда я автоматически развертываю файл ear на Wildfly10, он выдает
ClassNotFoundException javax.jms.Destination
Но я прочиталчто при запуске Wildfly с standalone-full.xml он будет настроен с помощью JMS API.И я определенно начинаю его с standalone-full.xml.
Это похоже на избыточное убийство, но я не мог понять, как полностью объяснить проблему только с помощью фрагментов, поэтому я вставил полный код проекта ниже, поэтомуесли ничего другого, то запуск его в работу может быть полезен для других, сталкивающихся с отключением Oracal Webstart.
Вот список кода, вставленного ниже.
A: Классы:
B: все банки в моем пути сборки.
C: application.xml и web.xml
D: Структура файла ear. (я не вставил его ниже, но у меня есть файл сборки ANT, который упаковывает проект.
E:HTML Websocket Client.
ДЕТАЛИ
A: Классы
EndPointOne.java
package org.america3.websockets.endpoints;
import java.io.Serializable;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.america3.websockets.javabeans.WebsocketJMSMsg;
import org.america3.websockets.javabeans.WebsocketSenderBean;
import javax.inject.Named;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
@Named
@ServerEndpoint("/websocket")
public class EndpointOne implements Serializable {
//class members
private WebsocketSenderBean senderBean;
private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
// Constructor
@Inject
public EndpointOne(WebsocketSenderBean sb) {
this.senderBean = sb;
}
//Methods
@OnOpen
public void onOpen(final Session session) {
sessions.add(session);
}
@OnMessage
public void onMessage(final String message, final Session client) {
senderBean.sendMessage(message);
}
@OnClose
public void onClose(final Session session) {
sessions.remove(session);
}
public void onJMSMessage(@Observes @WebsocketJMSMsg Message msg) {
try {
for (Session s : sessions) {
s.getBasicRemote().sendText("message from JMS: " + msg.getBody(String.class));}
} catch (IOException | JMSException ex) {
Logger.getLogger(EndpointOne.class.getName()).log(Level.SEVERE, null, ex);}
}
}
WebsocketMDB.java
package org.america3.websockets.javabeans;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.IOException;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.websocket.Session;
import org.america3.websockets.endpoints.EndpointOne;
import javax.ejb.MessageDriven;
import javax.inject.Named;
import javax.inject.Qualifier;
import javax.inject.Inject;
import javax.enterprise.event.Event;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.enterprise.event.Observes;
@Named
@MessageDriven(mappedName = "/jms/queue/listenToWSClientQueue")
public class WebsocketMDB implements MessageListener {
//Class Members
@Inject
@WebsocketJMSMsg
Event<Message> jmsEvent;
private static final Set<Session> sessions
= Collections.synchronizedSet(new HashSet<Session>());
//Methods
@Override
public void onMessage(Message msg) {
jmsEvent.fire(msg);
}
}
WebsocketSenderBean.java
package org.america3.websockets.javabeans;
import javax.inject.Named;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.annotation.Resource;
import javax.jms.Queue;
import javax.inject.Inject;
import javax.jms.JMSContext;
@Named
@LocalBean
@Stateless
public class WebsocketSenderBean {
//Class members
@Resource(mappedName = "jms/queue/sendToWSClientQueue")
private Queue sendQueue;
@Inject private JMSContext jmsContext;
//Class methods
public void sendMessage(String message) {
jmsContext.createProducer().send(sendQueue, message);
}
}
WebsocketJMSMsg.java
package org.america3.websockets.javabeans;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface WebsocketJMSMsg {
/***************************************/
/* This seems an important part of the */
/* project. I think it must be used to */
/* swap Websockt <-> Java Bean messages*/
}
B: файлы jar пути сборки.
C:\Program Files\Java\jre1.8.0_191
cdi-api-1.1.jar
javax.jms-api-2.0.jar
javax.websocket-api-1.1.jar
javax-inject.jar
javax.jms-3.1.2.2.jar
C: файлы конфигурации XML
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"
version="1.4">
<description>GoTest</description>
<display-name>WebsocketOne</display-name>
<!-- Declare the server-side jar file as an ejb modules -->
<module>
<ejb>WebsocketJMS-server.jar</ejb>
</module>
<module id="WebOne">
<web>
<web-uri>WebsocketJMS-war.war</web-uri>
<context-root>/WSTEST</context-root>
</web>
</module>
</application>
D: структура ушного вкладыша
EAR FILE (WebsocketJMS.ear)
META-INF
MANIFEST.MF
application.xml
SERVER SIDE CLASS JAR (WebsocketsJMS-server.jar)
META-INF
MANIFEST.MF
org.america3.websockets.endpoints
EndpointOne.java
org.america3.websockets.javabeans
WebsocketJMSMsg.java
WebsocketMDB.java
WebsocketSenderBean.java
WAR Archive (WebsocketsJMS-war.war)
WEB-INF
MANIFEST.MF
web.xml
index.html