【发布时间】:2018-04-26 12:57:32
【问题描述】:
我正在使用 Netty4 组件 (http://camel.apache.org/netty4.html) 在消费者模式下构建一个具有 Apache Camel 路由的微服务。因此,在我的微服务中,我正在构建的这条路由将通过 TCP 连接接收消息。为此,我这样做了:
@Override
public void configure() throws Exception {
this.from("netty4:tcp://localhost:7000?textline=true&encoding=utf8")
.process(new Processor() {
@Override
public void process(final Exchange exchange) throws Exception {
log.info("[Processor] - Incoming Message -> {}", exchange.getIn().getBody(String.class));
}
}).to("bean:messageService");
}
嗯,我正在正常接收消息。为了测试,我使用 telnet:
$ telnet localhost 7000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TheMessage
问题是当我想将消息发送回在该路由中建立的同一个 TCP 通道时。在同步模式下,我可以使用 Exchange 对象轻松做到这一点。 但是,在异步模式下,我不知道如何将消息发送回生产者。
接收和发送消息的 Spring Service 是这样的:
@Service
public class MessageService {
private static final Logger log = LoggerFactory.getLogger(MessageService.class);
private List<String> messageStore = new LinkedList<>();
public void sendToTCP(final String message) {
log.info("[Service] - Sending Message over TCP Channel --> {}", message);
}
@Handler
public void receiveFromTCP(final Exchange exchange) {
final String messageFromTcp = exchange.getIn().getBody(String.class);
log.info("[Service] - Message Received from TCP Channel --> {}", messageFromTcp);
this.messageStore.add(messageFromTcp);
}
public List<String> getReceivedMessages() {
return messageStore;
}
}
在简历中,我需要在这个方法中加入一些代码,类似这样:
public void sendToTCP(final String message) {
log.info("[Service] - Sending Message over TCP Channel --> {}", message);
// Send message to producer here
camelContext.createProducerTemplate.send....
}
我无法创建到生产者的另一条路线,因为我不知道生产者 IP。我真的需要在生产者和我的应用程序之间使用已经建立的 TCP 通道。通信需要通过 TCP,其他工具,如队列,不是一个选项。
GitHub 示例项目
我在 GitHub 上上传了一个示例项目:https://github.com/rgiaviti/so-camel-netty4-tcp
画
我正在使用:
- Spring Boot 1.5.12;
- Apache Camel 2.21.0;
【问题讨论】:
-
我用 Vertx 解决了这个问题,而且代码比我期望用 Camel 解决的要多一点。但是,我真的很想知道如何用 Camel 处理这个问题。
-
有一个选项reuseChannel 可以在处理Exchange 的生命周期中重用同一个Netty Channel。在此处链接到文档 github.com/apache/camel/blob/master/components/camel-netty4/src/… 并在此处链接到示例 github.com/apache/camel/blob/master/components/camel-netty4/src/… 并链接到异步示例 github.com/apache/camel/blob/master/components/camel-netty4/src/…
-
感谢@VikramPalakurthi。我将尝试使用我的示例代码,然后返回结果。
标签: java spring-boot apache-camel netty