2012-04-15 66 views
1

我遇到了問題,將一些連接信息傳遞給可運行線程(使用rabbitmq,但我不認爲這是針對rabbitmq並可應用於任何事情)。我的目標是讓幾個工作線程從隊列中處理一些工作,但我不希望每次都打開和關閉連接。如何將連接信息傳遞給可運行?

的代碼就開始運行,而不運行的(它實際上是從的RabbitMQ教程被盜),但我實現一個可運行的經過我得到的doWork()這個錯誤的連接: 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 2012-04-15 16:36:08

回答

4

如果您將代碼移至Runnable,這意味着您創建了一個新類。如果你想調用它,那麼你應該有這樣的事情

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

但你可能想要移動所有外部線程,這是完成:

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

順便說一句,類應以大寫字母開頭,它使代碼更具可讀性。

+0

非常感謝,我會調整我的外殼。我是否錯誤地認爲這是每次選擇它時都會啓動一個新線程?如果(在我的隊列示例中)我會只想同時處理4個(我有多少個核心)項目會發生什麼?我可以將它設置在隊列服務器上,但它會爲我的所有客戶端(即使是擁有更多內核的客戶端)都這樣做,是否有辦法將我啓動的線程數限制爲特定的數量? – 2012-04-15 19:57:32

+2

如果你想限制線程的數量,那麼你應該看看'Executors.newFixedThreadPool(num)'。您只需提交作業,池會保持線程處於正確的水平。 – Gray 2012-04-15 21:17:06

3

您試圖調用名爲doWork方法:

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

你想做的事(我猜)是什麼是這樣的:

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

但更可能你想fork一個線程有那麼這將是:

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

順便說一句,你應該利用你的類名這將使它更容易看到。 doWork應該重命名爲DoWork,那麼更容易看到方法名稱和類名稱之間的區別。方法名稱應始終以小寫字母開頭。

1

在您的Worker類中的某處,您定義了一個方法doWork(String message)。在您的doWork類(其名稱不遵循Java約定,btw)中定義的內容,直到您創建該類的實例並調用該實例的方法纔是重要的;你正試圖調用目前的Worker類的方法。

相關問題