架构
使用交换模式注解
登录后可跨设备保存划线和私人笔记登录
使用 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);
}评论
登录后参与评论
正在加载评论…
KnowForge