Error de integración al ejecutar una integración de socket
Síntoma
Al ejecutar una integración de socket o usar una ubicación de red como tu directorio de escaneo, puedes encontrar un mensaje de error como este en los registros:
ERROR|Integration [connection name] failed to send message. Details: 'Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.'
Aplicable a
BarTender 2019 y versiones posteriores
Integration Builder
Solución
Para integraciones FTP, esto puede indicar que la conexión FTP fue rechazada temporalmente. Aumentar el tiempo de sondeo unos segundos suele solucionar este problema.
Para integraciones de Socket, un síntoma de este mensaje de error puede ser que se omita completamente la impresión de una etiqueta. En integraciones de socket muy ocupadas, este mensaje de error probablemente aparecerá en medio de una gran cantidad de solicitudes de socket o, a veces, cuando el socket está inactivo.
En integraciones con mucha actividad, el socket no siempre se cierra cuando está configurado en Puerto queda inactivo, por lo que las nuevas solicitudes básicamente se dirigen a un puerto que ya está abierto y pasan sin ser procesadas.
Para solucionar esto, necesitamos controlar cómo y cuándo BarTender abre y cierra el socket. En la sección Datos de entrada de tu integración, puedes forzar que la integración cierre el socket después de leer una determinada secuencia de caracteres.
Forzar el cierre del socket
La forma más sencilla de hacer esto es buscar la etiqueta de cierre en el BTXML y forzar el cierre del socket justo después. Este método se muestra en los pasos del tutorial Imprimir documento usando BTXML a través de un socket de red.
En la sección Datos de entrada de la integración, cambia la configuración de la siguiente manera:
Esto le indica a la integración que apague el socket justo después de recibir </XMLScript>. La casilla de verificación asegura que la etiqueta de cierre se conserve dentro de los datos de entrada para que el script BTXML se procese correctamente.
Terminar la conexión
En algunos casos, forzar el cierre del socket no es suficiente. La integración nunca cierra el socket o el flujo se termina demasiado rápido y los datos se cortan. Otros casos incluyen que el emisor espera una respuesta específica para cerrar el socket. En este caso, además de forzar que el flujo de datos termine después de una cierta secuencia de caracteres, puedes forzar el cierre de la conexión del lado de BarTender usando una acción de Enviar a socket de red.
Esta acción forzará una respuesta justo después de recibir los datos y luego terminará la conexión.