GVKun编程网logo

Apache Camel-拆分和聚合-旧Exchange始终为null

19

在本文中,我们将带你了解ApacheCamel-拆分和聚合-旧Exchange始终为null在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的android–TextView(getDraw

在本文中,我们将带你了解Apache Camel-拆分和聚合-旧Exchange始终为null在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的android – TextView(getDrawingCache)中的位图始终为null、android – 目标主机不能为null或在parameters.scheme = null,host = null中设置、Apache Camel Route节点的消息载体Exchange、Apache Camel 中的整数拆分列表

本文目录一览:

Apache Camel-拆分和聚合-旧Exchange始终为null

Apache Camel-拆分和聚合-旧Exchange始终为null

我看到这个问题已经被问过很多次了,但是没有一个帖子有帮助或最终的解决方案。我正在拆分一条消息,然后使用Aggregator2对其进行汇总。该代码引发异常,因为oldExchange始终为null。因此,为了测试,我设计了一个小代码。

我读了一个订单,xml文件,看起来像这样

<Orders xmlns="http://some/schema/Order">    <Order>            <orderNum>1</orderNum>    </Order>    <Order>            <orderNum>2</orderNum>    </Order>    <Order>            <orderNum>3</orderNum>    </Order>    <Order>            <orderNum>5</orderNum>    </Order>    <Order>            <orderNum>6</orderNum>    </Order>

我的骆驼上下文看起来像这样

<camel:route><camel:from uri="file:src/data/catask/test?noop=true"/><camel:log message="${body}"></camel:log><camel:split><camel:xpath>//te:Orders/*</camel:xpath><camel:to uri="direct:logQueries"/><camel:to uri="direct:aggegateQueries"/>  </camel:split></camel:route><camel:route><camel:from uri="direct:logQueries"/><camel:log message="After the call : \n ${body}"></camel:log>  </camel:route> <camel:route><camel:from uri="direct:aggegateQueries"/><camel:aggregate strategyRef="aggrTask" completionInterval="8000" ><camel:correlationExpression><camel:xpath>//te:Order</camel:xpath></camel:correlationExpression><camel:to uri="file:src/data/catask/output?fileName=output.xml"/></camel:aggregate></camel:route>

我的汇总策略课程如下所示

   public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {             if (oldExchange == null) {             System.out.println("Returning new exchange");                 return newExchange;             }            String oldBody = oldExchange.getIn().getBody(String.class);             String newBody = newExchange.getIn().getBody(String.class);             oldExchange.getIn().setBody(oldBody + "+" + newBody);             return oldExchange;         }

问题在于,将汇总结果保存在output.xml文件中时,它仅包含从Orders.xml中读取的最后一条记录。

<Order xmlns="http://some/schema/Order">            <orderNum>6</orderNum>    </Order>

我对其进行了进一步研究,发现这是因为在第一次调用oldExchange之后应该具有一些值,但事实证明它始终为null。我认为这是因为它是从单个文件读取所有内容并将其拆分,因此只有交换。

> 有什么建议吗?

更新1:
克劳斯,我只能使用Splitter解决此问题。我做到了,并且能够成功加入所有消息。但是我仍在寻找使用Aggregator2的方法。这是我仅使用Splitter的方法。

camel:route><camel:from uri="file:src/data/catask/test?noop=true"/><camel:log message="${body}"></camel:log><camel:split strategyRef="aggrTask"> <camel:xpath>//te:Orders/*</camel:xpath><camel:to uri="direct:logQueries"/> < </camel:split></camel:route><camel:route><camel:from uri="direct:logQueries"/><camel:log message="After the call : \n ${body}"></camel:log>  </camel:route>

答案1

小编典典

我想我已经弄清楚了如何使用Aggregator来聚合消息。我添加了一个名为id的headerName并将其用作相关ID。

<camel:route>  <camel:from uri="file:src/data/catask/test?noop=true"/>  <camel:log message="${body}"></camel:log>  <camel:split>    <camel:xpath>//te:Orders/*</camel:xpath>    <camel:to uri="direct:addHeaders"/>    <camel:to uri="direct:aggegateQueries"/>  </camel:split></camel:route><camel:route>  <camel:from uri="direct:addHeaders"/>  <camel:setHeader headerName="id">    <camel:constant>order</camel:constant>  </camel:setHeader></camel:route><camel:route>  <camel:from uri="direct:aggegateQueries"/>  <camel:aggregate strategyRef="aggrTask" completionInterval="8000" >    <camel:correlationExpression>      <simple>header.id</simple>    </camel:correlationExpression>    <camel:to uri="file:src/data/catask/output?fileName=output.xml"/>    <camel:log message="MERGED:: /n ${body}"></camel:log>  </camel:aggregate></camel:route>

这汇总了我的消息。但是我仍然不确定,尽管使用了正确的XPATH,但为什么骆驼认为它是不同类型的消息?

在骆驼论坛上复制CLAUS的解释:
“看起来像您的相关表达式,它是每条消息的新组,例如,每个xpath结果是不同的。如果要拆分和合并相同的消息,请参阅此eip http:// camel。
apache.org/composed-message-processor.html 并仅使用分割器查看示例。这样做更加容易。

我使用Xpath评估器工具测试了Xpath表达式,并打印出了相关表达式的结果,并且所有带有// Order的消息都是相同的。前

Group 1: <Order>    <orderNum>1</orderNum>  </Order>Group 2: <Order>    <orderNum>2</orderNum>  </Order>

android – TextView(getDrawingCache)中的位图始终为null

android – TextView(getDrawingCache)中的位图始终为null

我试图提取与显示的TextView实例关联的位图,但它总是返回一个空值.我究竟做错了什么?我应该使用textview.draw(canvas)吗?
TextView textview = (TextView) findViewById(R.id.text_title);
    textview.setDrawingCacheEnabled(true);
    textview.buildDrawingCache();        
    Bitmap bmp = textview.getDrawingCache();

解决方法

在获得绘图缓存之前执行此操作将解决问题

view.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));
view.layout(0,view.getMeasuredWidth(),view.getMeasuredHeight());

