1

実行可能なスレッドに接続情報を渡す際に問題が発生します(rabbitmqを使用しますが、これはrabbitmqに固有のものではなく、何にでも適用できると思います)。私の目標は、いくつかのワーカースレッドでキューからの作業を処理することですが、毎回接続を開いたり閉じたりするオーバーヘッドは必要ありません。

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

これが私のコードです:

      //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() {
4

3 に答える 3

4

コードをRunnableに移動した場合、これは新しいクラスを作成したことを意味します。あなたがそれを呼び出したいなら、あなたはこのようなものを持っているべきです

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

ただし、これらすべてを外部スレッドに移動することをお勧めします。これは次の方法で実行されます。

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

ところで、クラスは大文字で始める必要があります。これにより、コードがはるかに読みやすくなります。

于 2012-04-15T16:34:18.140 に答える
3

次の名前のメソッドを呼び出そうとしていますdoWork

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

あなたがしたいこと(私は推測する)は次のようなものです:

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

しかし、おそらくあなたはそこでスレッドをフォークしようとしているので、それは次のようになります:

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

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

于 2012-04-15T16:34:14.647 に答える
1

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

于 2012-04-15T16:38:10.893 に答える