10

我是否尝试在换行符上拆分消息并使用以下脚本:

    def mesType = "";
def lines = message.getPayload().split("\n");

if ( lines[0][0..6] == '123456' ||  lines[1][0..6] == '123456') {
    mesType = "MES1";
}

if ( lines[0][0..7] == '654321' ||  lines[1][0..7] == '654321') {
    mesType = "MES2";
}

if ( lines[0][0..7] == '234561' ||  lines[1][0..7] == '234561') {
    mesType = "MES3";
}

message.setProperty('mesType', mesType);

return message.getPayload();

但是当我使用它时,我的日志文件中出现以下错误:

groovy.lang.MissingMethodException: No signature of method: [B.split() is applicable for argument types: (java.lang.String) values: {"\n"} (javax.script.ScriptException)

当我将分割线更改为以下内容时:

def lines = message.getPayload().toString().split("\n");

我收到一个错误,指出数组是 OutOfBound,所以看起来它仍然没有对换行符做任何事情。

( message.getPayload) 中的消息是来自文件系统的消息,并且确实包含换行符。它看起来像这样:

ABCDFERGDSFF
123456SDFDSFDSFDSF
JGHJGHFHFH

我究竟做错了什么?使用 Mule 2.X 收集消息

4

2 回答 2

15

看起来像message.payload返回一个byte[]你需要回到一个字符串:

def lines = new String( message.payload, 'UTF-8' ).split( '\n' )

应该得到它:-)

另外,我更喜欢这样写:

def mesType = new String( message.payload, 'US-ASCII' ).split( '\n' ).take( 2 ).with { lines ->
    switch( lines ) {
        case { it.any { line -> line.startsWith( '123456' ) } } : 'MES1' ; break
        case { it.any { line -> line.startsWith( '654321' ) } } : 'MES2' ; break
        case { it.any { line -> line.startsWith( '234561' ) } } : 'MES3' ; break
        default :
          ''
    }
}

而不是大量if...else具有范围字符串访问的块(即:如果你得到一行只有 3 个字符的行,或者有效负载中只有 1 行,你的将失败)

使用 Groovy1.5.6时,您会遇到:

def mesType = new String( message.payload, 'US-ASCII' ).split( '\n' )[ 0..1 ].with { lines ->

并保持手指交叉,有效载荷中至少有 2 行

或者您将需要引入一种方法来从数组中获取最多 2 个元素

你能试一下吗:

可能是with1.5.6 中的中断(不确定)...尝试将其展开回原来的状态:

def lines = new String( message.payload, 'US-ASCII' ).split( '\n' )[ 0..1 ]
def mesType = 'empty'
if(      lines.any { line -> line.startsWith( '123456' ) } ) mesType = 'MES1'
else if( lines.any { line -> line.startsWith( '654321' ) } ) mesType = 'MES2'
else if( lines.any { line -> line.startsWith( '234561' ) } ) mesType = 'MES3'
于 2013-09-19T14:59:26.223 回答
3
def lines = "${message.getPayload()}".split('\n');

这种方法也应该有效

于 2018-03-21T15:37:40.283 回答