意外消息 - 与多个服务器通信时没有向连接拦截器注册端点

时间:2017-02-17 09:28:48

标签: spring sockets spring-integration tcplistener

#include <ESP8266WiFi.h>
#include <aREST.h>

// Create aREST instance
aREST rest = aREST();

// WiFi parameters
const char* ssid = "Protect Big Dragon 4";
const char* password = "18717772056";

// The port to listen for incoming TCP connections 
#define LISTEN_PORT           80

// Create an instance of the server
WiFiServer server(LISTEN_PORT);

void setup(void)
{  
 // Start Serial
  Serial.begin(115200);

 // Give name and ID to device
  rest.set_id("2");
  rest.set_name("lamp_control");

 // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());

}

void loop() {

  // Handle REST calls
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  while(!client.available()){
    delay(1);
  }
  rest.handle(client);

}

这是我的配置文件,我的应用程序尝试在启动后立即连接到2台服务器。 我已经为上面的2个服务器做了2个配置      GatewayAqrConfig1和GatewayConfig1类用于第一次服务器连接      GatewayAqrConfig2和GatewayConfig2类用于第二个服务器连接 使用事件我连接到服务器并发送连接设置消息,如果服务器已经启动并且如果我已经启动了我的应用程序,     它获取事件,连接并发送消息但我没有得到响应而是我收到警告如下

    @Configuration
@Component
public class GatewayAqrConfig {

    @Autowired
    ConnectorService connectorService;

    @Autowired
    MasterService masterService;

    private HashMap<ConnectorPK, GatewayAqr> connectorMap;

    @Bean
    @Scope(value = "prototype")
    public AbstractClientConnectionFactory clientCF(Connector connector , Master master) {
        TcpNetClientConnectionFactory clientConnectionFactory = new TcpNetClientConnectionFactory(connector.getAqrIpAddr(), connector.getAqrIpPortNo());
        clientConnectionFactory.setSingleUse(false);        
        MyByteArraySerializer obj = new MyByteArraySerializer(master.getAqrMsgHeaderLength(), master.getAqrId());
        clientConnectionFactory.setSerializer(obj);
        clientConnectionFactory.setDeserializer(obj);       
        clientConnectionFactory.setSoKeepAlive(true);
        TcpMessageMapper tcpMessageMapper = new TcpMessageMapper();
        tcpMessageMapper.setCharset("ISO-8859-1");
        clientConnectionFactory.setMapper(tcpMessageMapper);        
        clientConnectionFactory.setBeanName(connector.getAqrIpAddr() + ":" + connector.getAqrIpPortNo());               
        clientConnectionFactory.afterPropertiesSet();
        clientConnectionFactory.start();        
        return clientConnectionFactory;
    }

    @Bean
    @Scope(value = "prototype")
    public TcpSendingMessageHandler tcpOutGateway(AbstractClientConnectionFactory connectionFactory) {      
        TcpSendingMessageHandler messageHandler = new TcpSendingMessageHandler();
        messageHandler.setConnectionFactory(connectionFactory);     
        messageHandler.setClientMode(true);
        messageHandler.setTaskScheduler(getTaskScheduler());
        messageHandler.setStatsEnabled(true);
        messageHandler.afterPropertiesSet();
        messageHandler.start();     
        return messageHandler;
    }

    @Bean
    @Scope(value = "prototype")
    public TcpReceivingChannelAdapter tcpInGateway(AbstractClientConnectionFactory connectionFactory) {
        TcpReceivingChannelAdapter messageHandler = new TcpReceivingChannelAdapter();
        messageHandler.setConnectionFactory(connectionFactory);             
        messageHandler.setClientMode(true);
        messageHandler.setOutputChannel(receive());
        messageHandler.setAutoStartup(true);
        messageHandler.setTaskScheduler(getTaskScheduler());
        messageHandler.afterPropertiesSet();
        messageHandler.start();
        return messageHandler;
    }

