小编ber*_*auz的帖子

使用CoD over Camel JMS组件实现本机websphere MQ

我在使用Apache CAMEL实现Websphere MQ(WMQ)连接器时遇到了很多困难,该连接器可以无异常地处理MQ确认传递(CoD)报告,也不会以不需要的响应数据报的形式出现副作用.最后,我按照我想要的方式工作,如果您习惯于编写本机MQ客户端,那么这是一种非常标准和通用的方式.我在同一主题的帖子中记录了该方法,但我发现解决方案臃肿而复杂,并且非常感谢任何建议或示例,以使实现更清晰,更优雅.

我理解这个问题的根源在于MQ设计请求 - 回复消息交换模式(MEP)的方式,而不是JMS规范的方式,而不是其JMS组件中的请求 - 应答MEP的CAMEL实现.三种不同的哲学!

  1. WMQ具有MessageType标头(请参阅MQMD字段常量),其中请求值为1,回复为2,数据报为8(单向MEP).此外,值4用于以CoD(交付配置),PAN(肯定确认)和NAN(否定确认)的形式标记报告消息,其中 - 在消息流方面 - 也进行额外的回复信息.可以使用另一个名为"Report"的标题字段为Request消息,回复或数据报请求CoD,PAN和NAN ack,其中可以组合所有报告变体的标志.其他标头字段'ReplyToQ'和'ReplyToQMgr'指定原始发件人期望报告和回复的队列和队列管理器,以及固定的24字节'CorrelId'字段 - 可选 - 可以帮助将报告和回复与原始数据报或请求消息相关联.为了使其更复杂,实际上可以使用相同的原始消息ID和没有CorrelID发回回复和报告,或者在CorrelId中提供原始消息ID,或者在原始请求或数据报中已经指定时返回CorrelId值.IBM 通过WMQ提供JMS API,允许通过WMQ将纯JMS交换作为传输(在额外消息头名称MQRFH2的帮助下),或将本机MQ消息映射到JMS消息,反之亦然.
  2. 另一方面,JMS规范提供了一个可选的'JMSReplyTo'头字段和一个'JMSCorrelationID',但是确实将MEP语义保留给客户端应用程序; 即在规格中陈述:" 答复可能是可选的;由客户自行决定. "
  3. CAMEL以XML或Java DSL中的"路由"和内部Exchange对象模型为特征,目的是支持EIP模式,其中包括Request-Reply模式.然后CAMEL在其JMS组件中假定如果设置了JMSReplyTo字段,则这必然是期望回复的请求,导致Exchange的Out部分(或者如果Out为空,则部分修改)返回到JMSReplyTo中定义的队列. .

我愿意通过远程Websphere队列管理器支持本地MQ消息与交付确认(CoD)报告的交换,这样除了事务和持久性(即没有丢失,没有重复)之外,我还可以跟踪消息何时被消费并在发生延误时提出警报.

入境问题:

默认情况下,Websphere队列管理器在队列中的消息消耗完成时生成CoD报告.因此,在没有任何特定设置的情况下,当CAMEL端点消耗消息时,远程MQ客户端发送带有CoD标志的数据报(以及当时强制的ReplyToQ)将从队列管理器获得第一个回复作为MQ报告,然后是第二个(意外的)回复消息由CAMEL显式返回并包含CAMEL路由末尾的Exchange对象中剩余的内容,因为CAMEL假定存在JMSReplyTo字段的请求 - 应答EIP(从MQ ReplyToQ和ReplyToQMgr映射)被要求支持CoD回流).

出境问题:

如果没有特定设置,CAMEL默认也会在出站连接上采用请求 - 回复EIP/MEP.然后,CAMEL JMS/MQ端点将等待1个响应.当OUTbound消息是MQ上的JMS(因此具有MQRFH2头)时,这可以正常工作.当强制普通的vanilla MQ,即删除下面的MQRFH2头时,我无法使端点侦听器与相关的传入MQ报告匹配,尽管跟踪值看起来都是正确的(强制执行24个char相关ID以便截断更长的CorrelId值或空填充通过MQ无法对相关过滤器进行地理化处理).有没有人能够解决这个问题?

详细信息:虽然IBM JMS API接受传递特定的JMS属性值WMQ_MESSAGE_BODY = {1 | 0}/WMQ_TARGET_CLIENT = {1 | 0}来控制生成的消息中是否存在JMS头MQRFH2,但这些选项通过CAMEL变得不可用.必须使用CamelJmsDestinationName标头(如CAMEL JMS …

jms apache-camel ibm-mq

8
推荐指数
1
解决办法
3325
查看次数

Spring数据Cassandra 2.0 Select BLOB列返回不正确的ByteBuffer数据

上下文:Spring数据cassandra官方1.0.2.RELEASE来自Maven Central repo,CQL3,cassandra 2.0,datastax driver 2.0.4

背景:cassandra blob数据类型映射到Java ByteBuffer.

下面的示例代码演示了您不会使用等效插入旁边的select来检索正确的字节.实际检索的数据以许多垃圾字节为前缀,实际上看起来像是整行的序列化.这篇与Cassandra 1.2相关的老帖子提示我们可能必须从长度为ByteBuffer.remaining()的ByteBuffer.arrayOffset()开始,但是arrayOffset值实际上是0.

我发现了一个spring-data-cassandra 2.0.0.SNAPSHOT但CassandraOperations API有很大的不同,它的包名也是:org.springdata ...与org.springframework ...

帮助解决这个问题,但非常欢迎.

与此同时,我似乎必须将Base64的二进制数据编码/解码到文本数据类型列.

---这里是我使用的简单表CQL元数据-------------

CREATE TABLE person (
  id text,
  age int,
  name text,
  pict blob,
  PRIMARY KEY (id)
) ;
Run Code Online (Sandbox Code Playgroud)

---跟随映射到CQL表的简单数据对象---

package org.spring.cassandra.example; 

import java.nio.ByteBuffer;
import org.springframework.data.cassandra.mapping.PrimaryKey; 
import org.springframework.data.cassandra.mapping.Table; 

@Table 
public class Person { 

 @PrimaryKey 
 private String id; 

 private int age; 
 private String name; 
 private ByteBuffer pict; 

 public Person(String id, int age, String name, ByteBuffer pict) { 
  this.id = id; this.name = …
Run Code Online (Sandbox Code Playgroud)

bytebuffer blob cassandra spring-data-cassandra

6
推荐指数
2
解决办法
6367
查看次数