Golang将消息发送到IBM MQ错误MQRC_CONNECTION_BROKEN



我现在正在与Golang合作,连接IBM Websphere MQ-ESB,我用来与MQ-ESB通信的库是

https://github.com/ibm-messaging/mq-golang
https://github.com/ibm-messaging/mq-golang-jms20

通常,它可以将消息发送到MQ-ESB,但当出现错误时,会出现错误MQ Connection Broken。这导致我的应用程序无法再向MQ-ESB发送消息。重新启动服务是解决此问题的方法(但这不是解决问题的方法(。有人有想法吗?感谢

这是代码创建mq连接

func NewIBMMQConnection(mqConnConfig *mqjms.ConnectionFactoryImpl) jms20subset.JMSContext {
if !viper.GetBool("mq.openconnection") {
return &mqjms.ContextImpl{}
}
logx.WithFields(logrus.Fields{
"queue manager": viper.GetString("mq.qManager"),
"host":          viper.GetString("mq.host"),
"port":          viper.GetInt("mq.port"),
"channel":       viper.GetString("mq.qChannel"),
}).Infof("[CONFIG] [MDM IBMMQ]")
conn, exception := mqConnConfig.CreateContext()
if exception != nil {
if exception.GetLinkedError() != nil {
logx.Fatalf("new mdm mq error: %s", exception.GetLinkedError())
}
}
return conn
}
func NewIBMMQConfig() *mqjms.ConnectionFactoryImpl {
return &mqjms.ConnectionFactoryImpl{
QMName:      viper.GetString("mq.qManager"),
Hostname:    viper.GetString("mq.host"),
PortNumber:  viper.GetInt("mq.port"),
ChannelName: viper.GetString("mq.qChannel"),
UserName:    viper.GetString("mq.login"),
Password:    viper.GetString("mq.pass"),
}
}

这是main.go中实例化连接的代码

func main() {
db := newGormDB()
defer closeDB(db)
mq := ibmmq.NewIBMMQConnection(ibmmq.NewIBMMQConfig())
defer mq.Close()
ibmmq := ibmmq.New(mq)
...
... 
go startServer()
shutdown()
}

这是代码生成消息

func (i *IBMMQ) ProduceMSGToMQ(ctx context.Context, msg string) error {
logx.WithContext(ctx).Infof("Producing Message queueName: message: %s", msg)
err := i.producer.SendString(i.queueCDDEMoeny, msg)
if err != nil {
logx.WithSeverityError(ctx).Errorf("Send msg to mq error: %s", err.GetErrorCode()+"-"+err.GetReason()+"-"+err.GetLinkedError().Error())
return errors.New("Send msg to mq error: " + err.GetErrorCode() + "-" + err.GetReason() + "-" + err.GetLinkedError().Error())
}
return nil
}

我不是Go语言专家,只是IBM MQ专家,但这里是(并非双关语!(。

我不知道你在哪里调用ProduceMSGToMQ函数,但我想是这样的:-

error := ibmmq.ProduceMSGToMQ(...)
if error != nil && (error.GetReason() == "MQRC_CONNECTION_BROKEN") {
mq := ibmmq.NewIBMMQConnection(ibmmq.NewIBMMQConfig())
}

希望这能有所帮助。

我们还必须重新启动服务以恢复MQ客户端上的连接。但在设置了重新连接选项后,问题得到了解决。

mqcno := ibmmq.NewMQCNO()
...
...
mqcno.Options = ibmmq.MQCNO_CLIENT_BINDING
mqcno.Options |= ibmmq.MQCNO_RECONNECT_Q_MGR

最新更新