我正在用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.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"时,它才有效。 这个问题有什么解释吗,我有什么误解吗?
关注回复 设置关注回复快捷键 回复素材设置-点击关注-回复消息