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() {
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 回答