在本文中,我们将带你了解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
- android – TextView(getDrawingCache)中的位图始终为null
- android – 目标主机不能为null或在parameters.scheme = null,host = null中设置
- Apache Camel Route节点的消息载体Exchange
- Apache Camel 中的整数拆分列表
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
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中设置
我得到以下例外:
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
在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 lost1* 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 中的整数拆分列表?
它看起来很简单。
当他尝试将 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 中的整数拆分列表等更多相关知识的信息可以在本站进行查询。
本文标签: