2012-04-15 15 views
1

実行可能なスレッドに接続情報を渡す際に問題が発生しています(rabbitmqを使用していますが、これはrabbitmqに固有のものではないと思われます)。私の目標は、キューから作業を処理するワーカースレッドをいくつか持つことですが、毎回接続を開いたり閉じたりするオーバーヘッドは欲しません。接続情報を実行可能ファイルに渡すにはどうすればよいですか?

コードは、私がdoWork()でこのエラーを取得し、接続を渡して実行可能を実装するとすぐに(その実際のRabbitMQのチュートリアルから盗まれた)が、実行可能せずに動作します: The method doWork(Channel, String) is undefined for the type Worker私は実行可能からチャンネルを削除しない場合それを送信するとプログラムは正常に動作しますが、接続情報は渡されません。私に何ができる?ここで

は私のコードです:

その後、
 //this is the standard stuff to start a connection 
ConnectionFactory factory = new ConnectionFactory(); 
      factory.setHost("localhost"); 
      Connection connection = factory.newConnection(); 
      Channel channel = connection.createChannel(); 

     System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); 

     channel.basicQos(1); 

     QueueingConsumer consumer = new QueueingConsumer(channel); 
     channel.basicConsume("task_queue", false, consumer); 
     //end of standard stuff  

     while (true) { 
      QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
      String message = new String(delivery.getBody()); 

      System.out.println(" [x] Received '" + message + "'"); 
      doWork(channel, message); 
      System.out.println(" [x] Done"); 

      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); 
     } 
     } 

public class doWork implements Runnable{ 

     protected Channel channel = null; 
     protected String message = null; 

     public doWork(Channel channel, String message) { 
      this.channel = channel; 
      this.message = message; 
     } 


     public void run() { 
+2

'UpperCase'、' camelCase'のメソッドとフィールド、 'FULL_CAPS'の静的最終定数にクラス名を付けてください。また、[インターフェイスは常に形容詞であり、クラスは名詞です](http://www.iwombat.com/standards/JavaStyleGuide.html#Class%20and%20Interface%20Names)。 – adarshr

答えて

4

コードをRunnableに移動した場合、これは新しいクラスを作成したことを意味します。あなたはそれを呼び出すようにしたい場合は、この

doWork work = new doWork(channel, message); 
work.run(); 

のようなものを持っている必要がありますしかし、あなたはおそらくによって行われている外部のスレッドにすべてのことを移動する:

Thread t = new Thread(new doWork(channel, message)); 
t.start(); 
ところで

、クラスがすべき大文字で始めると、コードがはるかに読みやすくなります。

+0

ありがとう、私はケーシングを調整します。私はこれを選択するたびに新しいスレッドを起動するように見て間違っていますか?私の待ち行列の例では、一度に4つのコア(#つのコア)を処理するだけの場合はどうなりますか?私はキューサーバー上でそれを設定することができますが、それは私の特定の番号に起動するスレッドの数を制限する方法はありますか? –

+2

スレッドの数を制限したい場合は、 'Executors.newFixedThreadPool(num)'を見てください。ジョブをサブミットするだけで、スレッドは適切なレベルにスレッドを保持します。 – Gray

3

あなたはdoWorkという名前のメソッドを呼び出すようにしようとしている。

// this is a method call 
doWork(channel, message); 

あなたは(私は推測)何をしたいですか次のようなものです:

new doWork(channel, message).run(); 

いますが、それは次のようになりようがスレッドをフォークしようとしている可能性が高い:余談として

new Thread(new doWork(channel, message)).start(); 

、あなたはそれが簡単に見ることになるだろう、あなたのクラス名を大文字にする必要があります。 doWorkの名前をDoWorkに変更すると、メソッド名とクラス名の違いが分かりやすくなります。メソッド名は常に小文字で始まる必要があります。

1

Workerクラスのどこかに、メソッドdoWork(String message)が定義されています。 doWorkクラスの中で定義されているもの(その名前はJavaの規約に従わない、btw)は、そのクラスのインスタンスを作成してそのインスタンスでメソッドを呼び出すまでは関係ありません。あなたは現在Workerクラスのメソッドを呼び出そうとしています。

関連する問題