首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将连接信息传递给runnable?

如何将连接信息传递给runnable?
EN

Stack Overflow用户
提问于 2012-04-16 00:27:43
回答 3查看 478关注 0票数 1

我在向可运行线程传递一些连接信息时遇到了问题(使用rabbitmq,但我不认为这是rabbitmq特有的,可以应用于任何东西)。我的目标是让几个工作线程处理队列中的一些工作,但我不希望每次打开和关闭连接的开销。

代码可以在没有runnable的情况下工作(它实际上是从rabbitmq教程中窃取的),但是一旦我实现了一个runnable来传递一个连接,我就会在doWork()上得到这个错误:The method doWork(Channel, String) is undefined for the type Worker如果我从runnable中移除了通道并且不发送它,那么程序就可以正常工作,但是连接信息没有被传递。我能做什么?

下面是我的代码:

代码语言:javascript
复制
      //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);
        }
      }

然后:

代码语言:javascript
复制
  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() {
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-16 00:34:18

如果您将代码移动到Runnable,这意味着您创建了一个新类。如果您想要调用它,那么您应该拥有如下内容

代码语言:javascript
复制
doWork work = new doWork(channel, message);
work.run();

但是您可能希望将所有这些都移到外部Thread,这可以通过以下方式完成:

代码语言:javascript
复制
Thread t = new Thread(new doWork(channel, message));
t.start();

顺便说一句,类应该以大写字母开头,这使得代码更具可读性。

票数 4
EN

Stack Overflow用户

发布于 2012-04-16 00:34:15

您正在尝试调用名为doWork的方法

代码语言:javascript
复制
 // this is a method call
 doWork(channel, message); 

您想要做的(我猜)是这样的:

代码语言:javascript
复制
 new doWork(channel, message).run();

但更有可能的是,您正在尝试在那里派生一个线程,因此它将是:

代码语言:javascript
复制
 new Thread(new doWork(channel, message)).start();

顺便说一句,你应该把你的类名大写,这样会更容易看出来。应该将doWork重命名为DoWork,这样更容易看出方法名和类名之间的区别。方法名称应始终以小写字母开头。

票数 3
EN

Stack Overflow用户

发布于 2012-04-16 00:38:11

在您的Worker类中的某个地方,您定义了一个doWork(String message)方法。在您的doWork类(其名称不遵循Java约定,顺便说一句)中定义了什么并不重要,直到您创建了该类的一个实例并在该实例上调用该方法;您目前正在尝试调用Worker类的一个方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10163822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档