2

让我们有两个拦截器。输入拦截器 atPhase.RECEIVE和输出拦截器 atPhase.SETUP_ENDING

public class BeforeInterceptor extends AbstractPhaseInterceptor<Message> 
{
   public BeforeInterceptor()
   {
      super(Phase.RECEIVE);
   }  

public class AfterInterceptor extends AbstractPhaseInterceptor<Message> 
{
   public AfterInterceptor()
   {
      super(Phase.SETUP_ENDING);
   }  

现在我想知道:这两个阶段之间有多少时间?
我必须调用System.currentTimeMillis();BeforeInterceptor,将此值转换为AfterInterceptor,然后
System.currentTimeMillis() - valueFromBeforeInterceptor在拦截器之后调用。

但是我怎样才能将数据从一个拦截器传输到另一个拦截器呢?

4

1 回答 1

5

要在同一链中的两个拦截器(即两个“in”拦截器或两个“out”拦截器)之间传递数据,您可以在Message

// BeforeInterceptor
message.put("com.example.MyApp.startTime", System.currentTimeMillis());

// AfterInterceptor
long totalTime = System.currentTimeMillis() -
   (Long)message.get("com.example.MyApp.startTime");

如果一个拦截器在“in”链中,另一个在“out”链中,那么您可以将Exchange用于相同目的:

// BeforeInterceptor
inMessage.getExchange().put("com.example.MyApp.startTime", System.currentTimeMillis());

// AfterInterceptor
long totalTime = System.currentTimeMillis() -
   (Long)outMessage.getExchange().get("com.example.MyApp.startTime");

无论您使用哪个,最好选择您确定不会与任何其他拦截器发生冲突的键,例如使用 Java 包样式的分层名称。

于 2012-11-01T11:22:21.820 回答