如何在运行时修改camel端点

时间:2016-08-18 16:42:39

标签: java xml spring spring-mvc apache-camel

问题

我有一个使用spring mvcapache camel应用程序。我对RouteBuilder类扮演的角色以及它实际初始化的方式感到困惑。我知道docs表示configure()方法是:

  

在初始化时调用以使用流畅的构建器语法构建路由。

但是这个初始化何时发生?它是在应用程序启动时发生还是在稍后使用该路由时发生?

这个问题的目的最终是问我如何在运行时修改路由。我希望能够根据需要建立不同的路线。

实施例

xml定义:

public class ServiceProviders2702FragmentHolder extends Fragment {

private static final String TAG = ServiceProviders2702FragmentHolder.class.getSimpleName();
private FrameLayout mFrameLayout;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_holder, container, false);

    initView(view);

    return view;
}

private void initView(View view) {

    mFrameLayout = (FrameLayout) view.findViewById(R.id.flFragmentHolder);

    Fragment serviceProviders = new ServiceProviders2702Fragment();
    Bundle args = new Bundle();
    args.putString(AppConstants.SENDING_ACTIVITY, "MainActivity");
    serviceProviders.setArguments(args);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.flFragmentHolder, serviceProviders).commit();

}

Route Builder模板:

mResources = mContext.getResources();
                String[] howTos = mResources.getStringArray(R.array.facebook);
                Fragment serviceProviders = new ServiceProvidersDetailFragment();
                Bundle args = new Bundle();
                args.putString("Service Provider", "Facebook");
                args.putStringArray("How-Tos", howTos);
                serviceProviders.setArguments(args);

                FragmentManager fragmentManager = ((EmergencyDisclosureGuideActivity) mContext).getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.replace(R.id.flFragmentHolder, serviceProviders).commit();

问题

  • configure()什么时候执行?
  • 如何动态设置端点网址?

3 个答案:

答案 0 :(得分:2)

您可以使用toD根据表达式在运行时动态更改端点。见the documentation

如果您想更改更多路线或添加全新路线,请查看CamelContext上的API。这个Stackoverflow question有一个添加全新路线的例子。

答案 1 :(得分:0)

Camel服务的生命周期记录在此处:https://camel.apache.org/lifecycle.html

  

Camel使用一个名为Service的简单生命周期接口,它有一个start()和stop()方法。   各种类实现了诸如CamelContext之类的Service以及许多Component和Endpoint类。   当您使用Camel时,您通常必须启动CamelContext,它将启动所有各种组件和端点并激活路由规则,直到再次停止上下文。

当上下文开始时,各种组件开始。不确定我理解动态网址部分。如果要指示动态端点(如果数据是this,则queue1 else queue2),您应该能够使用类似DynamicRouter EIP的内容,如此处所述(https://camel.apache.org/dynamic-router.html

答案 2 :(得分:-1)

您有几种选择。

  1. 将它们注入弹簧属性。
  2. 从外部属性源中注入它们。
  3. 从某种bean方法中注入它们。
  4. 然后,您可以将属性值放在标题中,然后将值放在.toD("$header.routeEndpoint")中。这可以处理动态端点。

    当然要重建您需要使用API​​的整个路线。