私はjavaで新しく、mongoDBコレクションからランダムなデータを読み込み、Webソケットを介して単純なwebsocketクライアントに送信したいと考えています。実際には、私はjavaアプリケーション(websocketserver)を配備したtomcatを実行しています。これは、クライアントからのメッセージに返信するシンプルなwebsocketエコーサーバです。mongoDBからドキュメントを読み込み、javaのWebソケットを介してドキュメントを送信するには?
package websocket.chat;
import com.mongodb.MongoClient;
import javax.websocket.*;
import javax.websocket.server.*;
import java.io.IOException;
@ServerEndpoint(value="/echo")
public class EchoEndpoint {
MongoAccess mongo;
@OnOpen
public void onOpen(Session session, EndpointConfig config) throws IOException {
System.out.println("open");
mongo = new MongoAccess(new MongoClient("localhost",27017));
session.getBasicRemote().sendText(mongo.readNumberOfDocuments(10).toString());
}
@OnMessage
public String echo(String message) {
System.out.println("Server answer");
return message + " (from your server)";
}
@OnError
public void onError(Throwable t) {
System.out.println("Error!!!");
t.printStackTrace();
}
@OnClose
public void onClose(Session session) {
System.out.println("close");
}
}
ここで、mongoDBからのデータをOnMessageイベントで送信したいとします。そのために私は3つのクラスを作りました。
クラスNr.1コレクション
package websocket.chat;
import com.mongodb.*;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
public class MongoAccess {
private DBCollection collection;
//Konstruktor
public MongoAccess(MongoClient mongo)
{
this.collection = mongo.getDB("randomData").getCollection("random");
}
//read all datasets
public List<Dataset> readAllDocuments(){
List<Dataset> data = new ArrayList<Dataset>();
//Cursor object to iterate over set of documents
DBCursor cursor = collection.find();
while(cursor.hasNext()){
System.out.println(cursor.next());
DBObject doc = cursor.next();
Dataset d = DataConverter.convertDBobject(doc);
data.add(d);
}
return data;
}
//read a number of datasets
public List<Dataset> readNumberOfDocuments(int number) {
//query, less then equal number
BasicDBObject query = new BasicDBObject(("data_id"), new BasicDBObject("$lte", number));
//Cursor object to iterate over set of documents that matched our query
DBCursor cursor = collection.find(query);
List<Dataset> data = new ArrayList<Dataset>();
while (cursor.hasNext()) {
System.out.println(cursor.next());
DBObject doc = cursor.next();
Dataset d = DataConverter.convertDBobject(doc);
data.add(d);
}
return data;
}
}
クラスNr.2からデータを読み込むため:データオブジェクト
package websocket.chat;
public class Dataset {
private Integer data_id;
private Float X;
private Float Y;
private Float Z;
public Integer getData_id() {
return data_id;
}
public void setData_id(Integer data_id) {
this.data_id = data_id;
}
public Float getX() {
return X;
}
public void setX(Float x) {
X = x;
}
public Float getY() {
return Y;
}
public void setY(Float y) {
Y = y;
}
public Float getZ() {
return Z;
}
public void setZ(Float z) {
Z = z;
}
}
クラスNr.3:DBObjectを
import com.mongodb.BasicDBObjectBuilder;
public class DataConverter {
//convert DBObject to Dataset Object
public static Dataset convertDBobject(DBObject doc)
{
Dataset d = new Dataset();
d.setData_id((int)doc.get("data_id"));
d.setX((float)doc.get("x"));
d.setY((float)doc.get("y"));
d.setZ((float)doc.get("z"));
return d;
}
}
を変換します
websocketサーバーに接続しようとすると、websocket接続でこのエラーがスローされます。
java.lang.NoClassDefFoundError: com/mongodb/DBObject
at websocket.chat.EchoEndpoint.onOpen(EchoEndpoint.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:65)
at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:64)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:133)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:844)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: com.mongodb.DBObject
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
... 15 more
私はエラーを見つけようとしましたが、何もしませんでした。何か案は?