2012-09-27 44 views
4

我想知道是否有可能创建一个能够接受请求并返回响应的弹簧集成框架的UDP服务器。与弹簧集成的UDP服务器

对于TCP有TCP网关,它允许请求/响应处理,但我没有看到类似的东西的UDP。

这很容易设置UDP监听器和接收数据包,但我看不到如何返回响应,因为我只能将它路由到预定义的输出通道。

此外,我没有看到发件人的IP和端口,因为变压器没有收到DatagramPacket对象,但只收到数据。

这里是我的配置:

<int:channel id="ChannelIn" /> 

<ip:udp-inbound-channel-adapter id="ChannelReceiver" 
    channel="ChannelIn" 
    port="5555" 
    multicast="false" 
    check-length="false" 
    pool-size="10" 
    /> 

<int:transformer 
    ref="datagramToPacketTransformer" 
    input-channel="ChannelIn" 
    output-channel="ChannelSA" 
    method="toPacket"/> 

<int:channel id="ChannelSA" /> 

<int:service-activator id="ChannelActivator" 
    input-channel="ChannelSA" 
    ref="PacketHandler" 
    method="process" 
/> 

回答

1

我两年前

https://jira.springsource.org/browse/INT-1809

开辟了新的功能,JIRA,但没有收到票,或观察者,所以我关闭了它。

随时添加评论,我们可以重新打开它。

发件人的IP是在邮件头,而不是他的口...

  message = MessageBuilder.withPayload(payload) 
        .setHeader(IpHeaders.HOSTNAME, hostName) 
        .setHeader(IpHeaders.IP_ADDRESS, hostAddress) 
        .build(); 

如果你想打开一个新的JIRA为,这是一个足够小的改变就可以进入2.2。即将推出的版本(但网关不会让2.2)。

https://jira.springsource.org/browse/INT

-1

谢谢你,加里!

我注意到远程IP地址在标题中,但远程端口不是这样,所以我做了一些修改来添加它。

我已经扩展了UnicastReceivingChannelAdapter来覆盖构建Message的asyncSendMessage。我也必须扩展DatagramPacketMessageMapper。如果我可以在UnicastReceivingChannelAdapter中注入我自己的DatagramPacketMessageMapper实现,那会更容易,但这是不可能的。

然后在春天的配置我已经删除了

<ip:udp-inbound-channel-adapter id="ChannelReceiver"...> 

定义,并添加以下

<bean id="udpInboundChannelAdapterBean" 
      class="me.spring.integration.udp.UnicastReceivingChannelAdapterExt" init-method="run"> 
      <constructor-arg name="port" value="5555" /> 
      <property name="poolSize" value="10"/> 
      <property name="lookupHost" value="false"/> 
      <property name="outputChannel" ref="ChannelIn" /> 

这似乎是工作,虽然我没有时间全面测试它。

我的想法是使用远程IP和端口以及来自udpInboundChannelAdapterBean的DatagramSocket引用来创建一个新的激活服务,该服务仅将响应写入套接字。

我会按照您的建议为远程端口打开一个新的jira。

+0

这里的JIRA;应该把它变成2.2 ... https://jira.springsource.org/browse/INT-2776 –

2

我发现了一种处理UDP的方式。下面是我的配置

<int-ip:udp-inbound-channel-adapter id="ChannelReceiver" 
            channel="serverBytes2StringChannel" 
            port="9000" 
            multicast="false" 
            check-length="false" 
            pool-size="10" 
            lookup-host="false" 
/> 

<int:transformer id="serverBytes2String" 
       input-channel="serverBytes2StringChannel" 
       output-channel="udpSA" 
       expression="new String(payload)" 

/> 

<int:service-activator input-channel="udpSA" 
         ref="deviceService" 
         method="udpMessage"/> 

而且deviceService豆有这样的代码:

public Message udpMessage(Message message) { 
     String response = "KO"; 
     try { 
      response = process(message); 
     } catch (Throwable th) { 
      //do something 
     } 
     Message msg = MessageBuilder.withPayload(response.getBytes()).copyHeaders(message.getHeaders()).build(); 
     sendReply(msg); 
     return null; 
    } 
    private void sendReply(Message message) { 
     try { 
      int port = (Integer) message.getHeaders().get("ip_port"); 
      String ip = (String) message.getHeaders().get("ip_address"); 
      InetAddress IPAddress = InetAddress.getByName(ip); 

      byte[] sentence = (byte[]) message.getPayload(); 
      byte[] sendData = new byte[sentence.length]; 
      byte[] receiveData = new byte[1024]; 
      sendData = sentence; 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
      DatagramSocket clientSocket = new DatagramSocket(); 
      clientSocket.send(sendPacket); 
      clientSocket.close(); 
     } catch (Exception ex) { 
      throw new RuntimeException("KO"); 
     } 
    } 

当我部署在亚马逊AWS这段代码就无法正常工作,这是我的个人电脑上却可以正常使用。我发现即使程序正在监听UDP 9000端口,但在服务器端没有收到通信。这可能是AWS设置的一个问题,尽管我已经允许该AWS实例的所有UDP端口。

如何使亚马逊AWS这项工作任何提示?