架构

使用交换模式注解

师成师成· 更新于 2026-09-28· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

使用 Exchange Pattern 注解

在使用 POJO Producer 时,调用 请求/应答(request/reply)模式的 InOut 方法通常是同步的。也就是说,调用方会阻塞,直到服务端返回结果。

InOut 表示输入对应一个 In 消息,输出/结果对应一个 Out 消息。

其他书籍、文章和参考指南可能会使用 In/Out 和 In/Only 来称呼这两种模式。本指南分别使用 InOut 和 InOnly,因为这是 Camel 内部使用的名称。

你还可以使用 InOnly 模式,基于 Apache Camel 实现对事件消息(Event Messages)的支持。这类消息通常被称为“发后即忘”(fire and forget),即发送一条 JMS 消息后不等待任何响应。

指定 InOnly 和 InOut 方法

通常,大多数用户需要的是 InOut 模式,但你也可以通过注解自定义使用 InOnly。例如:

public interface Foo {

  Object someInOutMethod(String input);
  String anotherInOutMethod(Cheese input);

  @InOnly
  void someInOnlyMethod(Document input);
}

上述代码展示了接口上的三个方法:

  • 前两个使用默认的 InOut 机制;
  • 第三个方法 someInOnlyMethod 使用 @InOnly 注解,将其指定为单向方法调用。

类级别注解

你也可以使用类级别注解,将接口中的所有方法默认设置为某种模式:

@InOnly
public interface Foo {
  void someInOnlyMethod(Document input);
  void anotherInOnlyMethod(String input);
}

Apache Camel 会检测基类或接口上的注解。例如,假设你为以下代码创建了一个客户端代理:

public class MyFoo implements Foo {
  ...
}

在这种情况下,从 Foo 继承的所有方法都会是 @InOnly。

覆盖类级别注解

你可以在特定方法上覆盖类级别的注解。假设你有一个类或接口,其中包含许多 @InOnly 方法,但你只想将其中一两个方法标注为 @InOut。可以这样做:

@InOnly
public interface Foo {
  void someInOnlyMethod(Document input);
  void anotherInOnlyMethod(String input);

  @InOut
  String someInOutMethod(String input);
}

在上面的 Foo 接口中,只有 someInOutMethod 会是 @InOut,其余方法都将是 @InOnly。

为交换模式使用自定义注解

你可能希望创建自己的注解来表示一组不同的元数据信息,例如将同步性、并发性和事务行为组合在一起。

在这种情况下,你可以用 @Pattern 注解来标注你的注解,并指定你希望使用的默认交换模式。

例如,假设我们想创建一个名为 @MyAsyncService 的自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
// specify the message pattern
@Pattern(ExchangePattern.InOnly)
public @interface MyAsyncService {
}

现在我们可以使用这个注解了,Camel 会自动推断出正确的交换模式。

public interface Foo {
  void someInOnlyMethod(Document input);
  void anotherInOnlyMethod(String input);

  @MyAsyncService
  String someInOutMethod(String input);
}

评论

登录后参与评论

正在加载评论…