我现在正在与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