    @Bean
    @Scope(value = "prototype")
    public TaskScheduler getTaskScheduler() {
        TaskScheduler ts = new ThreadPoolTaskScheduler();
        return ts;
    }

    @Bean
    public MessageChannel receive() {
        QueueChannel channel = new QueueChannel();      
        return channel;
    }

    @Bean(name = PollerMetadata.DEFAULT_POLLER)
    public PollerMetadata poller() { 
        return new PollerMetadata();
    }

    @Bean
    @Transactional
    public HashMap<ConnectorPK, GatewayAqr> gatewayAqr() throws Exception {
        connectorMap = new HashMap();
        Connector connector = null;
        ConnectorPK connectorPK = null;
        Master master = null;
        TcpConnectionSupport connectionSupport = null;

        // 1. Get List of Connections configured in Database
        List<Connector> connectors = connectorService.getConnections();

        if (connectors.size() > 0) {
            for (int i = 0; i < connectors.size(); i++) {

                // 2. Get the connection details
                connector = connectors.get(i);
                connectorPK = aqrConnector.getConnectorpk();
                master = masterService.findById(connectorPK.getAcuirerId());                

                try {
                    // 3. Create object of TcpNetClientConnectionFactory for each Acquirer connection
                    AbstractClientConnectionFactory clientConnectionFactory = clientCF(aqrConnector, aqrMaster);                    

                    // 4. Create TcpSendingMessageHandler for the Connection
                    TcpSendingMessageHandler outHandler = tcpOutGateway(clientConnectionFactory);                   

                    // 5. Create TcpReceivingChannelAdapter object for the Connection and assign it to receive channel
                    TcpReceivingChannelAdapter inHandler = tcpInGateway(clientConnectionFactory);

                    // 6. Generate the GatewayAqr object
                    GatewayAqr gatewayAqr = new GatewayAqr(clientConnectionFactory, outHandler, inHandler);

                    // 7. Put in the MAP acuirerPK and Send MessageHandler object
                    connectorMap.put(aqrConnectorPK, gatewayAquirer);                   
                } catch (Exception e) {
                }

            } // for
        } // if
        return connectorMap;
    }
}

*********************************************************************************************************************************
@EnableIntegration
@IntegrationComponentScan(basePackageClasses = {GatewayEventConfig.class,GatewayAqrConfig.class })
@Configuration
@ComponentScan(basePackages = {"com.iz.zw.gateway.impl", "com.iz.zw.configuration"})
@Import({GatewayEventConfig.class,GatewayAquirerConfig.class})
public class GatewayConfig {

    @Autowired
    private GatewayAsyncReply<Object, Message<?>> gatewayAsyncReply;

    @Autowired
    private GatewayCorrelationStrategy gatewayCorrelationStrategy;

    @Autowired
    private HashMap<ConnectorPK, GatewayAqr> gatewayAqrs;

    @Autowired
    ConnectorService connectorService;

    @Autowired
    GatewayResponseDeserializer gatewayResponseDeserializer;    

    @MessagingGateway(defaultRequestChannel = "send")
    public interface Gateway {
        void waitForResponse(TransactionMessage transaction);
    }

    @Bean
    public MessageChannel send() {
        DirectChannel channel = new DirectChannel();        
        return channel;
    }

    @Bean
    @ServiceActivator(inputChannel = "send")
    public BarrierMessageHandlerWithLateGoodResponse barrier() {
        BarrierMessageHandlerWithLateGoodResponse barrier = new BarrierMessageHandlerWithLateGoodResponse(25000, this.gatewayCorrelationStrategy);      
        barrier.setAsync(true);
        barrier.setOutputChannel(out());
        barrier.setDiscardChannel(lateGoodresponseChannel());
        return barrier;
    }

    @ServiceActivator(inputChannel = "out")
    public void printMessage(Message<?> message) {
        System.out.println("in out channel");
    }

