当前位置: 首页 > 知识库问答 >
问题:

通道关闭:通道错误:回复代码=406,回复文本=Premission\u失败-已设置回复使用者

隗新霁
2023-03-14

我正在用Spring-amqp和Spring-Rabbit进行多项测试。我的Maven父是Spring引导启动父:1.2.3。释放拉:

spring-rabbit:1.4.3.RELEASE
    spring-amqp:1.4.3.RELEASE
    amqp-client:3.4.2

在某一点上,其中一个测试失败了,出现了这个错误,我看不出原因:

Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,2119)
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - reply consumer already set, class-id=60, method-id=20)
Detected closed channel on exception.  Re-initializing: null

如果我改为SpringBootStarter父级:1.3.1。发布所有测试都通过了。

在不同的版本中挖掘,似乎我仍然可以用

spring-rabbit:1.5.0.M1
    spring-amqp:1.5.0.M1
    amqp-client:3.5.5

但是所有的测试都通过了

spring-rabbit:1.5.0.RELEASE
    spring-amqp:1.5.0.RELEASE
    amqp-client:3.5.5

1.5.0之间是否有任何相关变更。M1和1.5.0。你能回答这个问题吗?我试图浏览GitHub compare,但没有帮助。

第一次更新:

我可以缩小这个问题的范围。在测试中,我调用sendAndReceive()到HystrixCommand中的队列(来自Netflix)。此HystrixCommand使用的超时时间小于RabbitTemplate中的默认回复超时时间(5s)。

服务正在侦听声明的队列并返回答案。

我有一个特定的测试来对一个不存在的队列执行sendAndReceve()。当执行该特殊测试时,Hystrix命令会超时。

对声明的队列执行sendAndReceive()的下一个测试将给出通道错误。

@SpringBootApplication
public class SpringAmqpTestApplication implements CommandLineRunner {

    public static final String QUEUE_NAME = "Spring-AMQP-Test";
    private static final String NONEXISTENT_QUEUE_NAME = UUID.randomUUID().toString() + "@" + System.currentTimeMillis();

    public static void main( String[] args ) {
        SpringApplication.run( SpringAmqpTestApplication.class, args );
    }

    @Autowired
    AmqpTemplate amqpTemplate;

    @Override
    public void run( String... args ) throws Exception {
        sendAndReceive( QUEUE_NAME );

        sendAndReceive( NONEXISTENT_QUEUE_NAME );

        sendAndReceive( QUEUE_NAME );
    }

    private void sendAndReceive( String routingKey ) {
        CustomHystrixCommand customHystrixCommand = new CustomHystrixCommand( amqpTemplate, routingKey );
        String answer = customHystrixCommand.execute();
        System.err.println( "< sendAndReceive(): " + answer );
    }
}

我的HystrixCommand相当简单:

public class CustomHystrixCommand extends HystrixCommand<String> {

    private String routingKey;

    AmqpTemplate amqpTemplate;

    public CustomHystrixCommand( AmqpTemplate amqpTemplate, String routingKey ) {
        super( HystrixCommandGroupKey.Factory.asKey( "" ), 2000 );
        this.amqpTemplate = amqpTemplate;
        this.routingKey = routingKey;
    }

    @Override
    protected String run() throws Exception {
        String request = UUID.randomUUID().toString();
        MessageProperties messageProperties = new MessageProperties();
        Message message = new Message( request.getBytes(), messageProperties );
        Message answer = amqpTemplate.sendAndReceive( "", routingKey, message );
        return "OK answer";
    }

    @Override
    protected String getFallback() {
        return "getFallback()";
    }

}

带spring boot starter父级:1.2.3。发布我的日志是:

< sendAndReceive(): OK answer
< sendAndReceive(): getFallback()
2016-01-27 11:47:42.266 ERROR 15007 --- [pool-1-thread-1] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - reply consumer already set, class-id=60, method-id=20)
< sendAndReceive(): getFallback()

使用spring boot starter父级时:1.3.1。发布:

< sendAndReceive(): OK answer
< sendAndReceive(): getFallback()
< sendAndReceive(): OK answer

谢谢你的帮助/解释。

共有1个答案

舒宏富
2023-03-14

我不知道有什么变化(但还没有看到),但无论如何,是1.5.0。M1是一个预发布的里程碑和1.5.0。释放就是释放。当实际版本可用时,不应使用里程碑。目前的版本是1.5.3。释放

 类似资料:
  • 我有以下工作流程。 > 入站通道 分流器 分割通道的任务执行器-所有线程执行相同的工作流。 3.a .构建请求 3.b .网关消息endpoint的服务激活器包装。 3 . c . http-outbound-gateway上带有错误通道配置的网关包装器(用于在调用http-outbound-gateway时处理异常) 超文本传输协议-出站-网关 聚合器 spring集成工作流的响应。 如果在 3

  • 问题内容: 当我在Go中编写函数时,它应该返回一个值和一个错误,例如 我想在goroutine中执行此createHashedPassword,我想通过通道传递数据。 但是我的问题是,如何在此处或goroutine中处理错误? 问题答案: 通常将多个输出捆绑到一个结构中,然后通过一个通道将它们一起返回。

  • 这是使用注释代码示例的Spring集成执行器通道的后续问题。 我试图通过在“公共频道”中发布一条消息并阅读味精中设置的REPLY_CHANNEL来测试用红色突出显示的框。 “公共通道”是发布-订阅通道。REPLY_通道是一个队列通道。 由于这是一个JUnit测试,我已经模拟了jdbcTemboard、数据源和Impl以忽略任何DB调用。 我的问题是:当我在“公共频道”上发布消息时,我在REPLY\

  • 我在Java方面有个问题。我正在制作一个程序来检查给定的文本是否有回文。我99%确定我的代码是正确的,但我不能得到一个好的结果。这是代码。 例如,我输入: 为什么是假的/

  • 但我得到的错误如下: POM: 我按以下方式配置入站网关: 并且,服务激活器: 顺便说一句,只有当我在服务激活器中删除outputChannel="outputChannel"时,它才有效。 这个问题有什么解释吗,我有什么误解吗?

  • 关注回复 设置关注回复快捷键 回复素材设置-点击关注-回复消息