然后getDrawingCache()将返回一个位图并在画布上绘制该位图.

如果你在你的应用程序中使用位图,则更喜欢通过调用它们上的recycle()方法从内存中清除它们,以便从内存中清除位图以保证安全,避免outOfMemoryException

android – 目标主机不能为null或在parameters.scheme = null,host = null中设置

android – 目标主机不能为null或在parameters.scheme = null,host = null中设置

我得到以下例外:

    Target host must not be null or set in parameters.scheme=null,
host=null,path=/webservices/tempconvert.asmx/FahrenheitToCelsius

我的源代码:

public class Paractivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView t=new TextView(this);
        String encodedUrl = null;
      //  setContentView(R.layout.main);

                HttpClient client = new DefaultHttpClient();  
               //String query = "?Fahrenheit=26";
            //  String host = "www.w3schools.com/webservices/tempconvert.asmx/";
            //   encodedUrl = host + URLEncoder.encode(query,"utf-8");
            //  int p=(Integer) null;
              // URI uri = URIUtils.createURI("vv", "www.w3schools.com", 50, "/webservices/tempconvert.asmx", "?Fahrenheit=26", null);

                try{ 
               String postURL = "/webservices/tempconvert.asmx/FahrenheitToCelsius";
                HttpPost post = new HttpPost(postURL);
              // post.addHeader("scheme","vv");
               // post.setHeader("host", "www.w3schools.com");
                String PostData="36";
                StringEntity httpPostEntity = new StringEntity(PostData, HTTP.UTF_8);
                post.setEntity(httpPostEntity);
                post.setHeader("host", "www.w3schools.com");
                post.setHeader("Content-Length", new Integer(PostData.length()).toString());
                post.setHeader("Content-Type", "application/x-www-form-urlencoded");


                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
               // nameValuePairs.add(new BasicNameValuePair("host", "www.w3schools.com"));
                nameValuePairs.add(new BasicNameValuePair("Fahrenheit", "26"));
               post.setEntity(new UrlEncodedFormEntity(nameValuePairs));


               HttpResponse responsePOST = null;
                // Execute HTTP Post Request
               // HttpResponse response = httpclient.execute(post);
                client.getConnectionManager();



                   responsePOST = client.execute(post); 
                httpentity resEntity = responsePOST.getEntity();  
                String response=EntityUtils.toString(resEntity);
                response=response.trim();
              //  Log.i("RESPONSE=",response);
                t.setText("response"+response);
                setContentView(t);
        } catch (Exception e) {
            // Todo Auto-generated catch block
           //e.printstacktrace();
            t.setText("ex"+e.getMessage());
        setContentView(t);
        }
    }

}

我想在以下位置调用webservice:
http://www.w3schools.com/webservices/tempconvert.asmx?op=CelsiusToFahrenheit

使用HttpClient.How应该给主机和方案作为输入?

请帮忙…

解决方法:

这是您的主机错误
您在post.setHeader(“主持人”,“www.w3schools.com”)中传递“www.w3schools.com”;而你必须通过“http://www.w3schools.com”

您可以在here中引用相同的问题

Apache Camel Route节点的消息载体Exchange

Apache Camel Route节点的消息载体Exchange