    @Transformer(inputChannel = "receive", outputChannel = "process")
    public TransactionMessage convert(byte[] response) {    

        logger.debug("Response Received", Arrays.toString(response));
        TransactionMessage transactionMessage = gatewayResponseDeserializer.deserializeResponse(response);      
        System.out.println("Response : " + response);       
        return transactionMessage;
    }

    @ServiceActivator(inputChannel = "process")
    @Bean
    public MessageHandler releaser() {
        return new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                try {               
                    gatewayAsyncReply.put(message);             
                    barrier().trigger(message);
                } catch (GatewayLateGoodMessageException exception) {                   
                    System.out.println("Late good response..!");
                    gatewayAsyncReply.get(message);
                    lateGoodresponseChannel().send(message);
                }                               
            }
        };
    }   

    @Bean
    public MessageChannel process() {   
        QueueChannel channel = new QueueChannel();
        return channel;
    }

    @Bean
    public MessageChannel out() {
        DirectChannel channel = new DirectChannel();        
        return channel;
    }

    @Bean
    public MessageChannel lateGoodresponseChannel() {
        QueueChannel channel = new QueueChannel();
        return channel;
    }

    @ServiceActivator(inputChannel="lateGoodresponseChannel")
    public void handleLateGoodResponse(Message<?> message) {
        String strSTAN = null;
        String strResponse = null;
        Message<?> respMessage = null;

        if(message instanceof TransactionMessage){
            strSTAN = ((TransactionMessage)message).getStan();
            respMessage = gatewayAsyncReply.get(strSTAN);

            if (null != respMessage) {              
                strResponse = (String) message.getPayload();                
            }
        }               
        logger.info("Late Good Response: " + strResponse);      
    }
}

*********************************************************************************************************************************

@Configuration
public class GatewayEventConfig {

    private static final Logger logger = LoggerFactory.getLogger(GatewayEventConfig.class);

    @Bean
    public ApplicationEventListeningMessageProducer tcpEventListener() {
        ApplicationEventListeningMessageProducer producer = new ApplicationEventListeningMessageProducer();
        producer.setEventTypes(new Class[] {TcpConnectionOpenEvent.class, TcpConnectionCloseEvent.class, TcpConnectionExceptionEvent.class});
        producer.setOutputChannel(tcpEventChannel());
        producer.setAutoStartup(true);
        producer.setTaskScheduler(getEventTaskScheduler());
        producer.start();
        return producer;
    }

    @Bean
    public TaskScheduler getEventTaskScheduler() {
        TaskScheduler ts = new ThreadPoolTaskScheduler();
        return ts;
    }

    @Bean
    public MessageChannel tcpEventChannel() {
        return new QueueChannel();
    }

    @Transactional
    @ServiceActivator(inputChannel = "tcpEventChannel")
    public void tcpConnectionEvent(TcpConnectionEvent event) {

        System.out.println("In publishing" + event.toString());
        String strConnectionFactory = event.getConnectionFactoryName();

        if (strConnectionFactory.equals("connection1")) {            
                //send some message to connector            
        } else {
            // send message to another connector
        }
    }
}

但是,如果我首先启动我的应用程序,然后是服务器,我会得到完美的响应,因为我正在连接到服务器 我无法重启吗?我的应用程序应该连接到已经启动的服务器?可能是什么问题呢 ?

使用的版本:

Spring集成版本:4.3.1

春季版:4.3.2

JBOSS EAP 7上的JDK 1.8

1 个答案:

答案 0 :(得分:0)

该WARN消息意味着,在某种程度上,收到的入站消息没有在连接工厂注册TcpReceivingChannelAdapter。客户端模式应该没有区别。

稍微查看一下你的代码,只要你使用这些对象(特别是TcpMessageHandler而不是框架),原型bean应该没问题。

根据您的配置,对我来说这是不是很明显?在接收适配器上调用setConnectionFactory时,会注册侦听器。

如果您可以使用精简项目重现它并将其发布到某个地方,我会看看。