2016-06-30 4 views
0

私はSmackライブラリ(Java)からEjabberdにメッセージ(自動)を撮影しています。どのようにそのが行われている: - AbstractXmppConnectionのAbstractXmppConnectionの静的インスタンス:ejabberdへのメッセージの配信遅れ

-staticオブジェクトを1人のユーザー のために作られている - すべてのAPIヒット、ポストに接続して、メッセージが接続

号を経由してEjabberdに送信されます:400の連続した周りがありますPythonスクリプトからJava Play Frameworkにヒットします。 scripとapiは正常に動作し、ログを介してチェックされます。問題はメッセージが遅れてユーザーに届くことです。 2メッセージの撮影の間に、約1分遅延があります。 mysqlデータベース、アーカイブテーブルをチェックすると、最初のヒットのエントリが1つしかなく、連続したエントリが非常にゆっくりと来ます。

ただし、AbstractXmppConnectionをクラスのインスタンスにして、接続ごとに、shootMessageを実行し、すべてのヒットでフローを切断すると、メッセージは即座に送信されます。しかし、同じアカウントを非常に速く接続したり切断したりすると、Ejabberdに負荷がかかります。

質問:メッセージの配信が非常に遅い複数のメッセージを送信するために再利用すると、AbstractXmppConnectionの同じ(静的な)オブジェクトがなぜですか?以下のために再利用

public synchronized void sendMessage(String senderId,String receiverId, String SERVER, Message message) throws IOException, XMPPException, SmackException { 
+  Logger.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SENDING MESSAGE TO "+receiverId + " from "+senderId+ " Message "+message.toXML().toString()); 
+ 
+  AbstractXMPPConnection abstractXMPPConnection; 
+ 
+  //Making connection 
+  EjabberdConnectionQuote ejabberdConnection = new EjabberdConnectionQuote(); 
+  abstractXMPPConnection = ejabberdConnection.getConnection(); 
+  abstractXMPPConnection.login(senderId,"secret"); 
+ 
+  //Create chat 
+  Chat chat = null; 
+  ChatManager chatManager = null; 
+  chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); //$$$$$NEW INSTANCE$$$$ 
+  chat = chatManager.createChat(receiverId + SERVER); 
+  chat.sendMessage(message); 
+ 
+  abstractXMPPConnection.disconnect(); 
+ 
+  if (abstractXMPPConnection.isConnected()){ 
+   Logger.info("Still Connected"); 
+  }else{ 
+   Logger.info("<---------Disconnected------->"); 
+  } 
+ } 

コード(静的接続オブジェクト:私は、すべてのAPIヒットでその速い

コード(:速い動作しますが、理由は接続/切断頻度の負荷を増大させ、複数のインスタンスを)新しいインスタンスを作成する必要がある場合すべてのAPIヒット、1人のユーザーを模倣し、多くのユーザーにシューティング):

AbstractXMPPConnection abstractXMPPConnection; 
+  SingletonConnection obConn = SingletonConnection.getInstance(); 
+  if (obConn.connectionMap.containsKey(senderId)) { 
+   Logger.info("Already Connected"); 
+   //Remove and update timer 
+   obConn.updateTimer(senderId); 
+   abstractXMPPConnection = obConn.connectionMap.get(senderId).abstractXMPPConnection; 

+  }else{ 
+   Logger.info("Creating new connection"); 
+   //Create new connection and put it in map 
+   EjabberdConnectionQuote ejabberdConnection = new EjabberdConnectionQuote(); 
+   abstractXMPPConnection = ejabberdConnection.getConnection(); 
+   abstractXMPPConnection.login(senderId,"secret"); 
+   RemoveConnectionTimer removeConnectionTimer = new RemoveConnectionTimer(senderId); 
+   StoreData storeData = new StoreData(senderId,abstractXMPPConnection,removeConnectionTimer); 
+   obConn.connectionMap.put(senderId,storeData); 
+ 
+  } 



Message message = createMessage(quote, returnDateInIst(), senderId, receiverId); 
     String key = receiverId + "$$$" + senderId; 

-  SingletonConnection.getInstance().sendMessage(senderId,receiverId,SERVER,message); 
+  Chat chat = null; 
+  ChatManager chatManager = null; 
+  chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); //$$$$$REUSE EXISTING connection$$$$ 
+  chat = chatManager.createChat(receiverId + SERVER); 
+  chat.sendMessage(message); 
+ 
+  //abstractXMPPConnection.disconnect(); 
+ 
+  if (abstractXMPPConnection.isConnected()){ 
+   Logger.info("Still Connected"); 
+  }else{ 
+   Logger.info("<---------Disconnected------->"); 
+ } 
+0

私はあなたがAbstractConnectionManagerの使い方をしていると思いますが、あなたのニーズはわかりません。 AbstractConnectionを使用する一種のXmppManagerを開発する必要があります。 Connectionは設定を保存しています。ログアウト後もこの設定を保持できます(接続からログインを分割した場合)。だから接続して接続を切断する必要はありません、1ユーザー1の接続、それが生きている場合は、 "一度"チャットを作成します...正直なところ、あなたのコードのポイントを取得していません – MrPk

答えて

0

スワックのソースコードを多くロギングして確認したところ、理由がわかりました。

chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); 
    chat = chatManager.createChat(receiverId + SERVER); 
    chat.sendMessage(message); 

上記のコードスニペットは、抽象XMPPConnectionオブジェクトがインスタンス化されたスレッドのみがアクセスできるチャットオブジェクトを返します。オブジェクトが他のスレッドからアクセスされた場合、それはnullです。

関連する問題