- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 jmsTemplate.sendAndReceive 获取同步响应:
Message responseMessage = producer.produceAndReceive(gzip, mestype, uploadFile.getName(), uploadFile.getAbsolutePath());
它在另一个类中调用 ProduceAndReceive:
@Override
public Message produceAndReceive(final byte[] data, final String type, final String name, final String archivePath) {
jmsTemplate.setReceiveTimeout(20000);
return jmsTemplate.sendAndReceive(SAPPI_EXPORT_QUEUE, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
String msgId = UUIDGen.getUUID();
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
message.setStringProperty(ISapProducer.IDOC_TYPE, type);
message.setStringProperty(ISapProducer.ORIGIN_FILE_NAME, name);
message.setStringProperty(ISapProducer.MESSAGE_ID, msgId);
message.setStringProperty(ISapProducer.ARCHIVE_PATH, archivePath);
message.setJMSReplyTo(session.createTemporaryQueue());
message.setJMSCorrelationID(msgId);
return message;
}
});
}
在这一步之后,我认为该消息已经放入队列中。我有 @JmsListener 方法,“监听”这个队列:
@Override
@JmsListener(destination = "myqueue.export")
public void consume(final Message message) throws ServerException {
// some logic here
final HttpStatus httpStatus = client.send(gzip, idocType, documentFileName, messageId, archivePath);
jmsTemplate.send(message.getJMSReplyTo(), new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
Message responseMsg = session.createTextMessage(httpStatus.toString());
responseMsg.setJMSCorrelationID(message.getJMSCorrelationID());
return responseMsg;
}
});
// some logic here
}
这里我将http请求发送到远程系统,并尝试在sendAndReceive()方法的响应消息中使用httpStatus。但在responseMessage中始终为null。而且看起来它是异步工作的。
我该如何解决这个问题?
最佳答案
对我来说效果很好...
@SpringBootApplication
public class So53506177Application {
public static void main(String[] args) {
SpringApplication.run(So53506177Application.class, args);
}
private final SimpleMessageConverter converter = new SimpleMessageConverter();
@Bean
public ApplicationRunner runner(JmsTemplate jmsTemplate) {
return args -> {
jmsTemplate.setReceiveTimeout(20000);
Message received = jmsTemplate.sendAndReceive("foo", new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
String msgId = "foo";
TextMessage message = session.createTextMessage("foo");
message.setJMSCorrelationID(msgId);
return message;
}
});
System.out.println("Reply: " + this.converter.fromMessage(received));
};
}
@Autowired
private JmsTemplate jmsTemplate;
@JmsListener(destination = "foo")
public void consume(final Message message) throws Exception {
System.out.println("Received: " + this.converter.fromMessage(message));
jmsTemplate.send(message.getJMSReplyTo(), new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
Message responseMsg = session.createTextMessage("bar");
responseMsg.setJMSCorrelationID(message.getJMSCorrelationID());
return responseMsg;
}
});
}
}
和
Received: foo
Reply: bar
但是,虽然它不会影响结果,但您不应该创建自己的 replyTo
- 模板会在 MessageCreator
退出后创建自己的回复(并使用来自它)。完成后它也会删除它:
@Nullable
protected Message doSendAndReceive(Session session, Destination destination, MessageCreator messageCreator)
throws JMSException {
Assert.notNull(messageCreator, "MessageCreator must not be null");
TemporaryQueue responseQueue = null;
MessageProducer producer = null;
MessageConsumer consumer = null;
try {
Message requestMessage = messageCreator.createMessage(session);
responseQueue = session.createTemporaryQueue();
producer = session.createProducer(destination);
consumer = session.createConsumer(responseQueue);
requestMessage.setJMSReplyTo(responseQueue);
if (logger.isDebugEnabled()) {
logger.debug("Sending created message: " + requestMessage);
}
doSend(producer, requestMessage);
return receiveFromConsumer(consumer, getReceiveTimeout());
}
finally {
JmsUtils.closeMessageConsumer(consumer);
JmsUtils.closeMessageProducer(producer);
if (responseQueue != null) {
responseQueue.delete();
}
}
}
您还可以简化您的监听器:
@JmsListener(destination = "foo")
public String consume(final Message message) throws Exception {
System.out.println("Received: " + this.converter.fromMessage(message));
return "bar";
}
关于jms - 如何使用 JmsTemplate.sendAndReceive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506177/
我已经尝试运行简单的 spring jmstemplate 示例。这里是发件人的源代码, import javax.jms.Destination; import javax.jms.JMSExcep
我正在使用 Spring Boot 2.1.6 构建 REST API 应用程序。我想在我的应用程序中使用 JMS 消息传递和 Active MQ 包 (org.apache.activemq)。我有
我一直在寻找一些文档/示例来检查动态创建的主题是否存在,如果存在,如何获取该主题的订阅者计数。 我使用以下代码向主题发送消息 - jmsTemplate.send(destination, new M
到目前为止,我只能在 jms 连接工厂中找到并发设置: 是否可以配置单个队列的消费者数量?即类似: 谢谢!~ 最佳答案 不要使用命名空间,而是使用抽象父级 DefaultMessageLi
我有 JMS 应用程序 和 IBM MQ jars 配置,使用 spring 它在正确的队列信息下运行良好,但是当我提供错误的队列信息时 卡在 LOG.info("SENDING MESSAGE");
我正在尝试将消息头插入 amq。 JMSTemplate 中没有特定方法用于在 amq 中设置 header。当我这样设置时,它将保存在 StringProperty 而不是标题。保存到标题如何传递数
我想从 jmsTemplate.sendAndReceive 获取同步响应: Message responseMessage = producer.produceAndReceive(gzip
我想为连接到 ActiveMQ 代理的多个生产者共享 JMSTemplate 的单个实例。示例配置: 我可以使用上面的配置吗? 正如这里提到的:http://docs.sp
我正在使用 Spring boot,我想动态创建多个 JMS 模板,因为我想连接到不同的 JMS 实例。我知道使用注释的标准方法,将 ConnectionFactory 链接到 JMSTemplate
我的服务方法如下所示,我试图模拟 JmsTemplate 以便它可以在单元测试期间发送消息,但它不执行 jmsTemplate.send(...),它直接转到下一行,怎么可能我使用单元测试执行我的服务
我们当前使用 JmsTemplate 的 send(Destination, messageCreator) 方法将消息发送到 webMethods 队列。然而,有时 send 方法需要很长时间才能返
我编写了一个在 Glassfish 中的 Web 服务中运行的 JMS 应用程序(也将其部署在 JBoss 中),我注意到在我通过 MessageListener MDP 处理多条消息后,JMS 服务
我正在使用 Spring API 的 JmsTemplate 和 MappingJackson2MessageConverter(版本:spring-jms-4.3.4.RELEASE.jar)来发布
我刚刚重构了一些发布到 JMS 主题的代码以使用 Spring 的 JmsTemplate 类,现在我收到一个异常,指出我未通过身份验证。 之前我创建了工厂,建立了连接,然后是 session 等,如
需要模拟 JmsTemplate 以在我的应用程序中进行集成测试。 在我的 appcontext.xml 中
我需要在特定时间后删除一条消息,所以我启用了 explicitQosEnabled 并设置了生存时间。 但我注意到消息已被删除,但它花费的时间比指定的时间(一分钟)长,所以以前有人遇到过这个问题吗?
我相信我搞砸了配置,但我不知道在哪里以及如何修复它。 Here你可以找到代码。 org.springframework.jms.UncategorizedJmsException: Uncategor
我正在探索 jmsTemplate 实现并遇到一个问题。可以手动将 JMSMessageId 应用于消息,但回调会返回不同的 MessageId。 示例代码: log.debug("Sending r
在 asyncSend 设置为 true 的情况下发送持久消息是否有最佳实践或指南。 我们没有配置事务管理器 我们有 ~40k-50k 消息,这些消息是使用配置有 的 jmsTemplate 发送的
我有发送到 IBM MQ 队列的 JMS 消息,如果远程客户端(我无法控制远程客户端)在给定的时间(比如 1 分钟)内没有使用消息,消息应该过期(我有过期部分工作,“MQ 删除消息”在 JMSTemp
我是一名优秀的程序员,十分优秀!