4

「SmackAPI」(XMPP)と「JAINSIP」API(SIP)を使用してSIP-XMPPゲートウェイを作成しました。私のアプリケーションには3つのスレッドがあります。1つはSIPの送受信用、1つはXMPPの送受信用、もう1つは着信メッセージを保存して反対のプロトコルスレッドにリダイレクトするための「MessageQueue」です(着信SIP->発信XMPP、着信XMPP- >発信SIP)

ここに画像の説明を入力してください

現在、WindowsコンピューターのEclipseでゲートウェイを実行していますが、完全に機能します。しかし、Eclipseプロジェクトを.jarファイルにエクスポートしてUbuntuサーバーで実行すると、着信メッセージはメッセージキューに保存されますが、リダイレクトされません。

ここに画像の説明を入力してください

両方のOSで同じJDKバージョン「1.6.0_14」を使用してアプリケーションを実行しています。Javaのスレッドは、WindowsシステムとUNIXシステムでわずかに異なる方法で実行されることを読みました。私は何か間違ったことをしていますか、それともスレッドはそれが実行されているOSで保留中に異なって実行されますか?

MessageQueue queue = new MessageQueue();

XMPPMessageListener xmppThread = new XMPPMessageListener();
SIPThread sipThread = new SIPThread();

new Thread(queue).start();

sipThread.setQueue(queue);
xmppThread.setQueue(queue);

queue.setXMPPThread(xmppThread);
queue.setSipThread(sipThread);

new Thread(xmppThread).start();
new Thread(sipThread).start();
4

1 に答える 1

2

どちらのOSでも、データ競合のないデッドロックのないプログラムは正しく動作するはずです。ただし、OSは十分に異なるため、潜在的なデータの競合またはデッドロックが一方のOSで、もう一方のOSよりも高い確率で認識される可能性があります。

プログラムが正しく、Windows JVMが正しい可能性はわずかですが、UNIXJVMにはバグがあります。

ただし、プログラムが実際に正しいことを確認することをお勧めします。あなたが言ったことから、最良の推測は、それがMessageQueueスレッドまたはsipThreadにぶら下がっているということです。スレッドダンプで詳細がわかります。

于 2013-03-12T12:10:43.660 に答える