在Camel的route中,消息在Route的各个节点中是以Exchange的形式传递的,所以对Exchange结构的理解对使用Camel来说是很重要的.
Exchange ID 如果不指定,Camel会默认设置一个,可以用来标识一个route的一次执行.
MEP message exchange pattern,有InOnly和InOut方式.
Exception 但route出异常的时候,抛出的异常赋值给这个变量(但在示例中似乎不是这样?).
In message 上一个节点传入的内容,是mandatory.的.
Out message 当MEP 是InOut的时候才用,不是mandatory.的.
Headers 键值对<String Object>,在下一个节点可以再取出来.
Attachments 在调用web service或者发邮件的时候放附件.
Body 消息内容,java对象.
Exchange的结构如下图所示:


Exchange可以直接作为参数在route用到的方法中使用,如果route中的方法不是Exchange,Camel会根据一套规则将Exchange中的Body转换成该方法的参数类型.

这个结构里的各部分内容可以像下面的代码示例的方式进行访问:

	from("file:d:/temp/inbox?delay=3000")
	.bean(new ExchangeManipulateBean(),"implicitConvert")
	.bean(new ExchangeManipulateBean(),"traverseExchange")
	.to("file:d:/temp/outbox");

public class ExchangeManipulateBean {
    private static Logger log = Logger.getLogger(ExchangeManipulateBean.class);
    public void implicitConvert(String msg){        
            log.debug("implicitConvert: " + msg);        
    }
    public void traverseExchange(Exchange exchange){
        log.debug("exchange.getExchangeId() " + exchange.getExchangeId());
        log.debug("exchange.getPattern() " + exchange.getPattern());
        log.debug("exchange.getException() " + exchange.getException());
        
        Map<String, Object> props = exchange.getProperties();
        for(String key:props.keySet()){
            log.debug("props: " + key + " " + props.get(key));
        }
        
        Message in = exchange.getIn();//in always null,but can be accessed without exception
        
        log.debug("exchange.getIn() " + in);
        log.debug("in.getMessageId() " + in.getMessageId() );
        log.debug("in.getClass().getName() " + in.getClass().getName());

        Map<String, Object> headers = in.getHeaders();
        for(String key:headers.keySet()){
            log.debug("headers: " + key + " " + headers.get(key));
        }
        
        Object body = in.getBody();
        log.debug("body " + body  + " " + body.getClass().getName());
        log.debug("in.getAttachmentNames() " + in.getAttachmentNames());
        //Message out = exchange.getOut();//whenever out is touched,information in headers are lost

1* implicitConvert 的方法接收的参数是String,Camel会在运行的时候根据一定的规则将"In Message"的Body转换成String,这里是将文件的内容转成String,这是由Camel内部的TypeConverter完成的.
2* exchange.getException()不能得到Exception,需要通过这样的方式: Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
3* exchange.getOut()被调用后,还需要将 "In Message"的header里的内容在copy到 "Out message"中去.通常都绕过out往下一个节点传值,可以用这种方式:exchange.getIn().setBody("$contents"),
在下一个节点仍然可以得到内容,同时前面节点set在header中的内容也存在.
4*本人用的是Camel 2.7.5,不知道后续的版本会不会把这些"pitfall"给填上.



原文链接: http://blog.csdn.net/kkdelta/article/details/7432867

Apache Camel 中的整数拆分列表

Apache Camel 中的整数拆分列表

如何解决Apache Camel 中的整数拆分列表?

它看起来很简单。

当他尝试将 list<Integer> 拆分为 Byte 时,如何拆分 apache 骆驼中的整数列表而不会让骆驼抱怨!

代码如下:

....
.transform().message(this::doSomeProcessing)      // doSomeProcessing returns List<Integer>
.filter(simple("${body.size} != 0"))
.split(body())
.to(someRabbitMQExchange())
....

这里有一个例外:

Caused by: java.lang.IllegalArgumentException: Could not convert number [9901400] of type [java.lang.Integer] to target class [java.lang.Byte]: overflow

解决方法

问题出在 rabbitmq 端点,需要先将消息转换为 json

所以,我只是在 .marshal().json() 之前添加了 .to(someRabbitMQExchange()),它解决了这个问题。

,

尝试评论 o 避免过滤器,运行 de app 并再次验证,告诉我稍后会发生这种情况。

今天关于Apache Camel-拆分和聚合-旧Exchange始终为null的介绍到此结束,谢谢您的阅读,有关android – TextView(getDrawingCache)中的位图始终为null、android – 目标主机不能为null或在parameters.scheme = null,host = null中设置、Apache Camel Route节点的消息载体Exchange、Apache Camel 中的整数拆分列表等更多相关知识的信息可以在本站进行查询。

本文标签: